【发布时间】:2020-10-02 11:39:45
【问题描述】:
我一直在尝试理解矩阵和向量,并实现了 Rodrigue 的旋转公式来确定给定角度下围绕轴的旋转矩阵。我有函数 Transform 调用函数 Rotate。
// initial values of eye ={0,0,7}
//initial values of up={0,1,0}
void Transform(float degrees, vec3& eye, vec3& up) {
vec3 axis = glm::cross(glm::normalize(eye), glm::normalize(up));
glm::normalize(axis);
mat3 resultRotate = rotate(degrees, axis);
eye = eye * resultRotate;
glm::normalize(eye);
up = up * resultRotate;`enter code here`
glm::normalize(up);
}
mat3 rotate(const float degrees, const vec3& axis) {
//Implement Rodrigue's axis-angle rotation formula
float radDegree = glm::radians(degrees);
float cosValue = cosf(radDegree);
float minusCos = 1 - cosValue;
float sinValue = sinf(radDegree);
float cartesianX = axis.x;
float cartesianY = axis.y;
float cartesianZ = axis.z;
mat3 myFinalResult = mat3(cosValue +(cartesianX*cartesianX*minusCos), ((cartesianX*cartesianY*minusCos)-(cartesianZ*sinValue)),((cartesianX*cartesianZ*minusCos)+(cartesianY*sinValue)),
((cartesianX*cartesianY*minusCos)+(cartesianZ*sinValue)), (cosValue+(cartesianY*cartesianY*minusCos)), ((cartesianY*cartesianZ*minusCos) - (cartesianX*sinValue)),
((cartesianX*cartesianZ*minusCos)-(cartesianY*sinValue)), ((cartesianY*cartesianZ*minusCos) + (cartesianX*sinValue)), ((cartesianZ*cartesianZ*minusCos) + cosValue));
return myFinalResult;
}
所有值、结果旋转矩阵和更改的向量都与 + 旋转角度的预期一样,但对于负角度是错误的,从那时起,具有级联效应,直到所有向量都重新初始化。有人可以帮我解决问题吗?我不能使用任何内置函数,例如 glm::rotate。
【问题讨论】:
-
如果它只适用于正数,一个懒惰的解决方案是将 360 添加到负旋转值。这样,您只需使用正数即可获得相同的轮换。
-
一旦出现第一个错误,无论是+/-ve角度,所有后续矩阵都是错误的,直到顶点和旋转角度被重置。
标签: c++ graphics rotation matrix-multiplication glm-math