首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用四元数旋转物体

用四元数旋转物体
EN

Game Development用户
提问于 2015-02-14 11:57:06
回答 2查看 25.1K关注 0票数 6

我有一个关于使用四元数旋转图形对象的问题。

我有一个Transform类,它具有以下构造函数和默认参数:

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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度),我的对象看起来就好像它已经被缩放了一样。下面的图片显示了它:

当我试图旋转它时,我不知道是什么导致它变成这样的。我错过了什么重要的事情吗?

如果它与此相关,下面是我如何计算视图矩阵的方法:

代码语言:javascript
运行
复制
glm::mat4 Camera::GetView() const
{
    glm::mat4 view = glm::lookAt(m_pos, m_pos + m_forward, m_up);

    return view;
}
EN

回答 2

Game Development用户

回答已采纳

发布于 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);的结果。

票数 4
EN

Game Development用户

发布于 2015-02-14 13:53:01

您可能应该使用glm::angleAxis() (这里的文件):

代码语言:javascript
运行
复制
glm::quat rot = glm::angleAxis(glm::radians(90.f), glm::vec3(0.f, 1.f, 0.f));
票数 13
EN
页面原文内容由Game Development提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://gamedev.stackexchange.com/questions/94061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档