glm 在 Y 轴上旋转四元数使物体变形
Posted
技术标签:
【中文标题】glm 在 Y 轴上旋转四元数使物体变形【英文标题】:glm rotating quaternion in Y axis deforms object 【发布时间】:2017-12-03 22:49:51 【问题描述】:我正在用 C++ 实现自己的游戏引擎,在这里我需要帮助,
我有一个游戏对象,它的方向属性是一个四元数,我想将它在 Y 轴上旋转 A 度。
所以,我有:
currentAngle += 0.01; // currentAngle is a member variable, so yes i initialized it
quat q(currentAngle, vec3(0, 1, 0));
myGameObject->SetOrientation(q);
GameObject::SetOrientation(quat q)
myOrientation = q;
但随着游戏对象的旋转,它也会缩放(变形)。所以我检查了我是如何应用转换矩阵的
myModelMatrix = Math::CreateTransformationMatrix(
transformation->GetPosition(),
transformation->GetOrientation(),
transformation->GetScale());
mat4& Math::CreateTransformationMatrix(vec3& translation, quat& orientation, vec3& scaleSize)
mat4 translate = glm::translate(glm::mat4(), translation);
mat4 rotate = glm::toMat4(orientation);
mat4 scale = glm::scale(glm::mat4(), scaleSize);
return translate * rotate * scale;
但它看起来不错(至少对我而言),我从乘法中删除了比例矩阵,以检查我是否以某种方式对其进行了处理。但是,它没有解决任何问题。
我也试过了:
quat q(currentAngle, vec3(0, 1, 0));
quat orientation = myGameObject->GetOrientation();
orientation = orientation *q;
myGameObject->SetOrientation(orientation);
但它也没有工作。 我还检查了我的着色器中的代码,我很肯定这不是问题。
这就是我将矩阵发送到着色器的方式:
glUseProgram(progarmId);1
glUniformMatrix4fv(uniforms[name], 1, GL_FALSE, glm::value_ptr(matrix));
我尝试将第三个参数修改为 True 并交换投影视图矩阵乘法的顺序,但它也不起作用:/
所以,伙计们......任何想法我可能做错了什么?我没有想法:/
【问题讨论】:
myOrientation
字段在哪里以及如何使用?
@meowgoesthedog 对 myOrientation 的修改器是 myGameObject->GetOrientation() 在对 Math::CreateTransformationMatrix 的调用中使用
【参考方案1】:
所以我想通了。
当我在做的时候:
currentAngle += 0.01; // currentAngle is a member variable, so yes i initialized it
quat q(currentAngle, vec3(0, 1, 0));
myGameObject->SetOrientation(q);
必须首先使用 glm 中的角度到轴方法转换四边形,所以最后:
currentAngle = 0.01; // currentAngle is a member variable, so yes i initialized it
//quat q(currentAngle, vec3(0, 1, 0));
vec3 up(0, 1, 0);
quat q = glm::angleAxis(currentAngle, up);
GameObject->Rotate(q);
【讨论】:
【参考方案2】:我没有使用 GLM 的经验,但我们的代码看起来不错。我认为问题出在您发布的代码之外。
可能是您计算世界 * 视图 * 投影矩阵以传递给着色器的代码。尝试翻转乘法顺序。
可能在您的顶点着色器中。
此外,某些平台/框架要求您在将矩阵传递给 GPU 时对其进行转置。
【讨论】:
以上是关于glm 在 Y 轴上旋转四元数使物体变形的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用 transform.Rotate 的情况下在其本地或世界轴上旋转带有第二个四元数的四元数?