本文主要是介绍Qt例子学习笔记 - Examples/Qt-6.2.0/qt3d/anaglyph-rendering,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
main.cpp
#include <Qt3DQuickExtras/qt3dquickwindow.h>
#include <Qt3DQuick/QQmlAspectEngine>
//类 Qt3DCore::Quick::QQmlAspectEngine
//QQmlAspectEngine 为 QAspectEngine 提供了一个环境和一个实例化 QML 组件的方法。
#include <QGuiApplication>
#include <QQmlEngine>
//QQmlEngine 类为实例化 QML 组件提供了环境
//每个 QML 组件都在 QQmlContext 中实例化。 QQmlContext 对于将数据传递给 QML 组件是必不可少的。
//在 QML 中,上下文按层次排列,这个层次结构由 QQmlEngine 管理
//在创建任何 QML 组件之前,应用程序必须创建一个 QQmlEngine 才能访问 QML 上下文。
//以下示例展示了如何创建一个简单的 Text 项目。/*
QQmlEngine engine;
QQmlComponent component(&engine);
component.setData("import QtQuick 2.0\nText { text: \"Hello world!\" }", QUrl());
QQuickItem *item = qobject_cast<QQuickItem*>(component.create());
//add item to view ,etc
*/#include <QQmlContext>int main(int argc, char* argv[])
{//Quick3DExtras 模块还指定了一个 Qt3DExtras::Quick::Qt3DQuickWindow。QGuiApplication app(argc, argv);Qt3DExtras::Quick::Qt3DQuickWindow view;//返回引擎的根上下文 根上下文由 QQmlEngine 自动创建。 应该对引擎实例化的所有 //QML 组件实例可用的数据应该放在根上下文中。应该只对组件实例的子集可用的附加数据应该添加//到以根上下文为父级的子上下文中。//QQmlContext 类定义了 QML 引擎中的上下文//上下文允许向 QML 引擎实例化的 QML 组件公开数据。//每个 QQmlContext 都包含一组与其 QObject 属性不同的属性,这些属性允许通过名称//将数据显式绑定到上下文。 上下文属性通过调用 QQmlContext::setContextProperty() //来定义和更新。 下面的示例显示了一个 Qt 模型被绑定到一个上下文,然后从 QML 文件访问。/*QQmlEngine engine;QStringListModel modelData;QQmlContext *context = new QQmlContext(engine.rootContext());context->setContextProperty("myModel",&modelData);QQmlComponent component(&engine);component.setData("import QtQuick 2.0\nListView { model: myModel }",QUrl());QObject *window = component.create(context);*///请注意,删除它构造的任何 QQmlContext 是创建者的责任。 //如果在销毁窗口组件实例时不再需要示例中的上下文对象,则必须显式销毁上下文。 //确保这一点的最简单方法是将 window 设置为上下文的父级。//为了简化绑定和维护更大的数据集,可以在 QQmlContext 上设置上下文对象。 //上下文对象的所有属性都可以在上下文中按名称使用,就好像它们都是通过调用 //QQmlContext::setContextProperty() 单独添加的。 //通过属性的通知信号检测对属性值的更改。 //设置上下文对象比手动添加和维护上下文属性值更快、更容易。view.engine()->qmlEngine()->rootContext()->setContextProperty("_window", &view);view.setSource(QUrl("qrc:/main.qml"));view.show();return app.exec();
}
main.qml
import QtQuick 2.4 as QQ2
//Qt 3D 为近实时仿真系统提供功能,支持 Qt C++ 和 Qt Quick 应用程序中的 2D 和 3D 渲染。
import Qt3D.Core 2.0 //Qt 3D 模块包含支持近实时仿真系统的功能。
import Qt3D.Render 2.0 //Qt 3D Render 模块包含使用 Qt 3D 支持 2D 和 3D 渲染的功能。
import Qt3D.Extras 2.0 //Qt 3D Extras 模块提供了一组预构建的元素来帮助您开始使用 Qt 3D。//Entity 对象的行为由它引用的 Component3D 对象定义。 每个 Qt3D
//后端方面都能够通过识别实体由哪些组件组成来解释和处理实体。
//一个方面可能决定只处理由单个 Transform
//组件组成的实体,而另一个方面可能专注于 MouseHandler。
Entity {id: root//提供用于创建 Qt 3D 组件的基本类型//RenderSettings 类型保存与渲染过程相关的设置并托管活动的 FrameGraphcomponents: RenderSettings {StereoFrameGraph {id: stereoFrameGraphleftCamera: stereoCamera.leftCamerarightCamera: stereoCamera.rightCamera}}// CameraStereoCamera {id: stereoCameraproperty real circleRotation: 0readonly property real cameraRadius: obstaclesRepeater.radius - 50readonly property vector3d circlePosition: Qt.vector3d(cameraRadius * Math.cos(circleRotation), 0.0, cameraRadius * Math.sin(circleRotation))readonly property vector3d tan: circlePosition.crossProduct(Qt.vector3d(0, 1, 0).normalized())viewCenter: planeTransform.translationposition: circlePosition.plus(Qt.vector3d(0, 45 * Math.sin(circleRotation * 2), 0)).plus(tan.times(-2))//动画 qreal 类型值的变化//NumberAnimation 是一个专门的 PropertyAnimation,它定义了当数值改变时要应用的动画。//这是一个应用于 Rectangle 的 x 属性的 NumberAnimation 作为属性值源。 它在 1000 毫秒内将 x 值从其当前值动画化为 50:/*import QtQuick 2.0Rectangle{width:100;height:100color:"red"NumberAnimation on x {to:50;duration:1000}}*///与任何其他动画类型一样,NumberAnimation //可以通过多种方式应用,包括过渡、行为和属性值源。 Qt //Quick 文档中的动画和过渡展示了多种创建动画的方法。//请注意,如果 NumberAnimation //正在跟踪的数值发生不规则变化,则它可能无法平滑地设置动画。 如果是这种情况,请改用 SmoothedAnimation。QQ2.NumberAnimation {//这些属性用作一组来确定应该动画化哪些属性。 单数和复数形式在功能上是相同的//目标属性允许设置多个目标。 例如,这对 itemA 和 itemB 的 x 属性进行动画处理:/*NumberAnimation{targets:[itemA,itemB];properties:"x";to:500}*/target: stereoCameraproperty: "circleRotation"//from 此属性保存动画的起始值。//例如,在 x 值达到 100 之前不会应用以下动画:/*Item{states:{//...}transitions:Transition{NumberAnimation{properties:"x";from:100;duration:200}}}*///如果在 Transition 或 Behavior 中定义了 //NumberAnimation,则此值默认为在 Transition //的起始状态中定义的值,或触发 Behavior //时属性的当前值。//to 此属性保存动画的结束值//如果 NumberAnimation 是在 Transition 或//Behavior 中定义的,则此值默认为在 Transition //的结束状态中定义的值,或触发 Behavior //的属性更改的值。from: 0; to: Math.PI * 2duration: 10000loops: QQ2.Animation.Infiniterunning: true}}// Skybox//SkyboxEntity 是一个方便的 Entity 子类,可用于在 3D 场景中插入天空盒//通过指定基本名称和扩展名,SkyboxEntity 将负责构建要在运行时渲染的 TextureCubeMap。//源目录中的图像应符合以下模式:基本名称 + * "_posx|_posy|_posz|_negx|_negy|_negz" + 扩展名//默认情况下,扩展名默认为 .png。//确保在进行天空盒渲染的 FrameGraph 中禁用视锥体剔除SkyboxEntity {//包含 Skybox 的基本名称baseName: "qrc:/assets/cubemaps/miramar/miramar"//包含天空盒图像文件名的扩展名,包括前导“.”。//默认值为:.pngextension: ".webp"}// CylinderEntity {//圆柱形网格property CylinderMesh cylinder: CylinderMesh {radius: 1length: 3//网格中的环数rings: 100//网格中的切片数slices: 20}property Transform transform: Transform {id: cylinderTransformproperty real theta: 0.0property real phi: 0.0//从俯仰、偏航和滚转创建四元数。 返回结果四元数。rotation: fromEulerAngles(theta, phi, 0)}property Material phong: PhongMaterial {}QQ2.ParallelAnimation {loops: QQ2.Animation.Infiniterunning: trueQQ2.SequentialAnimation {QQ2.NumberAnimation {target: cylinderTransformproperty: "scale"from: 5; to: 45duration: 2000easing.type: QQ2.Easing.OutInQuad}QQ2.NumberAnimation {target: cylinderTransformproperty: "scale"from: 45; to: 5duration: 2000easing.type: QQ2.Easing.InOutQuart}}QQ2.NumberAnimation {target: cylinderTransformproperty: "phi"from: 0; to: 360duration: 4000}QQ2.NumberAnimation {target: cylinderTransformproperty: "theta"from: 0; to: 720duration: 4000}}components: [cylinder, transform, phong]}// 飞机Entity {components: [//自定义网格加载器Mesh {source: "assets/obj/toyplane.obj"},//用于对网格执行变换Transform {id: planeTransformproperty real rollAngle: 0.0translation: Qt.vector3d(Math.sin(stereoCamera.circleRotation * -2) * obstaclesRepeater.radius,0.0,Math.cos(stereoCamera.circleRotation * -2) * obstaclesRepeater.radius)rotation: fromAxesAndAngles(Qt.vector3d(1.0, 0.0, 0.0), planeTransform.rollAngle,Qt.vector3d(0.0, 1.0, 0.0), stereoCamera.circleRotation * -2 * 180 / Math.PI + 180)},//hongMaterial 类提供了 phong 照明效果的默认实现PhongMaterial {shininess: 20.0diffuse: "#ba1a02" // Inferno Orange}]QQ2.SequentialAnimation {running: trueloops: QQ2.Animation.InfiniteQQ2.NumberAnimation {target: planeTransformproperty: "rollAngle"from: 30; to: 45duration: 750}QQ2.NumberAnimation {target: planeTransformproperty: "rollAngle"from: 45; to: 25duration: 500}QQ2.NumberAnimation {target: planeTransformproperty: "rollAngle"from: 25; to: 390duration: 800}}}// Torus obsctacles//环面障碍物//动态创建节点NodeInstantiator {id: obstaclesRepeatermodel: 4readonly property real radius: 130.0;readonly property real det: 1.0 / model//用于创建所有对象的组件。//请注意,委托实例中将有一个额外的变量 index 可用。 该变//量指的是Instantiator内部实例的索引,可以通过Instantiator的itemAt方法获取对象。//如果更改此属性,则使用旧委托的所有实例都将被销毁,并使用新委托创建新实例。delegate: Entity {components: [//一个环形网TorusMesh {radius: 35//环面的内半径minorRadius: 5rings: 100slices: 20},Transform {id: transformreadonly property real angle: Math.PI * 2.0 * index * obstaclesRepeater.dettranslation: Qt.vector3d(obstaclesRepeater.radius * Math.cos(transform.angle),0.0,obstaclesRepeater.radius * Math.sin(transform.angle))rotation: fromAxisAndAngle(Qt.vector3d(0.0, 1.0, 0.0), transform.angle * 180 / Math.PI)},PhongMaterial {diffuse: Qt.rgba(Math.abs(Math.cos(transform.angle)), 204 / 255, 75 / 255, 1)specular: "white"shininess: 20.0}]}}
}
StereoCamera.qml
import Qt3D.Core 2.0
import Qt3D.Render 2.0Entity {id: rootproperty real convergence: 2000.0property real eyeSeparation: 35.0property real aspectRatio: _window.width / _window.heightproperty real fieldOfView: 60.0property real nearPlane: 10.0property real farPlane: 10000.0property vector3d viewCenter: Qt.vector3d(0.0, 0.0, 0.0)property vector3d position: Qt.vector3d(0.0, 0.0, 1.0)property vector3d upVector: Qt.vector3d(0.0, 1.0, 0.0)readonly property real _fov2: Math.tan(fieldOfView * Math.PI / 180 * 0.5)readonly property real top: nearPlane * _fov2readonly property real a: aspectRatio * _fov2 * convergence//提供用于为 3D 场景定义相机的投影矩阵CameraLens {id: leftEyeLens//保存相机投影的类型。projectionType: CameraLens.FrustumProjection//相机镜头的当前近平面。nearPlane : root.nearPlane//相机镜头的当前远平面。farPlane : root.farPlane//相机镜头的当前左平面left: -(a - eyeSeparation * 0.5) * nearPlane / convergence//相机镜头的当前右侧平面right: (a + eyeSeparation * 0.5) * nearPlane / convergencetop: root.topbottom: -root.top}CameraLens {id: rightEyeLensprojectionType: CameraLens.FrustumProjectionnearPlane : root.nearPlanefarPlane : root.farPlaneleft: -(a + eyeSeparation * 0.5) * nearPlane / convergenceright: (a - eyeSeparation * 0.5) * nearPlane / convergencetop: root.topbottom: -root.top}//用于对网格执行变换Transform {id: eyeTransformmatrix: {var m = Qt.matrix4x4();m.translate(root.position)var zAxis = root.position.minus(root.viewCenter).normalized()var xAxis = root.upVector.crossProduct(zAxis).normalized();var yAxis = zAxis.crossProduct(xAxis);var r = Qt.matrix4x4(xAxis.x, yAxis.x, zAxis.x, 0,xAxis.y, yAxis.y, zAxis.y, 0,xAxis.z, yAxis.z, zAxis.z, 0,0, 0, 0, 1)return m.times(r);}}components: [ eyeTransform ]property Entity leftCamera: Entity {components: [ leftEyeLens ]}property Entity rightCamera: Entity {id: rightCameraEntitycomponents: [ rightEyeLens ]}
}
StereoFrameGraph.qml
import Qt3D.Core 2.0
import Qt3D.Render 2.0
//Qt3D 场景上的视口
Viewport {property alias leftCamera: leftCameraSelector.cameraproperty alias rightCamera: rightCameraSelector.cameraproperty alias window: surfaceSelector.surface//提供一种指定渲染表面的方法RenderSurfaceSelector {id: surfaceSelector// ColorMask 默认重置// 如果未指定,默认重置为默认值//Qt3DRender::QClearBuffers FrameGraph 节点可以清除具有特定值的特定渲染目标缓冲区。ClearBuffers {buffers: ClearBuffers.ColorDepthBufferNoDraw {} // We just want to clear the buffers}// 用左眼画//允许选择要使用的相机的类CameraSelector {id: leftCameraSelector//RenderStateSet FrameGraph 节点提供了一种方法来指定在执行框架图分支期间要应用的一组 RenderState 对象//在 RenderStateSet 上设置的状态是全局设置的,这与可以在 RenderPass //上设置的每个材质状态相反。 默认情况下,空的 RenderStateSet 将导致所有渲染状态在执行时被禁用。 //添加 RenderState 状态在运行时显式启用该渲染状态。RenderStateSet 在添加到活动帧图时启用:RenderStateSet {//保存渲染通道使用的渲染状态。renderStates: [ColorMask { redMasked: true; greenMasked: false; blueMasked: false; alphaMasked: false },DepthTest { depthFunction: DepthTest.Less }]}}// Draw with right eyeClearBuffers {buffers: ClearBuffers.DepthBufferCameraSelector {id: rightCameraSelectorRenderStateSet {renderStates: [ColorMask { redMasked: false; greenMasked: true; blueMasked: true; alphaMasked: false },DepthTest { depthFunction: DepthTest.Less }]}}}}
}
这篇关于Qt例子学习笔记 - Examples/Qt-6.2.0/qt3d/anaglyph-rendering的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!