Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 光标方向openglc++;_C++_Opengl_Matrix_Rotation_Glm Math - Fatal编程技术网

C++ 光标方向openglc++;

C++ 光标方向openglc++;,c++,opengl,matrix,rotation,glm-math,C++,Opengl,Matrix,Rotation,Glm Math,我希望我的2D精灵始终朝向光标旋转 我使用GLADY、SDL2和glm进行数学运算 我尝试的“原始”方法是计算我的前面和我想要的对象注视向量之间的角度,并将该角度以度为单位放入glm::rotate矩阵中。 由于某种奇怪的原因,这一切都没有实现。 另一种方法是在一个quat中执行,并将quat应用于我的模型矩阵,这也没有帮助 我的对象以原点(0,0,0)为中心进行渲染-因此旋转不需要进行平移 我画了两个三角形来制作一个矩形,在上面加载纹理 我的模型矩阵理论上是这样的: model = rotat

我希望我的2D精灵始终朝向光标旋转

我使用GLADY、SDL2和glm进行数学运算

我尝试的“原始”方法是计算我的前面和我想要的对象注视向量之间的角度,并将该角度以度为单位放入
glm::rotate
矩阵中。 由于某种奇怪的原因,这一切都没有实现。 另一种方法是在一个quat中执行,并将quat应用于我的模型矩阵,这也没有帮助

我的对象以原点(0,0,0)为中心进行渲染-因此旋转不需要进行平移

我画了两个三角形来制作一个矩形,在上面加载纹理

我的模型矩阵理论上是这样的:

model = rotate * scale;
然后将其插入着色器(其中位置是我的
vec3
顶点)

第一件奇怪的事情是,如果我将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°之间顺时针旋转

顺便说一句,如果我计算两个向量(ObjectLookAt和MousePosition)的角度并存储它们,我也会得到非常正确的角度,但是glm::rotate函数并没有像我预期的那样工作

最后,如果我简单地将角度编码为:

float angle = static_cast<float>(SDL_GetTicks()/1000);
float angle=static\u cast(SDL\u GetTicks()/1000);
从一开始,它的旋转更奇怪。 我希望它开始以1°的速度旋转(因为它以1秒开始),然后围绕z轴旋转一整圈,直到360秒结束。 然而,它在大约6秒内旋转360°。因此,是否曾经在角度上添加“1”并插入
glm::rotate
,作为度表示60°

这是我逻辑上的一个缺陷吗?如果精灵绘制在x-y平面上,是否不绕z轴旋转? 为了安全起见,我也试过x&y轴,但没用。 我真的被困在这里了,我(想我)从理论上理解了它应该如何工作,尤其是当它发生在“2D”中时,但我无法让它工作

第一件奇怪的事情是,如果我硬编码90.0f作为glm::rotate的角度,我的对象实际上是顺时针旋转120°。如果我插入80°,它实际上会顺时针旋转约250°。如果我插入45°,这是一个完美的顺时针旋转45°

这是因为函数需要以弧度为单位的角度(自GLM版本0.9.6起)

调整您的代码,如下所示:

model = glm::rotate(model, glm::radians(angel_degrees), glm::vec3(0.0f,0.0f,1.0f);
另见:


非常感谢,特别是您的快速回复!这样更好,奇怪的是,在[文档]中说,角度应该以度为单位。。剩下的应该是我现在在做数学。。
model = glm::rotate(model, glm::radians(angel_degrees), glm::vec3(0.0f,0.0f,1.0f);