Qt例子学习笔记 - Examples/Qt-6.2.0/qt3d/pbr-materials

el/2024/5/21 21:36:09

main.cpp

//演示使用 PBR 材料的 QML 应用程序。
//Pbr-Materials 演示了如何使用 Qt 3D 材料系统。#include <Qt3DQuickExtras/qt3dquickwindow.h>
#include <Qt3DQuick/QQmlAspectEngine>
#include <QGuiApplication>
#include <QQmlEngine>
#include <QQmlContext>int main(int argc, char* argv[])
{QGuiApplication app(argc, argv);Qt3DExtras::Quick::Qt3DQuickWindow view; 将窗口作为上下文属性公开,以便我们可以设置纵横比view.engine()->qmlEngine()->rootContext()->setContextProperty("_window", &view);view.setSource(QUrl("qrc:/main.qml"));view.show();return app.exec();
}

main.qml

import QtQuick 2.1
import Qt3D.Core 2.0
import Qt3D.Render 2.9
import Qt3D.Input 2.0
import Qt3D.Extras 2.15Entity {id: rootobjectName: "root"// 使用 ForwardRenderer.qml 中指定的渲染器配置// 并从 mainCamera 渲染components: [RenderSettings {activeFrameGraph: ForwardRenderer {camera: mainCamera}},// 事件源将由 Qt3DQuickWindow 设置InputSettings { }]BasicCamera {id: mainCameraposition: Qt.vector3d( -5.17253, 2.95727, 6.65948 )viewCenter: Qt.vector3d( 6.73978, -2.50545, -10.6525 )}//FirstPersonCameraController 允许从第一人称视角控制场景相机FirstPersonCameraController { camera: mainCamera }Lights { }Entity {components: [PointLight {enabled: parent.enabledcolor: "black"intensity: 0},EnvironmentLight {enabled: parent.enabled//保存当前环境辐照度贴图纹理。irradiance: TextureLoader {source: "qrc:/assets/cubemaps/default/default_irradiance.dds"wrapMode {x: WrapMode.ClampToEdgey: WrapMode.ClampToEdge}//此属性确定是否为本身不提供 mipmap 级别的纹理生成 mipmap。//与没有它们的渲染相比,使用 mipmap 和 mip 过滤可以在远距离查看纹理时提供更好的视觉质量,//但可能会降低性能(在初始化图像和渲染期间)。generateMipMaps: false}//保存当前环境高光贴图纹理。//默认情况下,环境镜面反射纹理为空。//注意:此属性的确切含义和用途取决于材料实现。specular: TextureLoader {source: "qrc:/assets/cubemaps/default/default_specular.dds"wrapMode {x: WrapMode.ClampToEdgey: WrapMode.ClampToEdge}generateMipMaps: false}}]}Entity {id: floorcomponents: [Mesh {source: "qrc:/assets/obj/plane-10x10.obj"},//此材质使用具有单一渲染通道方法的效果并执行每个片段照明。//为 OpenGL 3 和 OpenGL ES 3 提供了技术MetalRoughMaterial {//保持材料的当前基色。 这可以是纯色值或纹理。 默认情况下,此属性的值为“灰色”。baseColor: TextureLoader {source: "qrc:/assets/textures/ceramic_small_diamond/ceramic_small_diamond_basecolor.png"format: Texture.SRGB8_Alpha8generateMipMaps: true}//将材料的当前金属度级别保存为 //0(纯介电性,默认值)和 1(纯金属性)之间的值//这可以是普通的统一值或纹理。//默认情况下,此属性的值为 0。metalness: TextureLoader { source: "qrc:/assets/textures/ceramic_small_diamond/ceramic_small_diamond_metallic.png"; generateMipMaps: true }//保持材料的当前粗糙度级别。//这可以是普通的统一值或纹理。 默认情况下,此属性的值为 0。roughness: TextureLoader { source: "qrc:/assets/textures/ceramic_small_diamond/ceramic_small_diamond_roughness.png"; generateMipMaps: true }//保存材质的当前法线贴图纹理。//这只能是纹理,否则将被忽略。 默认情况下未设置此地图。normal: TextureLoader { source: "qrc:/assets/textures/ceramic_small_diamond/ceramic_small_diamond_normal.png"; generateMipMaps: true }//保存材质的当前环境光遮挡贴图纹理。//这只能是纹理,否则将被忽略。 默认情况下未设置此地图。ambientOcclusion: TextureLoader { source: "qrc:/assets/textures/ceramic_small_diamond/ceramic_small_diamond_ambient_occlusion.png" }}]}TrefoilKnot {id: trefoilKnoty: 1.5z: -2scale: 0.2//SequentialAnimation 和 ParallelAnimation 类型允许多个动画一起运行。//SequentialAnimation 中定义的动画一个接一个运行,而 ParallelAnimation 中定义的动画同时运行。//以下动画并行运行两个数字动画。//通过同时为其 x 和 y 属性设置动画,矩形移动到 (50,50)。/*import QtQuick 2.0Rectangle{id:rectwidth:100;height:100color:"red"ParallelAnimal{runnnig:trueNumberAnimation{target:rect;property:"x";to:50;duration:1000}NumberAnimation{target:rect;property:"y";to:50;duration:1000}}}*/ParallelAnimation {//此属性保存动画应播放的次数。//默认情况下,loops 为 1:动画将播放一次然后停止。//如果设置为 Animation.Infinite,动画将不断重复//直到被明确停止 - 通过将 running 属性设置为 false,或通过调用 stop() 方法。//在以下示例中,矩形将无限旋转。/*Rectangle{width:100;height:100;color:"green"RotationAnimation on rotation{loops:Animation.Infinitefrom:0to:360}}*/loops: Animation.Infinite//此属性保存动画当前是否正在运行。//可以设置 running 属性以声明性地控制动画是否正在运行。//下面的示例将在按下 MouseArea 时为矩形设置动画。/*Rectangle{width:100; height:100NumberAnimation on x{running:myMouse.pressedfrom: 0;to:100}MouseArea{id:myMouse}}*///同样,可以读取 running 属性以确定动画是否正在运行。//在以下示例中,文本项将指示动画是否正在运行。/*NumberAnimation{id:myAnimation}Text{text:myAnimation.running?"Animation is running":"Animation is not running"}*///动画也可以使用 start() 和 stop() 方法从 JavaScript 强制启动和停止。//默认情况下,动画不运行。//但是,当动画被分配给属性时,作为使用 on 语法的属性值源,它们默认设置为运行。running: true//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。NumberAnimation {target: trefoilKnotproperty: "theta"from: 0; to: 360duration: 5000}NumberAnimation {target: trefoilKnotproperty: "phi"from: 0; to: 360duration: 5000}}}Mesh {id: matSpheresource: "qrc:/assets/obj/material-sphere.obj"}Entity {id: sphere1components: [matSphere1Transform,matSphere,matSphere1Material]Transform {id: matSphere1Transformtranslation: Qt.vector3d(-3, 0, 0)rotationY: -90}//此材质使用具有单一渲染通道方法的效果并执行每个片段照明//为 OpenGL 3 和 OpenGL ES 3 提供了技术。MetalRoughMaterial {id: matSphere1Material//保持材料的当前基色。 这可以是纯色值或纹理。 //默认情况下,此属性的值为“灰色”。baseColor:  TextureLoader {source: "qrc:/assets/textures/aluminium_random_brushed/aluminium_random_brushed_basecolor.png"format: Texture.SRGB8_Alpha8generateMipMaps: true}//将材料的当前金属度级别保存为 0(纯介电性,默认值)和 1(纯金属性)之间的值。//这可以是普通的统一值或纹理。 默认情况下,此属性的值为 0。metalness: TextureLoader { source: "qrc:/assets/textures/aluminium_random_brushed/aluminium_random_brushed_metallic.png"; generateMipMaps: true }//保持材料的当前粗糙度级别。//这可以是普通的统一值或纹理。 默认情况下,此属性的值为 0。roughness: TextureLoader { source: "qrc:/assets/textures/aluminium_random_brushed/aluminium_random_brushed_roughness.png"; generateMipMaps: true}//保存材质的当前法线贴图纹理。//这只能是纹理,否则将被忽略。 默认情况下未设置此地图。normal: TextureLoader { source: "qrc:/assets/textures/aluminium_random_brushed/aluminium_random_brushed_normal.png"; generateMipMaps: true }//保存材质的当前环境光遮挡贴图纹理。//这只能是纹理,否则将被忽略。 默认情况下未设置此地图。ambientOcclusion: TextureLoader { source: "qrc:/assets/textures/no-ao.png" }}}Entity {id: sphere2components: [matSphere2Transform,matSphere,matSphere2Material]Transform {id: matSphere2Transformtranslation: Qt.vector3d(-1.5, 0, 0)rotationY: -90}MetalRoughMaterial {id: matSphere2MaterialbaseColor:  TextureLoader {source: "qrc:/assets/textures/american_walnut_crown_cut/american_walnut_crown_cut_basecolor.png"format: Texture.SRGB8_Alpha8generateMipMaps: true}metalness: TextureLoader { source: "qrc:/assets/textures/american_walnut_crown_cut/american_walnut_crown_cut_metallic.png"; generateMipMaps: true }roughness: TextureLoader { source: "qrc:/assets/textures/american_walnut_crown_cut/american_walnut_crown_cut_roughness.png"; generateMipMaps: true }normal: TextureLoader { source: "qrc:/assets/textures/american_walnut_crown_cut/american_walnut_crown_cut_normal.png"; generateMipMaps: true }ambientOcclusion: TextureLoader { source: "qrc:/assets/textures/no-ao.png" }}}Entity {id: sphere3components: [matSphere3Transform,matSphere,matSphere3Material]Transform {id: matSphere3Transformtranslation: Qt.vector3d(0, 0, 0)rotationY: -90}MetalRoughMaterial {id: matSphere3MaterialbaseColor:  TextureLoader {source: "qrc:/assets/textures/ceramic_tiles_brown_tomato/ceramic_tiles_brown_tomato_basecolor.png"format: Texture.SRGB8_Alpha8generateMipMaps: true}metalness: TextureLoader { source: "qrc:/assets/textures/ceramic_tiles_brown_tomato/ceramic_tiles_brown_tomato_metallic.png"; generateMipMaps: true }roughness: TextureLoader { source: "qrc:/assets/textures/ceramic_tiles_brown_tomato/ceramic_tiles_brown_tomato_roughness.png"; generateMipMaps: true }normal: TextureLoader { source: "qrc:/assets/textures/ceramic_tiles_brown_tomato/ceramic_tiles_brown_tomato_normal.png"; generateMipMaps: true }ambientOcclusion: TextureLoader { source: "qrc:/assets/textures/no-ao.png" }}}Entity {id: sphere4components: [matSphere4Transform,matSphere,matSphere4Material]Transform {id: matSphere4Transformtranslation: Qt.vector3d(1.5, 0, 0)rotationY: -90}MetalRoughMaterial {id: matSphere4MaterialbaseColor:  TextureLoader {source: "qrc:/assets/textures/copper_brushed/copper_brushed_basecolor.png"format: Texture.SRGB8_Alpha8generateMipMaps: true}metalness: TextureLoader { source: "qrc:/assets/textures/copper_brushed/copper_brushed_metallic.png"; generateMipMaps: true }roughness: TextureLoader { source: "qrc:/assets/textures/copper_brushed/copper_brushed_roughness.png"; generateMipMaps: true }normal: TextureLoader { source: "qrc:/assets/textures/copper_brushed/copper_brushed_normal.png"; generateMipMaps: true }ambientOcclusion: TextureLoader { source: "qrc:/assets/textures/no-ao.png" }}}Entity {id: sphere5components: [matSphere5Transform,matSphere,matSphere5Material]Transform {id: matSphere5Transformtranslation: Qt.vector3d(3, 0, 0)rotationY: -90}MetalRoughMaterial {id: matSphere5MaterialbaseColor:  TextureLoader {source: "qrc:/assets/textures/gold_leaf_waste/gold_leaf_waste_basecolor.png"format: Texture.SRGB8_Alpha8generateMipMaps: true}metalness: TextureLoader { source: "qrc:/assets/textures/gold_leaf_waste/gold_leaf_waste_metallic.png"; generateMipMaps: true }roughness: TextureLoader { source: "qrc:/assets/textures/gold_leaf_waste/gold_leaf_waste_roughness.png"; generateMipMaps: true }normal: TextureLoader { source: "qrc:/assets/textures/gold_leaf_waste/gold_leaf_waste_normal.png"; generateMipMaps: true }ambientOcclusion: TextureLoader { source: "qrc:/assets/textures/no-ao.png" }}}
}

