我有一个关于使用四元数旋转图形对象的问题。
我有一个Transform
类,它具有以下构造函数和默认参数:
Transform(const glm::vec3& pos = glm::vec3(0.0), const glm::quat& rot = glm::quat(1.0, 0.0, 0.0, 0.0),
const glm::vec3& scale = glm::vec3(1.0))
{
m_pos = pos;
m_rot = rot;
m_scale = scale;
}
在我的Transform
类中,按如下方式计算MVP
:
glm::mat4 Transform::GetModelMatrix() const
{
glm::mat4 translate = glm::translate(glm::mat4(1.0), m_pos);
glm::mat4 rotate = glm::mat4_cast(m_rot);
glm::mat4 scale = glm::scale(glm::mat4(1.0), m_scale);
return translate * rotate * scale;
}
我面临的问题是,当我使用const glm::quat& rot = glm::quat(1.0, 0.0, 0.0, 0.0)
时,我的对象在屏幕上看起来是正常的。下面的图片显示了它:
但是,如果我尝试使用const glm::quat& rot = glm::quat(glm::radians(90.0f), 0.0, 1.0, 0.0)
(在y轴上旋转90度),我的对象看起来就好像它已经被缩放了一样。下面的图片显示了它:
当我试图旋转它时,我不知道是什么导致它变成这样的。我错过了什么重要的事情吗?
如果它与此相关,下面是我如何计算视图矩阵的方法:
glm::mat4 Camera::GetView() const
{
glm::mat4 view = glm::lookAt(m_pos, m_pos + m_forward, m_up);
return view;
}
发布于 2015-02-14 12:38:13
glm::quat(float, float, float, float);
构造函数不执行您认为它所做的事情。它直接设置值。
四元数(w, x, y, z)
的值依次为:半角度的余弦,半角度的正弦乘以归一化旋转轴的x坐标,y和z分量相同。
因此,您希望使用glm::quat(cos(glm::radians(90.0f/2)),0,sin(glm::radians(90.0f/2))*1,0);
或内联trig:glm::quat(sqrt(1/2),0,sqrt(1/2),0);
的结果。
发布于 2015-02-14 13:53:01
您可能应该使用glm::angleAxis()
(这里的文件):
glm::quat rot = glm::angleAxis(glm::radians(90.f), glm::vec3(0.f, 1.f, 0.f));
https://gamedev.stackexchange.com/questions/94061
复制相似问题