游标方向openGL c ++

时间:2017-09-16 13:35:46

标签: c++ opengl rotation glm-math

我希望我的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”中,但我无法让它发挥作用..

1 个答案:

答案 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);

另见: