我希望我的2D精灵旋转,同时始终面向我的光标。
我很高兴,SDL2& glm为数学。
我尝试的“原始”方式是计算我的Front和我想要的LookAt矢量之间的角度,并将该角度以度为单位放入glm::rotate
矩阵。
由于一些奇怪的原因,这没有用。
另一种方法是在quat中进行,然后将quat应用到我的模型矩阵中,这也没有帮助。
我的对象以其中心位于原点(0,0,0)进行渲染 - 因此不需要为旋转进行平移。
我绘制了2个三角形,以制作一个矩形,在其上加载纹理。
我的模型矩阵在理论上看起来像那样:
model = rotate * scale;
然后我将其插入着色器(位置是我的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°和0°之间旋转。顺时针45°,无论我把光标放在哪里。
如果我计算角度btw。我的两个向量(ObjectLookAt& MousePosition)并存储它们我也得到了相当正确的角度,但glm :: rotate函数不能像我预期的那样工作。
最后,如果我只是将角度编码为:
float angle = static_cast<float>(SDL_GetTicks()/1000);
从一开始,它实际上旋转甚至更奇怪。
我希望它开始率1°(因为它从1秒开始),然后围绕z轴旋转一整圈,直到360秒结束。
然而,它在大约6秒内旋转360°。所以在角度上添加“1”并插入glm::rotate
,因为度数代表60°?
这现在是我逻辑上的一个缺陷吗?如果在x-y平面上绘制精灵,是否不绕z轴旋转精灵? 我也试过x&amp; y轴只是在这里安全,但是没有用。 我真的被困在这里,我(我想)得到它应该如何在理论上起作用,特别是因为它都发生在“2D”中,但我无法让它发挥作用..
答案 0 :(得分:2)
第一个奇怪的是,如果我将90.0f硬编码为glm :: rotate的角度,我的物体实际上是顺时针旋转约120°。如果我插入80°,它实际上顺时针旋转约250°。如果我插入45°,则顺时针旋转45°。
这是因为函数glm::rotate
期望弧度的角度(因为GLM版本0.9.6)。
像这样调整你的代码:
model = glm::rotate(model, glm::radians(angel_degrees), glm::vec3(0.0f,0.0f,1.0f);
另见: