我现在有什么?我有一个由6个平面组成的立方体。我在XY坐标下生成的所有这些平面,然后通过矩阵变换将它们放置起来。

我需要沿着全局轴旋转我的立方体,沿着立方体旋转移动我的平面;
我旋转立方体

那么我需要正确地移动其中一架飞机。但是飞机沿着全球轴运动。红线显示飞机现在是如何移动的。绿线显示了它应该如何移动。

我如何创建一个立方体。所有顶点都在(0,0) - (2,2)的范围内;
planeXY.setupMesh();
planeXY.setOrigin({1, 1, 1});
planeXY1.setupMesh();
planeXY1.setOrigin({1, 1, 1});
planeXY1.moveAlongGlobalAxis(QVector3D(0.0, 0.0, 2.0));
planeZY.setupMesh();
planeZY.setOrigin({1, 1, 1});
planeZY.rotate(QVector3D(0.0f, -90.0f, 0.0f));
planeZY.moveAlongGlobalAxis(QVector3D(-2.0, 0.0, 0.0));
planeZY1.setupMesh();
planeZY1.setOrigin({1, 1, 1});
planeZY1.rotate(QVector3D(0.0f, -90.0f, 0.0f));
planeXZ.setupMesh();
planeXZ.setOrigin({1, 1, 1});
planeXZ.rotate(QVector3D(90.0f, 0.0f, 0.0f));
planeXZ.moveAlongGlobalAxis(QVector3D(0.0, -2.0, 0.0));
planeXZ1.setupMesh();
planeXZ1.setOrigin({1, 1, 1});
planeXZ1.rotate(QVector3D(90.0f, 0.0f, 0.0f));Mesh.cpp
void Mesh::moveAlongGlobalAxis(QVector3D coordinates)
{
QMatrix4x4 identityMatrix;
identityMatrix.translate(coordinates);
position += coordinates;
this->translationMatrix = identityMatrix * translationMatrix;
}
void Mesh::moveAlongLocalAxis(QVector3D coordinates)
{
this->moveAlongGlobalAxis(coordinates);
}
void Mesh::rotate(QVector3D rotation)
{
QMatrix4x4 identityMatrix;
identityMatrix.translate((-1) * this->position + this->origin);
identityMatrix.rotate(rotation.x(), QVector3D(1.0, 0.0, 0.0));
identityMatrix.rotate(rotation.y(), QVector3D(0.0, 1.0, 0.0));
identityMatrix.rotate(rotation.z(), QVector3D(0.0, 0.0, 1.0));
identityMatrix.translate(this->position - this->origin);
this->rotationMatrix = identityMatrix * this->rotationMatrix;
}
void Mesh::setOrigin(QVector3D origin)
{
this->origin = origin;
}
const QMatrix4x4 Mesh::getModelMatrix() const
{
return translationMatrix * rotationMatrix;
}我想实现这个功能:
void Mesh::moveAlongLocalAxis(QVector3D coordinates)
{
this->moveAlongGlobalAxis(coordinates);
}我如何旋转我的立方体
else if(ev->key() == Qt::Key_R)
{
planeXY.rotate(QVector3D(20.0f, 0.0f, 0.0f));
planeXY1.rotate(QVector3D(20.0f, 0.0f, 0.0f));
planeZY.rotate(QVector3D(20.0f, 0.0f, 0.0f));
planeZY1.rotate(QVector3D(20.0f, 0.0f, 0.0f));
planeXZ.rotate(QVector3D(20.0f, 0.0f, 0.0f));
planeXZ1.rotate(QVector3D(20.0f, 0.0f, 0.0f));
}发布于 2022-06-15 08:13:19
把矩阵乘法看作是将数据从一个坐标系转换到另一个坐标系。因此,最初,您的多维数据集的本地坐标系与“全局”坐标系是相同的。在“全局”系统中,沿其一个坐标的每一次平移都是平移向量中的单个分量。
现在,您旋转您的立方体及其本地坐标系,使它们不再与“全局”坐标对齐。根据您选择的转换顺序,翻译将应用于“全局”系统中。如果要应用在多维数据集的本地坐标系中定义的转换,则必须首先将翻译向量转换为“全局”坐标。在你的例子中,绿线是局部坐标系中的一个轴。所以在局部上,这个轴上的平移向量有一个坐标,与0不同。但是在“全局”一中,所有组件都可能与0不同。
那么我们如何找到这个向量呢?幸运的是,这非常简单,因为您已经知道如何在两个坐标系之间进行转换。你已经用立方体做过了。所以,只需应用你对顶点的旋转。除非我遗漏了代码中的某些内容或犯了任何其他错误,否则函数应该如下所示:
void Mesh::moveAlongLocalAxis(QVector3D coordinates)
{
// transform local translation to global coordinate system
coordinates = this->rotationMatrix * coordinates
this->moveAlongGlobalAxis(coordinates);
}请注意,我在上面的文本中过度简化了一些东西,它们是为帮助您解决具体问题而量身定做的。协调系统和转换不是特别难理解,但它需要一些时间来适应正确的心智模式。您必须始终记住,经过一组转换后,您在哪个坐标系中结束,以及如何应用旋转和转换来将您带到下一个坐标系统。我推荐本站来更好地理解这个主题。
https://computergraphics.stackexchange.com/questions/12780
复制相似问题