Lights.qml

import QtQuick 2.1
import Qt3D.Core 2.0
import Qt3D.Render 2.0
import Qt3D.Input 2.0
import Qt3D.Extras 2.0Entity {id: lights// 点光源(脉冲)Entity {components: [//在 Qt 3D 场景中封装点光源对象PointLight {color: "red"intensity: 0.3//指定点光源的恒定衰减。//注意:此属性的确切含义和用途取决于材料实现。constantAttenuation: 1.0//指定点光源的线性衰减。//注意:此属性的确切含义和用途取决于材料实现。linearAttenuation: 0.0//指定点光源的二次衰减。quadraticAttenuation: 0.0025//Animation//动画类型不能直接在 QML 文件中使用。//它的存在是为了提供一组通用属性和方法,可用于从它继承的所有其他动画类型。//尝试直接使用 Animation 类型会导致错误。//PropertyAnimation//提供了一种对属性值的更改进行动画处理的方法。//它可用于以多种方式定义动画://例如,在 Transition 中//要为由于状态更改而更改其 x 或 y 属性的任何对象设置动画,请使用 InOutQuad 缓动曲线:/*Rectangle{id:rectwidth:100;height:100color:"red"states:State{name:"moved"PropertyChanges{target:rect;x:50}}transitions:Transition{PropertyAnimation{properties:"x,y";easing.type:Easing.InOutQuad}}}*///In a Behavior//例如,要对矩形 x 属性的所有更改进行动画处理:/*Rectangle{width:100;height:100color:"red"Behavior on x {PropertyAnimation{}}MouseArea{anchors.fill:parent;onClicked:parent.x = 50}}*///作为属性值源//例如,要重复为矩形的 x 属性设置动画:/*Rectangle{width:100;height:100color:"red"SequentialAnimation on x{loops:Animation.InfinitePropertyAnimation{to:50}PropertyAnimation{to:0]}}}*///在信号处理程序中,例如,在单击时淡出对象:/*MouseArea{anchors.fill:theObjectonClicked:PropertyAnimation{target:theObject;property:"opacity";to:0}}*///独立//例如,要在 500 毫秒内对 rect 的宽度属性进行动画处理,从其当前宽度到 30:/*Rectangle{id:theRectwidth:100;height:100color:"red"//这是一个独立的动画,默认情况下不运行PropertyAnimation{id:animation;target:theRectproperty:"width"to:30;duration:500}MouseArea{anchors.fill:parent;onclicked:animation.running = true }}*///根据动画的使用方式,通常使用的属性集会有所不同。//有关更多信息,请参阅单独的属性文档,以及 Qt 中的动画和转换快速介绍。NumberAnimation on intensity {from: 0.3; to: 0.8;running: trueloops: Animation.Infiniteduration: 1000easing.type: Easing.CosineCurve}},Transform {translation: Qt.vector3d(0.0, 5.0, 0.0)}]}// 定向光(稳定)Entity {components: [DirectionalLight {worldDirection: Qt.vector3d(0.3, -3.0, 0.0).normalized();color: "#fbf9ce"intensity: 0.3}]}Entity {components: [DirectionalLight {worldDirection: Qt.vector3d(-0.3, -0.3, 0.0).normalized();color: "#9cdaef"intensity: 0.15}]}// 聚光灯Entity {components: [SpotLight {localDirection: Qt.vector3d(0.0, -1.0, 0.0)color: "white"intensity: 5.0},Transform {id: spotLightTransformtranslation: Qt.vector3d(0.0, 5.0, 0.0)rotationZ: -60.0SequentialAnimation {loops: Animation.Infiniterunning: trueNumberAnimation {target: spotLightTransformproperty: "rotationZ"from: -60; to: 60duration: 4000easing.type: Easing.InOutQuad}NumberAnimation {target: spotLightTransformproperty: "rotationZ"from: 60; to: -60duration: 4000easing.type: Easing.InOutQuad}}}]}
}

