我希望我的2D精灵在始终面对光标的同时旋转。
我正在使用Glad,SDL2&GLM用于数学。
我尝试使用的"原始"方式是计算对象的前部和所需的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°&amp之间旋转。顺时针45°,无论我在哪里放置光标。
如果我计算角度btw。我的两个矢量(objectookat&鼠标)并存储它们,我得到的角度也很正确,但是glm ::旋转函数无法正常工作。
最后,如果我简单地将角度编码为:
float angle = static_cast<float>(SDL_GetTicks()/1000);
从一个开始,它实际上旋转了更奇怪。我希望它会开始速度1°(从1秒开始),然后在Z轴上旋转一个圆圈,直到360秒以上。但是,它在大约6秒内旋转360°。因此,曾经在角度上添加并插入glm::rotate
的" 1"代表60°?
现在这是我的逻辑中的缺陷吗?如果在X-y平面上绘制Z轴,我是否不会在Z轴上旋转?我也尝试了X&amp;Y轴只是为了安全起见,但这无效。我真的被困在这里,我(认为我)理论上应该如何工作,尤其是因为所有这些都发生在" 2d"中,但我无法正常工作。
第一个奇怪的事情是,如果我将90.0F作为GLM ::旋转的角度,那么我的对象实际上是顺时针旋转的。如果我插入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);
另请参见:
- GLM旋转OpenGL
- glm ::旋转似乎会导致旋转错误?
- glm:将学位作为参数的功能被弃用(使用弧度时)