光标方向openGL C



我希望我的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:将学位作为参数的功能被弃用(使用弧度时)

最新更新