我用C ++实现自己的游戏引擎,我需要帮助,
我有一个游戏对象,它的方向属性是四元数,我想在Y轴上旋转一度。
所以,我有:
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));
我尝试将第3个参数修改为True并交换投影视图矩阵乘法的顺序,它也不起作用:/
所以,伙计......任何想法我可能做错了什么?我没有想法:/
答案 0 :(得分:0)
所以我想通了。
我在做的时候:
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);
答案 1 :(得分:-1)
我没有使用GLM的经验,但我们的代码看起来不错。我认为问题超出了您发布的代码。
可以是您计算世界*视图*投影矩阵以传递到着色器的代码。尝试翻转乘法顺序。
可以在您的顶点着色器中。
此外,某些平台/框架要求您在将矩阵传递给GPU时转置矩阵。