c++ - 光标方向 openGL C++

标签 c++ opengl matrix rotation glm-math

我希望我的 2D Sprite 能够旋转,同时始终面向我的光标。

我使用 happy、SDL2 和 glm 进行数学计算。

我尝试的“原始”方法是计算我的 Front 和所需的对象 LookAt vector 之间的角度,并将该角度(以度为单位)放入 glm::rotate 矩阵中。 由于某种奇怪的原因,这并没有成功。 另一种方法是在一个 quat 中完成此操作并将该 quat 应用于我的模型矩阵,这也没有帮助。

我的对象的渲染中心位于原点 (0,0,0) - 因此旋转不需要进行平移。

我画了 2 个三角形来制作一个矩形,在上面加载纹理。

理论上我的模型矩阵是这样的:

model = rotate * scale;

然后我将其插入着色器(其中 Position 是我的 vec3 顶点)

position = projection * view * model * vec4(Position, 1.0f);

第一个奇怪的事情是,如果我将 90.0f 作为角度硬编码到 glm::rotate 中,我的对象实际上顺时针旋转了大约 120°。 如果我插入 80°,它实际上会顺时针旋转约 250°。 如果我插入 45°,那就是完美的 45° 顺时针旋转。 所有旋转均围绕 z 轴,例如:

model = glm::rotate(model, 90.0f, glm::vec3(0.0f,0.0f,1.0f);

如果我使用四元数来模拟方向,它会给出 0,2&0,9 弧度之间的角度,并且无论我将光标放在哪里,我的对象似乎只会顺时针旋转 0.0° 和 45° 之间。

如果我计算一下角度。我的两个 vector (ObjectLookAt 和 MousePosition)并存储它们我也得到了非常正确的角度,但是 glm::rotate 函数无法按我的预期工作。

最后,如果我简单地将角度编码为:

float angle = static_cast<float>(SDL_GetTicks()/1000);

从 1 开始,它的旋转实际上更加奇怪。 我希望它开始以 1° 速率(因为它从 1 秒开始),然后绕 z 轴旋转一整圈,直到 360 秒结束。 然而,它在大约 6 秒内旋转完整 360°。那么在角度上添加“1”并插入到 glm::rotate 中作为度数表示 60° 吗?

这是我的逻辑缺陷吗?如果在 x-y 平面上绘制 Sprite ,我是否不会绕 z 轴旋转 Sprite ? 为了安全起见,我还尝试了 x 和 y 轴,但这不起作用。 我真的被困在这里,我(想我)知道它在理论上应该如何工作,特别是因为这一切都发生在“2D”中,但我无法让它工作..

最佳答案

The first strange thing is, if I hardcode 90.0f as an angle into glm::rotate, my object is actually rotated about 120° clockwise. If I plug in 80° it actually rotates about ~250° clockwise. If I plug in 45° it's a perfect 45° clockwise rotation.

这是因为函数 glm::rotate期望以弧度表示的角度(自 GLM 版本 0.9.6 起)。

像这样调整你的代码:

model = glm::rotate(model, glm::radians(angel_degrees), glm::vec3(0.0f,0.0f,1.0f);

另请参阅:

关于c++ - 光标方向 openGL C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46254485/

相关文章:

c++ - 使用无屏幕创建 OpenGL 上下文

java - 如何将 OpenGL 上下文放入我当前的线程中,未找到 opengl 上下文

c - int 矩阵中的段错误

Windows 和 Linux 上动态库的 C++ 标准

C++:调用 OBJ、OBJ&、const OBJ& 时实现不同的方法

opengl - gluLookat 在免费相机的情况下

matlab - 如何在Matlab中使用系统矩阵获得多输入多输出系统的传递函数

matrix - 使用 Julia 中的理解创建矩阵

c++ - 我的简单游戏的计时器非常不... C++

c++ - 将静态库链接到共享库并隐藏导出的符号