在OpenGL atan2中的图像旋转
本文关键字:图像 旋转 OpenGL atan2 | 更新日期: 2023-09-27 18:17:00
有什么帮助吗?我在c#中使用OpenGL。除了:
我不能使用其他库using System;
using OpenGL;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Drawing;
我似乎不能旋转我的图像,使它面对它的移动方式。
这在我的世界绘制方法中被调用:
foreach (Bug bug in m_Bugs)
{
double radians = Math.Atan2(bug.getPos().X + bug.getVel().X, bug.getPos().Y + bug.getVel().Y);
double angle = radians * (180 / Math.PI);
GL.glRotated(angle, 0, 0, 1);
bug.Draw();
}
和我的draw方法在主线程中被调用:
form.RegisterDraw(myWorld.Draw);
我的错误。Draw工作完美,它显示和混合纹理精细。
在我的世界里foreach循环中的代码。draw方法返回速度(getVel)和位置(getPos)作为2d向量。
任何帮助都将不胜感激,谢谢。
private void Load(uint[] array, int index, string filepath)
{
Bitmap image = new Bitmap(filepath);
image.RotateFlip(RotateFlipType.RotateNoneFlipY);
System.Drawing.Imaging.BitmapData bitmapdata;
Rectangle rect = new Rectangle(0, 0, image.Width, image.Height);
bitmapdata = image.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
/* Set the correct ID, then load the texture for that ID * from RAM onto the Graphics card */
GL.glBindTexture(GL.GL_TEXTURE_2D, array[index]);
GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, (int)GL.GL_RGB8, image.Width, image.Height, 0, GL.GL_BGR_EXT, GL.GL_UNSIGNED_byte, bitmapdata.Scan0);
GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, (int)GL.GL_LINEAR);
GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, (int)GL.GL_LINEAR);
/* This code releases the data that we loaded to RAM * but the texture is still on the Graphics Card */
image.UnlockBits(bitmapdata);
image.Dispose();
}
为什么是Pos + Vel ?
看起来你只需要po . So:
Math.Atan2( bug.getVel().X, bug.getVel().Y);
我已经在https://stackoverflow.com/a/7288931/524368逐字引用回答了这个问题:
假设你的物体向D方向移动,那么你所需要做的就是找到一个垂直于这个方向的向量。如果你的运动只在一个平面上你可以通过D与平面法向n的叉乘来求出这个向量E
E = D × N
这就产生了3个向量D, E和n。在归一化之后,它们形成了旋转坐标系的基底。您可以将它们放入3×3矩阵
的列中。D_x E_x N_x
D_y E_y N_y
D_z E_z N_z
将此矩阵扩展为4×4齐次矩阵
D_x E_x N_x 0
D_y E_y N_y 0
D_z E_z N_z 0
0 0 0 1
,你可以通过glMultMatrix传递给OpenGL,将其应用于矩阵堆栈。