TrefoilKnot.qml

import Qt3D.Core 2.0
import Qt3D.Render 2.0
import Qt3D.Extras 2.9Entity {id: rootproperty real x: 0.0property real y: 0.0property real z: 0.0property real scale: 1.0property real theta: 0.0property real phi: 0.0components: [ transform, mesh, material ]//此材质使用具有单一渲染通道方法的效果并执行每个片段照明。 为 //OpenGL 3 和 OpenGL ES 3 提供了技术。MetalRoughMaterial {id: material//保持材料的当前基色。//这可以是纯色值或纹理。//默认情况下,此属性的值为“灰色”。baseColor: Qt.rgba( 0.8, 0.0, 0.0, 1.0 )//将材料的当前金属度级别保存为 0(//(纯介电性,默认值)和 1(纯金属性)之间的值。//这可以是普通的统一值或纹理。 默认情况下,此属性的值为 0。metalness: 0.2//保持材料的当前粗糙度级别。//这可以是普通的统一值或纹理。 默认情况下,此属性的值为 0。roughness: 0.5}//用于对网格执行变换。//Transform 组件不可在多个实体之间共享//变换被保存为 vector3d scale、四元数旋转和 vector3d 平移组件。//设置 Transform::matrix 属性后,将其分解为这些变换分量并发出相应的变换信号。//提供了几个帮助函数来设置转换;//fromAxisAndAngle 和 fromAxesAndAngles 可用于设置围绕特定轴的旋转,//fromEulerAngles 可用于设置基于欧拉角的旋转,//而rotateAround 可用于相对于本地原点围绕特定点旋转对象。Transform {id: transformtranslation: Qt.vector3d(root.x, root.y, root.z)rotationX: thetarotationY: phiscale: root.scale}Mesh {id: meshsource: "qrc:/assets/obj/trefoil.obj"}
}

