3d 矩阵旋转 - 对象奇怪地旋转
Posted
技术标签:
【中文标题】3d 矩阵旋转 - 对象奇怪地旋转【英文标题】:3d matrix rotation - object rotates strangely 【发布时间】:2014-08-02 01:19:03 【问题描述】:我正在尝试使用旋转矩阵来围绕其 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;
【问题讨论】:
【参考方案1】:啊,我太傻了!
我误解了矩阵变换 - 我假设传递一个旋转角度会将形状旋转到那个角度..
相反,它将形状旋转该角度。所以如果我以角度 = 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;
【讨论】:
以上是关于3d 矩阵旋转 - 对象奇怪地旋转的主要内容,如果未能解决你的问题,请参考以下文章