我希望我的 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/