在这里插入图片描述


http://www.ngui.cc/el/5239679.html

相关文章

Qt例子学习笔记 - Examples/Qt-6.2.0/charts/areachart

//创建Area Charts //要创建Area Charts&#xff0c;我们需要两个 QLineSeries 实例。 //他们将定义该区域的上下边界。 QLineSeries *series0 new QLineSeries();QLineSeries *series1 new QLineSeries();//我们将数据添加到两个系列并使用流运算符。 *series0 << QPo…

Qt例子学习笔记 - Examples/Qt-6.2.0/charts/barchart

//创建条形图 //条形图在所有条形图中的使用方式相同。 //为了说明各种条形图之间的差异 //我们在示例中使用了相同的数据。 //条形图可视化的数据由 QBarSet 实例定义。 //在这里&#xff0c;我们创建集合并将数据附加到它们。 //数据在此处附加了 << 运算符。 //或者&a…

Qt例子学习笔记 - Examples/Qt-6.2.0/charts/barmodelmapper

//为了显示两家公司的份额偏差&#xff0c; //我们首先创建两个 QBoxPlotSeries 来处理月度数据。 QBoxPlotSeries *acmeSeries new QBoxPlotSeries();acmeSeries->setName("Acme Ltd");QBoxPlotSeries *boxWhiskSeries new QBoxPlotSeries();boxWhiskSeries-&g…

