我在理解矩阵时遇到了问题。如果我将矩阵绕X轴旋转90度,它可以正常工作,但是,如果我将它围绕Y轴旋转90度,它实际上会在Z轴上旋转它。我想每次旋转后轴会移动。如何使用原始轴旋转第二次(或更多次)?这称为本地和全球轮换吗?
答案 0 :(得分:1)
你没有“旋转”矩阵。您可以通过乘法应用旋转变换矩阵。是的,每次调用OpenGL矩阵操作函数时,结果都将用作下一次变换乘法的输入。
绕X轴旋转90°会将Y轴映射到Z,Z轴映射到-Y,这是您观察到的。因此,接下来的转变将从此开始。
使用glLoadIdentity重新构建标识,或者使用glPushMatrix / glPopMatrix创建“转换块”的层次结构,重新为每个对象构建整个转换。或者更好的是,完全抛弃OpenGL内置矩阵堆栈,并用适当的矩阵数学库(如GLM,Eigen或类似物)替换它。
答案 1 :(得分:0)
在旋转之间添加'glLoadIdentity'。
答案 2 :(得分:0)
在实践中,克服这个问题的最好方法是使用四元数,这是相当多的数学。你是对的;如果你将它旋转90度左右比你想绕Z旋转它,你将围绕X旋转。
以下是将euler角度转换为四元数的好消息来源:http://www.euclideanspace.com/maths/geometry/rotations/conversions/eulerToQuaternion/
以下是如何从四元数中制作旋转矩阵: http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToMatrix/
填写矩阵后,您可以通过调用glMultMatrix( qMatrix);
来增加。
答案 3 :(得分:0)
昨晚想到它我找到了答案(我似乎总是这样做......)
我有一个名为GLMatrix的对象,它包含矩阵:
class GLMatrix {
public float m[] = new float[16];
...includes many methods to deal with matrix...
}
它有一个添加旋转的功能:
public void addRotate2(float angle, float ax, float ay, float az) {
GLMatrix tmp = new GLMatrix();
tmp.setAA(angle, ax, ay, az);
mult4x4(tmp);
}
如您所见,我使用Axis Angles(AA),它使用setAA()应用于临时矩阵,然后乘以当前矩阵。 昨晚我想到如果我用当前矩阵旋转AA的输入向量然后创建临时矩阵和多个。
所以它看起来像这样:
public void addRotate4(float angle, float ax, float ay, float az) {
GLMatrix tmp = new GLMatrix();
GLVector3 vec = new GLVector3();
vec.v[0] = ax;
vec.v[1] = ay;
vec.v[2] = az;
mult(vec); //multiple vector by current matrix
tmp.setAA(angle, vec.v[0], vec.v[1], vec.v[2]);
mult4x4(tmp);
}
它按预期工作! addRotate4()函数现在在原始轴上旋转&#es;