从一个坐标系变换到另一个坐标系。分别为每个轴指定新的坐标系对应的轴X,-X,Y,-Y,Z,-Z,如X->Y, Y->X,Z->Z。
QMatrix4x4 translateMat;
int val = 0;
// for x component, axis is new component
for (int i = 0; val = axisX, i < 3; i++)
{
if (val == 2 * i)
translateMat(0, i) = 1.0;
else if (val == 2 * i + 1)
translateMat(0, i) = -1.0;
else
translateMat(0, i) = 0.0;
}
// for y component
for (int i = 0; val = axisY, i < 3; i++)
{
if (val == 2 * i)
translateMat(1, i) = 1.0;
else if (val == 2 * i + 1)
translateMat(1, i) = -1.0;
else
translateMat(1, i) = 0.0;
}
// for z component
for (int i = 0; val = axisZ, i < 3; i++)
{
if (val == 2 * i)
translateMat(2, i) = 1.0;
else if (val == 2 * i + 1)
translateMat(2, i) = -1.0;
else
translateMat(2, i) = 0.0;
}
// calc new result
QVector3D pos(ui.edtX->text().toFloat(), ui.edtY->text().toFloat(), ui.edtZ->text().toFloat());
QQuaternion rot(ui.edtRW->text().toFloat(), ui.edtRX->text().toFloat(), ui.edtRY->text().toFloat(), ui.edtRZ->text().toFloat());
QVector3D newPos = translateMat * pos;
QMatrix3x3 newRotMat = translateMat.toGenericMatrix<3, 3>()* rot.toRotationMatrix();
QQuaternion newRot = QQuaternion::fromRotationMatrix(newRotMat);