Qt3DCore::QEntity是一个Qt3DCore::QNode子类,可以聚合指定其行为的多个Qt3DCore::QComponent实例。Qt3DCore::QEntity本身就是一个空壳。 Qt3DCore::QEntity对象的行为由其引用的Qt3DCore::QComponent对象定义。 每个Qt3D后端方面将能够通过识别它由哪些组件组成来解释和处理实体。 QEntity一方面可以决定只处理由单个Qt3DCore::QTransform组件组成的实体,另一方面,可以专注于处理Qt3DInput::QMouseHandler鼠标行为。
QComponent作为场景节点的基类,可由Qt3DCore::QEntity实例作为组件聚合。
Qt3DCore::QComponent提供了一个垂直的行为切片,可以分配给Qt3DCore::QEntity实例,有时也可以在Qt3DCore::QEntity实例之间共享。
Qt3DCore::QComponent子类通常聚合在向聚合实体赋予有用行为的组中。 例如,要拥有由Qt3D渲染器方面绘制的实体,实体很可能会聚合Qt3DCore::QTransform,Qt3DRender::QMesh和Qt3DRender::QMaterial组件。
Qt3D中QTransform用于在网格上执行变换,这个组件不能在多个QEntity之间共享。转换被保存为QVector3D缩放,QQuaternion旋转和QVector3D平移组件。 变换按该顺序应用于网格。 当设置了QTransform::matrix属性时,它被分解为这些变换分量并发出相应的信号。
Qt3D中要设置QTransform;可以使用一下函数:
fromAxisAndAngle和fromAxesAndAngles可用于设置围绕特定轴的旋转,fromEulerAngles可用于设置基于欧拉角的旋转,rotateAround可用于围绕特定点相对于局部原点旋转对象。
Qt3DCore::QEntity *rootEntity = new Qt3DCore::QEntity();
Qt3DCore::QEntity *sceneEntity = new Qt3DCore::QEntity(rootEntity);
sceneEntity->addComponent(pointMesh);
sceneEntity->addComponent(pointTransform);
sceneEntity->addComponent(material);
view.setRootEntity(rootEntity);
上面代码中出现了两个QEntity,一个是rootEntity,一个是sceneEntity,实际上就相当于QWidget窗口中的Widget,一个Widget也可以显示在窗口。3D窗口的view设置了rootEnttiy,就相当于设置了Widget,其他组件像mesh类的立体图形,材质,纹理,旋转变换配置,都类似于控件,在rootEntity上布局一样。
只不过一个rootEntity就像一个widget那样,可以布局很多不同的控件,甚至是widget,所以子widget,子Entity同样可以添加其他的子控件,子组件。