如何将变换应用于网格几何体
How to apply transformations to mesh geometry
在 Qt3D 上,一个实体可以有这两个组件:
Qt3DRender::QGeometryRenderer
组件,其中包含 网格几何体 数据,例如顶点 positions 和 normals[=42] =].
Qt3DCore::QTransform
组件,其中包含 旋转 、 平移 和 缩放 。
我打算将所有 转换 应用于 网格几何体 的网格数据导出为 STL。我的意思是,所有旋转和平移都需要应用于顶点位置...
当我访问网格几何数据时,如下所示,转换未应用于几何。
mesh->geometry()->attributes().at(i)->buffer()->data();
如何将变换应用到几何?
Qt3DCore::QTransform
组件给了我一个 4x4 Matrix,但我的顶点位置是 3x1
,我不知道如何将这个 4x4 矩阵应用到我的 3x1
顶点位置。
从变换数学来看,要用 4x4 变换矩阵变换向量,所有内容都必须在 homogeneous coordinates 中。为此,您可以将第四个分量添加到向量并将其设置为 1,然后将其与(已经齐次的)4x4 矩阵相乘。所以:
QVector3D oldVec = QVector3D(x,y,z); //this is your 3x1 vertex position
QVector4D newVec = QVector4D(oldVec.x(), oldVec.y(), oldVec.z(), 1); //added 1 as fourth component
QVector4D transformedVec = matrix*newVec; //matrix is your 4x4 transformation matrix
//transformedVec is now what you need but with the fourth component still being the 1, so we just leave it out:
QVector3D transformedVec3D = QVector3D(transformedVec.x(), transformedVec.y(), transformedVec.z());
要详细了解其背后的数学原理,您可以查看 this link。
在 Qt3D 上,一个实体可以有这两个组件:
Qt3DRender::QGeometryRenderer
组件,其中包含 网格几何体 数据,例如顶点 positions 和 normals[=42] =].Qt3DCore::QTransform
组件,其中包含 旋转 、 平移 和 缩放 。
我打算将所有 转换 应用于 网格几何体 的网格数据导出为 STL。我的意思是,所有旋转和平移都需要应用于顶点位置...
当我访问网格几何数据时,如下所示,转换未应用于几何。
mesh->geometry()->attributes().at(i)->buffer()->data();
如何将变换应用到几何?
Qt3DCore::QTransform
组件给了我一个 4x4 Matrix,但我的顶点位置是 3x1
,我不知道如何将这个 4x4 矩阵应用到我的 3x1
顶点位置。
从变换数学来看,要用 4x4 变换矩阵变换向量,所有内容都必须在 homogeneous coordinates 中。为此,您可以将第四个分量添加到向量并将其设置为 1,然后将其与(已经齐次的)4x4 矩阵相乘。所以:
QVector3D oldVec = QVector3D(x,y,z); //this is your 3x1 vertex position
QVector4D newVec = QVector4D(oldVec.x(), oldVec.y(), oldVec.z(), 1); //added 1 as fourth component
QVector4D transformedVec = matrix*newVec; //matrix is your 4x4 transformation matrix
//transformedVec is now what you need but with the fourth component still being the 1, so we just leave it out:
QVector3D transformedVec3D = QVector3D(transformedVec.x(), transformedVec.y(), transformedVec.z());
要详细了解其背后的数学原理,您可以查看 this link。