Qt例子学习笔记 - Examples/Qt-6.2.0/charts/callout

//QChart 类提供了两种在场景坐标和系列域&#xff08;由轴范围定义&#xff09;之间映射的方法。 //QPointF QChart::mapToPosition(const QPointF &value, QAbstractSeries *series) //QPointF QChart::mapToValue(const QPointF &position, QAbstractSeries *series…

Qt例子学习笔记 - Examples/Qt-6.2.0/charts/candlestickchart

//创建股票图 //为了显示股票图表&#xff0c;我们首先创建 QCandlestickSeries 来处理每日数据。 //我们还指定了自定义增加和减少的车身颜色。 QCandlestickSeries *acmeSeries new QCandlestickSeries();acmeSeries->setName("Acme Ltd");acmeSeries->setI…

Qt例子学习笔记 - Examples/Qt-6.2.0/charts/chartthemes

//Creating Charts //不同类型的图表分别生成并添加到布局中 //如&#xff0c;折线图创建如下。 其他图表类型的创建与此类似。 //首先创建一个图表。 QChart *chart new QChart();chart->setTitle("Line chart");//生成一组通用的随机数据并将其放置在列表中。 …

Qt例子学习笔记 - Examples/Qt-6.2.0/charts/datetimeaxis

//创建折线图 //要创建折线图&#xff0c;需要 QLineSeries 实例。 让我们创建一个。 QLineSeries *series new QLineSeries();//在图表上&#xff0c;我们将展示太阳黑子的数量如何随时间变化。 //数据&#xff08;来自空间天气预报中心&#xff09;是从文本文件中读取的。 /…

Qt例子学习笔记 - Examples/Qt-6.2.0/charts/donutbreakdown

//创建甜甜圈细分图表 //让我们首先为图表定义一些数据。 QPieSeries *series1 new QPieSerise();series1->setName("Fossil fuels");series1->append("Oil",353295);series1->append("Coal",188500);series1->append("Nature…

Qt例子学习笔记 - Examples/Qt-6.2.0/corelib/ipc/localfortuneclient

main.cpp #include <QApplication>#include "client.h"int main(int argc, char *argv[]) {QApplication app(argc, argv);//[since 5.0] applicationDisplayName : QString//此属性包含此应用程序的用户可见名称//该名称显示给用户&#xff0c;例如在窗口标题…

Qt例子学习笔记 - Examples/Qt-6.2.0/corelib/threads/mandelbrot

//这里的繁重计算是 Mandelbrot 集&#xff0c;它可能是世界上最著名的分形。 //如今&#xff0c;虽然 XaoS 等复杂程序在 Mandelbrot 集合中提供实时缩放 //但标准 Mandelbrot 算法对于我们的目的来说已经足够慢了 //在现实生活中&#xff0c;这里描述的方法适用于大量问题 //…