我正在尝试使用旋转矩阵来围绕其X轴转动线框立方体。
但是,我无法弄清楚如何将旋转原点设置为0,0,0以外的任何其他颜色。
最奇怪的是 - 当我增加角度(以度为单位)时,物体旋转得越来越快。 因此,当旋转角度大约为8度时,立方体执行完整旋转(在0,0,0的原点附近)。然后在11度等等。
我尝试了三种教程方法,复制代码并将其插入我的顶点系统。每个矩阵代码都会导致相同的行为。
这是我正在使用的方法 - 矩阵在Matrix_Handler中使用相关的三角函数定义..
-(void) GLmatrixRotation:(HeyaldaGLDrawNode*) GLpolygon angle:(float)angle {
matrix X_Matrix, Y_Matrix, Z_Matrix, Final_Matrix;
int vertexCount = GLpolygon.dynamicVertCount;
x_angle = angle;
y_angle = 0;
z_angle = 0;
float xOrigin = 150;
float yOrigin = 150;
float zOrigin = 0;
Matrix_Handler(X_Matrix, Y_Matrix, Z_Matrix, deg_to_rad(x_angle), deg_to_rad(y_angle), deg_to_rad(z_angle));
Concatenate_Matrices(X_Matrix, Y_Matrix, Z_Matrix, Final_Matrix);
for (int i=0; i<vertexCount; i++) {
HeyaldaPoint v = GLpolygon.dynamicVerts[i];
HeyaldaPoint vt;
HeyaldaPoint newPoint;
// translate for new origin
v.x = v.x + xOrigin;
v.y = v.y + yOrigin;
v.z = v.z + zOrigin;
newPoint.x = (Final_Matrix[0][0] * v.x) + (Final_Matrix[0][1] * v.y) + (Final_Matrix[0][2] * v.z);
newPoint.y = (Final_Matrix[1][0] * v.x) + (Final_Matrix[1][1] * v.y) + (Final_Matrix[1][2] * v.z);
newPoint.z = (Final_Matrix[2][0] * v.x) + (Final_Matrix[2][1] * v.y) + (Final_Matrix[2][2] * v.z);
// translate back to old origin
newPoint.x = newPoint.x - xOrigin;
newPoint.y = newPoint.y - yOrigin;
newPoint.z = newPoint.z - zOrigin;
GLpolygon.dynamicVerts[i] = newPoint;
}
答案 0 :(得分:0)
Aah傻傻的我!
我误解了矩阵变换 - 我假设传递一个旋转角度会将形状旋转到那个角度。
相反,它会旋转形状BY角度。所以如果我用角度= 10旋转形状,它会将形状转动10度。它不会将它转到10度。
要设置我们旋转的原点,我需要反转平移数学(将其设置为减号) -
// translate for new origin
v.x = v.x - xOrigin;
v.y = v.y - yOrigin;
v.z = v.z - zOrigin;
// translate back to old origin
newPoint.x = newPoint.x + xOrigin;
newPoint.y = newPoint.y + yOrigin;
newPoint.z = newPoint.z + zOrigin;
而且 - 原点需要在所有三个坐标中设置 -
float xOrigin = 150;
float yOrigin = 150;
float zOrigin = 150;