游标方向 openGL c++
cursor orientation openGL c++
我希望我的 2D 精灵始终面向我的光标旋转。
我正在使用 glad、SDL2 和 glm 进行数学运算。
我尝试的 "original" 方法是计算我的 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° 和 45° 之间。
如果我顺便计算一下角度。我的两个向量(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 和 y 轴,但这没有用。
我真的被困在这里,我(想我)明白它在理论上应该如何工作,尤其是当这一切都发生在“2D”中时,但我无法让它工作..
The first strange thing is, if I hardcode 90.0f as an angle into glm::rotate, my object is actually rotated about 120° clockwise. If I plug in 80° it actually rotates about ~250° clockwise. If I plug in 45° it's a perfect 45° clockwise rotation.
这是因为函数 glm::rotate
需要以弧度表示的角度(自 GLM 版本 0.9.6 起)。
像这样调整您的代码:
model = glm::rotate(model, glm::radians(angel_degrees), glm::vec3(0.0f,0.0f,1.0f);
另见:
- glm rotate usage in Opengl
- GLM: function taking degrees as a parameter is deprecated (WHEN USING RADIANS)
我希望我的 2D 精灵始终面向我的光标旋转。
我正在使用 glad、SDL2 和 glm 进行数学运算。
我尝试的 "original" 方法是计算我的 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° 和 45° 之间。
如果我顺便计算一下角度。我的两个向量(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 和 y 轴,但这没有用。 我真的被困在这里,我(想我)明白它在理论上应该如何工作,尤其是当这一切都发生在“2D”中时,但我无法让它工作..
The first strange thing is, if I hardcode 90.0f as an angle into glm::rotate, my object is actually rotated about 120° clockwise. If I plug in 80° it actually rotates about ~250° clockwise. If I plug in 45° it's a perfect 45° clockwise rotation.
这是因为函数 glm::rotate
需要以弧度表示的角度(自 GLM 版本 0.9.6 起)。
像这样调整您的代码:
model = glm::rotate(model, glm::radians(angel_degrees), glm::vec3(0.0f,0.0f,1.0f);
另见:
- glm rotate usage in Opengl
- GLM: function taking degrees as a parameter is deprecated (WHEN USING RADIANS)