惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

人人都是产品经理
人人都是产品经理
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
P
Privacy International News Feed
Simon Willison's Weblog
Simon Willison's Weblog
I
Intezer
Spread Privacy
Spread Privacy
The Hacker News
The Hacker News
P
Palo Alto Networks Blog
TaoSecurity Blog
TaoSecurity Blog
S
Secure Thoughts
Google Online Security Blog
Google Online Security Blog
H
Heimdal Security Blog
N
News | PayPal Newsroom
Attack and Defense Labs
Attack and Defense Labs
Recent Commits to openclaw:main
Recent Commits to openclaw:main
博客园 - 【当耐特】
Webroot Blog
Webroot Blog
小众软件
小众软件
Help Net Security
Help Net Security
D
Darknet – Hacking Tools, Hacker News & Cyber Security
N
News and Events Feed by Topic
Hacker News - Newest:
Hacker News - Newest: "LLM"
PCI Perspectives
PCI Perspectives
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
The Cloudflare Blog
Cloudbric
Cloudbric
AI
AI
WordPress大学
WordPress大学
博客园 - 聂微东
Jina AI
Jina AI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 三生石上(FineUI控件)
Hacker News: Ask HN
Hacker News: Ask HN
H
Hacker News: Front Page
博客园 - Franky
V
V2EX
Schneier on Security
Schneier on Security
G
GRAHAM CLULEY
S
SegmentFault 最新的问题
有赞技术团队
有赞技术团队
H
Help Net Security
量子位
S
Security @ Cisco Blogs
大猫的无限游戏
大猫的无限游戏
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Recorded Future
Recorded Future
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
J
Java Code Geeks
C
Cisco Blogs
S
Security Affairs

博客园 - surfsky

用阿里的 sketch 插件 FusionDesign 来快速设计中后台 用 Sketch 设计和输出响应式网页 百度、高德、腾讯、天地图、谷歌、必应瓦片图地图切图工具 MapCutter(旧名 MapTiler),支持超大图、高清切片、webgl、leaflet、maptalk、openlayers、cesium netcore 下的 Javascript 表达式求值 netcore 下的 C# 表达式求值 中标麒麟安装SQLServer 中标麒麟上开启MySql 在 MAC 下配置 Nginx Color Schema 配色随笔 .Net与 WebAssembly 随笔 关于Xamarin、Qml、数据绑定、MVC、MVVM 相关的散讲 用Nuget部署程序包 Qt3D Shader Qt QML 2D shader LearnOpenGL Qt3D 5.9 and future FineUI 相关 EntityFramwork 七七八八 Qt qml 单例模式
Qt3D
surfsky · 2017-06-08 · via 博客园 - surfsky
----------------------------------------------
概述
- 请阅读QtHelp: Qt 3D Overview 
    https://www.kdab.com/overview-qt3d-2-0-part-1/
    http://blog.csdn.net/iron_lzn/article/details/51363959
- 上youtube 搜索 Qt 3D 视频
- 上kdab公司的网站,Qt3D的主要代码都是kdab公司提供的
- 建模示例:https://www.kdab.com/qt-3d-animation-easter-teaser/
----------------------------------------------
功能
    2D and 3D rendering     : 2d/3d渲染
    Meshes and Geometry     : 面片和坐标
    Materials               : 材质
    Shaders                 : 着色器
    Shadow mapping          : 阴影贴图(一种实时阴影技术)
    Ambient occlusion       : 环境光遮蔽(一种全局光技术)
    High dynamic range      : 高动态范围(HDR)
    Deferred rendering      : 延迟渲染(一种多光源渲染技术)
    Multitexturing          : 多材质
    Instanced rendering     : 实例渲染
    Uniform Buffer Objects  : 统一缓冲对象(HBO)
    
相关库
    QT += 3dcore 3drender 3dinput 3dlogic 3dextras
    #include <Qt3DCore>
    #include <Qt3DRender>
    #include <Qt3DInput>
    #include <Qt3DLogic>
    #include <Qt3DExtras>
    QT += 3dcore 3drender 3dinput 3dlogic 3dextras qml quick 3dquick
    import Qt3D.Core 2.0      // 节点实体模型,基础变化
    import Qt3D.Render 2.0    // 相机,缓冲,滤镜,图层,面片,光照,特效,材质,Shader,
    import Qt3D.Input 2.0     // 输入
    import Qt3D.Logic 2.0     // 每帧动画控制
    import Qt3D.Extras 2.0    // 第一人称相机,轨道相机,反射贴图,基础模型等
    
继承关系
    Node                            // qt3d 所有类的基类
        Entity                      // 
            Camera                  // 
        Component3D                 // 
            Layer                   // 
            Transform               // 
            CameraLens              // 
            ComputeCommand          // 
            FrameAction             // 
            InputSettings           // 
            KeyboardHandler         // 
            GeometryRenderer        // 
                Mesh                // 面片
                ConeMesh            // 圆锥体 ConeMesh {bottomRadius: 0.05; topRadius: 0; length : 0.1; rings : 10; slices: 10},
                CuboidMesh          // 长方体
                CylinderMesh        // 圆柱体 CylinderMesh{length : size; radius : 0.05; rings : 10; slices: 10}
                PlaneMesh           // 平面  PlaneMesh {width: 1.0; height: 1.0; meshResolution: Qt.size(2, 2)}
                SphereMesh          // 球体  SphereMesh {radius: 1}
                TorusMesh           // 三叶体
            Light                   // 光照基类
                DirectionLight      // 方向光(如太阳)
                PointLight          // 电光源(如灯泡)
                SportLight          // 聚光
            Material                               // 
                Texture2D                          // 
                DiffuseMapMaterial                 // 漫反射贴图材质
                DiffuseSpecularMapMaterial         // 漫反射高光贴图材质
                GoochMaterial                      // Gooch shading model, popular in CAD and CAM applications
                NormalDiffuseMapMaterial           // 
                NormalDiffuseMapAlphaMaterial      // 
                NormalDiffuseSpecularMapMaterial   // 
                PhongMaterial                      // 
                PhongAlphaMaterial                 // 
                PerVertexColorMaterial             // 
        AbstractTextureImage        // 
        Effect                      // 
        FilterKey                   // 
        FrameGraphNode              // FrameGraph 配置基类,用于控制渲染
            LayerFilter             // 层过滤(只显示指定层的对象)
            CameraSelector          // 相机选择器 
            ClearBuffers            // enables clearing of the specific render target buffers with specific values
            DispatchCompute         // FrameGraph node to issue work for the compute shader on GPU
            FrustumCulling          // enables frustum culling of the drawable entities based on the camera view and Geometry bounds of the entities
            NoDraw                  // Prevents from drawing anything
            RenderCapture           // Used to request render capture. User can specify a captureId to identify the request.
            RenderSurfaceSelector   // be used to select the surface
            RenderTargetSelector    // s used to select active RenderTarget for the FrameGraph
            RenderPassFilter        // 
            RenderStateSet          // 
            SortPolicy              // 
            TechniqueFilter         // 
            Viewport                // 
        KeyboardDevice              // 
        RenderPass                  // 
        RenderState                 // 
        RenderTargetOutput          // 
        ShaderPrograme
        CameraController
            FirstPersonCameraController  // 第一人称相机控制器(类似cs)
            OrbitCameraController        // 轨道相机控制器(围绕物体旋转)
        Geometry                    // 
            ConeGeometry            // allows creation of a cone in 3D space
            CuboidGeometry          // allows creation of a cuboid in 3D space.
            CylinderGeometry        // 
            PlaneGeometry           // 
            SphereGeometry          // 
            TorusGeometry           // 


eg
    CuboidMesh {
        id: mesh
        property real multiplier: 0.0256
        xExtent: 512 * multiplier
        yExtent: 768 * multiplier
        zExtent: 2.0
        yzMeshResolution: Qt.size(20, 20)
        xzMeshResolution: Qt.size(20, 20)
        xyMeshResolution: Qt.size(20, 20)
    }

显示OpenGL版本
    Rectangle {
        color: "black"
        Text {
            color: "white"
            anchors.centerIn: parent
            text: "Open%4 %1.%2 %3"
                .arg(OpenGLInfo.majorVersion)
                .arg(OpenGLInfo.minorVersion)
                .arg({0: "NoProfile", 1: "CoreProfile", 2: "CompatibilityProfile"}[OpenGLInfo.profile])
                .arg({0: "Unspecified", 1: "GL", 2: "GLES"}[OpenGLInfo.renderableType])
            styleColor: "#8b8b8b"
            style: Text.Sunken
            font.pointSize: 24
            onTextChanged: {
                Resources.setGlInfo(OpenGLInfo);
            }
        }
    }

----------------------------------------------
Scene3D
提供3d运行场景,嵌在普通qml中
----------------------------------------------
属性
    activeCamera : Camera3D
    activeLight : Light3D
    devicePixelRatio : float
    graphPositionQuery : point
    invalidSelectionPoint : point
    primarySubViewport : rect
    secondarySubViewport : rect
    secondarySubviewOnTop : bool
    selectionQueryPosition : point
    slicingActive : bool
    viewport : rect 
    
示例
    Scene3D {
      id: scene3d
      anchors.fill: parent
      anchors.margins: 10
      focus: true
      aspects: ["input", "logic"]
      cameraAspectRatioMode: Scene3D.AutomaticAspectRatio
      AnimatedEntity {}
    }
          
    

----------------------------------------------
Entity
Entity有个属性component,里面可以容纳 Mesh, Transformation, Audio, Material.....,
这是一种很灵活的方式,可简化3d对象类的层次,也便于扩展。
----------------------------------------------
标准写法
    Entity {
        components: [
            Mesh {source: "assets/obj/toyplane.obj"},
            PhongMaterial {diffuse: "white"; shininess: 50}
        ]
    }
    
从文件中加载场景
    Entity {
        components: [
            SceneLoader {source: "qrc:/assets/test_scene.dae"}
        ]
    }

                      
----------------------------------------------
Camera
import Qt3D.Core 2.0
import Qt3D.Render 2.0
----------------------------------------------
第一人称三角透视相机
    Camera {
        id: mainCamera
        objectName: "mainCamera"
        projectionType: CameraLens.PerspectiveProjection
        fieldOfView: 22.5
        aspectRatio: _window.width / _window.height
        onAspectRatioChanged: console.log( "aspectRatio = " + aspectRatio )
        nearPlane:   0.01
        farPlane:    1000.0
        viewCenter: Qt.vector3d( 0.0, 0.0, 0.0 )
        upVector:   Qt.vector3d( 0.0, 1.0, 0.0 )
    }
    FirstPersonCameraController { camera: mainCamera }
    

轨道透视相机(右键按住拖动,可对准原点旋转相机)
    components: [
        RenderSettings {
            activeFrameGraph: ForwardRenderer {
                clearColor: Qt.rgba(0, 0.5, 1, 1)
                camera: camera
            }
        },
        InputSettings { }
    ]
    Camera {
        id: camera
        projectionType: CameraLens.PerspectiveProjection
        fieldOfView: 45
        aspectRatio: 16/9
        nearPlane : 0.1
        farPlane : 1000.0
        position: Qt.vector3d( 0.0, 0.0, -40.0 )
        upVector: Qt.vector3d( 0.0, 1.0, 0.0 )
        viewCenter: Qt.vector3d( 0.0, 0.0, 0.0 )
    }
    OrbitCameraController { camera: camera}

多角度观测
    Viewport {
          id: mainViewport
          normalizedRect: Qt.rect(0, 0, 1, 1)
          ClearBuffers {
              buffers: ClearBuffers.ColorDepthBuffer
          }
    
          Viewport {
              id: topLeftViewport
              normalizedRect: Qt.rect(0, 0, 0.5, 0.5)
              CameraSelector { id: cameraSelectorTopLeftViewport }
          }
          Viewport {
              id: topRightViewport
              normalizedRect: Qt.rect(0.5, 0, 0.5, 0.5)
              CameraSelector { id: cameraSelectorTopRightViewport }
          }
          Viewport {
              id: bottomLeftViewport
              normalizedRect: Qt.rect(0, 0.5, 0.5, 0.5)
              CameraSelector { id: cameraSelectorBottomLeftViewport }
          }
          Viewport {
              id: bottomRightViewport
              normalizedRect: Qt.rect(0.5, 0.5, 0.5, 0.5)
              CameraSelector { id: cameraSelectorBottomRightViewport }
          }
      }

    


----------------------------------------------
Light
----------------------------------------------
方向光(平行光,如太阳)
    Enity {
        components: [
            DirectionalLight {
                worldDirection: Qt.vector3d(0.3, -3.0, 0.0).normalized();
                color: "#fbf9ce"
                intensity: 0.3
            }
        ]
    }

点光源(如灯泡)
    Entity {
        components: [
            PointLight {
                color: "red"
                intensity: 0.3
                constantAttenuation: 1.0
                linearAttenuation: 0.0
                quadraticAttenuation: 0.0025
            }
        ]
    }

聚光(如舞台聚光灯)
    Entity {
        components: [
            SpotLight {
                localDirection: Qt.vector3d(0.0, -1.0, 0.0)
                color: "white"
                intensity: 0.6
            }
        ]
    }        
    




----------------------------------------------
Material(材质)
贴图相关概念
    https://zhidao.baidu.com/question/167602912.html
    http://www.cnblogs.com/xiuj/p/5875461.html
    -------------------------------------------
    ambient                 : 环境色。物体自己发出的光。
    diffuse map             : 漫反射贴图(色彩贴图), 它的作用是给模型上颜色和材质
    specular map            : 高光贴图,不同材质,在光照下,它们的反射光的强弱都不同
    normal map              : 法线贴图.用来表现凹凸
    -------------------------------------------
    gloss map               : 指示着色器对物体的表面的某些部分着色更亮一点,某些部分更暗一点,因为Gloss Maps只需要单通道, 可用alpha通道的图或灰度图
    emboss bump map         : 做表面的浮雕效果的
    opacity map             : 透明贴图。透明通道制作头发或者损坏的衣服布料等等可以用到
    shininess               : 光泽(0-1)
    lighting map 和 AO map  : 让材质制作更加逼真,更加方便
Qt3D中材质
    用Material组件编写
    提供了几种材质组件,通常是几种贴图方式的组合
        PhongMaterial
        DiffuseMapMaterial
        NormalDiffuseMapMaterial
        GoochMaterial
----------------------------------------------
简单色彩材质
    色彩材质
        ColorMaterial{
            diffuseColor: Qt.rgba(0.2, 0.5, 0.3, 1.0)
            specularColor: Qt.rgba(0, 0, 0, 1.0)
        }
    Phong 基础光照模型材质
        PhongMaterial {
            ambient: Qt.rgba( 0.02, 0.02, 0.02, 1.0 )
            diffuse: Qt.rgba( 0.8, 0.0, 0.0, 1.0 )
            specular: Qt.rgba( 0.8, 0.0, 0.0, 1.0 )
            shininess: 1.0
        }
    PhongAlphaMaterial(带透明通道的基础Phong光照模型材质)
        PhongMaterial {
            ambient: Qt.rgba( 0.02, 0.02, 0.02, 1.0 )
            diffuse: Qt.rgba( 0.8, 0.0, 0.0, 1.0 )
            specular: Qt.rgba( 0.8, 0.0, 0.0, 1.0 )
            shininess: 1.0
            alpha: 0.8
        }
    GoochMaterial
        Gooch光照渲染模型。
        常用于CAD和CAM程序,完全拟真不是该模型的目标,
        该模型同时使用 color 和 brightness 来显示3d表面的弯曲部分;
        该模型混合了漫反射光/冷光/暖光来产生渐变色带,冷光和暖光分别由alpha和beta参数影响。色带区间:[cool + alpha * diffuse, warm + beta * diffuse]
        参数
            shininess : real
            diffuse : color
            specular : color
            coolColor : color
            warmColor : color
            alpha : real
            beta : real
    PerVertexColorMaterial
        Default implementation for rendering the color properties set for each vertex
        帮助上没有任何参数



漫反射贴图材质(Phong光照模型)
    漫反射贴图材质(漫反射由贴图提供)
        DiffuseMapMaterial {
            diffuse: "assets/chest/diffuse.webp"
            specular: Qt.rgba( 0.2, 0.2, 0.2, 1.0 )
            shininess: 2.0
            ambient: color
            textureScale: 1.0
        }
    漫反射高光贴图材质(漫反射和高光均有贴图提供)
        DiffuseSpecularMapMaterial{
            diffuse: "assets/chest/diffuse.webp"
            specular: "assets/chest/specular.webp"
            shininess: 2.0
            ambient: color
            textureScale: 1.0
        }
        
    
凹凸贴图材质(用贴图来模拟细节,减小建模复杂度)
    法线漫反射贴图材质(实现了phong光照和凹凸贴图模型)
        NormalDiffuseMapMaterial {
            ambient: Qt.rgba( 0.05, 0.05, 0.05, 1.0 )
            shininess: 5.0
            textureScale: 1.0
            diffuse: "assets/houseplants/pot.webp"
            normal: "assets/houseplants/pot_normal.webp"
            specular: Qt.rgba( 0.75, 0.75, 0.75, 1.0 )
            }
    法线漫反射贴图质(和前一个的区别?)
        NormalDiffuseMapAlphaMaterial {
            ambient: Qt.rgba( 0.05, 0.05, 0.05, 1.0 )
            shininess: 1.0
            textureScale: 1.0
            diffuse: "qrc:/images/songtitle.png"
            normal: "qrc:/images/normalmap.png"
            specular: color
            }
    法线漫反射高光贴图材质(高光可以指定贴图)
        NormalDiffuseSpecularMapMaterial {
            ambient: Qt.rgba( 0.05, 0.05, 0.05, 1.0 )
            shininess: 10.0
            textureScale: 10.0
            diffuse:  "assets/textures/pattern_09/diffuse.webp"
            normal:   "assets/textures/pattern_09/normal.webp"
            specular: "assets/textures/pattern_09/specular.webp"
            }


自定义材质(使用Shader技术实现)
    示例1
        Material {
            id: instancedPhongMaterial
            effect: Effect {
                techniques: Technique {
                    graphicsApiFilter {
                        api: GraphicsApiFilter.OpenGL
                        profile: GraphicsApiFilter.CoreProfile
                        minorVersion: 2
                        majorVersion: 3
                    }
                    filterKeys: FilterKey { name: "renderingStyle"; value: "forward" }
                    renderPasses: RenderPass {
                        shaderProgram: ShaderProgram {
                            vertexShaderCode: loadSource("qrc:/instanced.vert")
                            fragmentShaderCode: loadSource("qrc:/instanced.frag")
                        }
                    }
                }
            }
        }
    线框材质
        请查看官方示例“Wireframe qml example”
        WireframeMaterial {
            id: wireframeMaterial
            effect: WireframeEffect {}
            ambient: Qt.rgba( 0.2, 0.0, 0.0, 1.0 )
            diffuse: Qt.rgba( 0.8, 0.0, 0.0, 1.0 )
        }
    详见官方示例:Planets qml example
    Texture2D {
          id: diffuseTexture
          minificationFilter: Texture.LinearMipMapLinear
          magnificationFilter: Texture.Linear
          wrapMode {
              x: WrapMode.Repeat
              y: WrapMode.Repeat
          }
          generateMipMaps: true
          maximumAnisotropy: 16.0
          TextureImage {source: "qrc:/texturePalette.png"}  
     }    


----------------------------------------------
Layer(QLayer>)
类似ps中的图层,可在程序中控制某些图层显示隐藏
----------------------------------------------
  import Qt3D.Core 2.0
  import Qt3D.Render 2.0
  Entity {
      id: root
      components: RenderSettings {
          Viewport {
              ClearBuffers {
                  buffers: ClearBuffers.ColorDepthBuffer
                  CameraSelector {
                      camera: mainCamera
                      LayerFilter {layers: [layer1]}
                  }
              }
          }
      }
      Camera { id: mainCamera }

      // scene
      Entity {
          id: renderableEntity
          components: [ mesh, layer1 ]
      }
      Layer { id: layer1 }
      GeometryRenderer { id: mesh }
  }
  
  
  

----------------------------------------------
TechniqueFilter e
----------------------------------------------
import Qt3D.Core 2.0
import Qt3D.Render 2.0
TechniqueFilter {
    property alias camera: cameraSelector.camera
    property alias window: surfaceSelector.surface

    id: root
    objectName : "techniqueFilter"
    matchAll: [ FilterKey { name: "renderingStyle"; value: "forward" } ]  // Select the forward rendering Technique of any used Effect

    RenderSurfaceSelector {
        id: surfaceSelector
        Viewport {
            id: viewport
            objectName : "viewport"
            normalizedRect: Qt.rect(0.0, 0.0, 1.0, 1.0)
            CameraSelector {
                id : cameraSelector
                objectName : "cameraSelector"
                ClearBuffers {
                    buffers : ClearBuffers.ColorDepthBuffer
                    clearColor: "black"
                    SortPolicy {
                        sortTypes: [
                            SortPolicy.StateChangeCost,
                            SortPolicy.Material
                        ]
                    }
                }
            }
        }
    }
}


----------------------------------------------
AspectEngine
----------------------------------------------
3d模拟是AspectEngine来执行等
AbstractAspect
    Behavior 处理组件数据
    
RenderAspect
InputAspect
LoginAspect




----------------------------------------------
FrameGraph & ViewPort & Layer
描述了后期处理逻辑,如:阴影/透明/后期处理/多视图/选择渲染
import Qt3D.Core 2.0
import Qt3D.Render 2.0
----------------------------------------------
默认的RenderSetting
    Entity {
        Camera { id:camera ... }
        FirstPersonCameraController {camera:camera}
        components: [
            RenderSetting{
                activeFrameGraph : ForwardRenderer {camera:camera, clearColor:"transparent"},
                InputSetting{}
            }
        ]
        ...
    }

自定义RenderSetting(多视图)
    RenderSettings {
      id: quadViewportFrameGraph
      property alias topLeftCamera: cameraSelectorTopLeftViewport.camera;
      property alias topRightCamera: cameraSelectorTopRightViewport.camera;
      property alias bottomLeftCamera: cameraSelectorBottomLeftViewport.camera;
      property alias bottomRightCamera: cameraSelectorBottomRightViewport.camera;
      property alias window: surfaceSelector.surface

      activeFrameGraph: RenderSurfaceSelector {
          id: surfaceSelector
          Viewport {
              id: mainViewport
              normalizedRect: Qt.rect(0, 0, 1, 1)

              ClearBuffers {
                  buffers: ClearBuffers.ColorDepthBuffer
              }

              Viewport {
                  id: topLeftViewport
                  normalizedRect: Qt.rect(0, 0, 0.5, 0.5)
                  CameraSelector { id: cameraSelectorTopLeftViewport }
              }

              Viewport {
                  id: topRightViewport
                  normalizedRect: Qt.rect(0.5, 0, 0.5, 0.5)
                  CameraSelector { id: cameraSelectorTopRightViewport }
              }

              Viewport {
                  id: bottomLeftViewport
                  normalizedRect: Qt.rect(0, 0.5, 0.5, 0.5)
                  CameraSelector { id: cameraSelectorBottomLeftViewport }
              }

              Viewport {
                  id: bottomRightViewport
                  normalizedRect: Qt.rect(0.5, 0.5, 0.5, 0.5)
                  CameraSelector { id: cameraSelectorBottomRightViewport }
              }
          }
      }
  }

选择图层渲染
    RenderSurfaceSelector{
        RenderTargetSelector{
            target: sceneTarget
            CameraSelector{
                camera: mainCamera
                ClearBuffer {
                    buffers: ClearBuffers.ColorDepthBuffer
                    clearColor: "white"
                    NoDraw{}
                }
                LayerFilter{
                    layers: [objectsLayer]
                    RenderPassFilter{
                        matchAny: FilterKey{name: "renderPass"; value: "allObjects"}
                    }
                }
                LayerFilter{
                    layers: [enviromentLayer]
                }
            }
        }
    }


----------------------------------------------
CustomMaterial & Effect
----------------------------------------------
import Qt3D.Core 2.0
import Qt3D.Render 2.0
Material {
    // 定义材质的参数
    id: root
    property color ambient: Qt.rgba( 0.05, 0.05, 0.05, 1.0 )
    property color diffuse: Qt.rgba( 0.7, 0.7, 0.7, 1.0 )
    property color specular: Qt.rgba( 0.95, 0.95, 0.95, 1.0 )
    property real shininess: 150.0
    property real lineWidth: 0.8
    property color lineColor: Qt.rgba( 0.0, 0.0, 0.0, 1.0 )
    parameters: [
        Parameter { name: "ka"; value: Qt.vector3d(root.ambient.r, root.ambient.g, root.ambient.b) },
        Parameter { name: "kd"; value: Qt.vector3d(root.diffuse.r, root.diffuse.g, root.diffuse.b) },
        Parameter { name: "ks"; value: Qt.vector3d(root.specular.r, root.specular.g, root.specular.b) },
        Parameter { name: "shininess"; value: root.shininess },
        Parameter { name: "line.width"; value: root.lineWidth },
        Parameter { name: "line.color"; value: root.lineColor }
    ]

    // 具体的效果实现逻辑(使用Shader实现)
    effect: Effect {
        parameters: [
            Parameter { name: "ka";  value: Qt.vector3d( 0.1, 0.1, 0.1 ) },
            Parameter { name: "kd";  value: Qt.vector3d( 0.7, 0.7, 0.7 ) },
            Parameter { name: "ks";  value: Qt.vector3d( 0.95, 0.95, 0.95 ) },
            Parameter { name: "shininess"; value: 150.0 }
        ]
        techniques: [
            Technique {
                graphicsApiFilter {
                    api: GraphicsApiFilter.OpenGL
                    profile: GraphicsApiFilter.CoreProfile
                    majorVersion: 3
                    minorVersion: 1
                }
                filterKeys: [ FilterKey { name: "renderingStyle"; value: "forward" } ]
                parameters: [
                    Parameter { name: "light.position"; value: Qt.vector4d( 0.0, 0.0, 0.0, 1.0 ) },
                    Parameter { name: "light.intensity"; value: Qt.vector3d( 1.0, 1.0, 1.0 ) },
                    Parameter { name: "line.width"; value: 1.0 },
                    Parameter { name: "line.color"; value: Qt.vector4d( 1.0, 1.0, 1.0, 1.0 ) }
                ]
                // 渲染通道
                renderPasses: [
                    RenderPass {
                        shaderProgram: ShaderProgram {
                            vertexShaderCode:   loadSource("qrc:/Materials/Shaders/robustwireframe.vert")
                            geometryShaderCode: loadSource("qrc:/Materials/Shaders/robustwireframe.geom")
                            fragmentShaderCode: loadSource("qrc:/Materials/Shaders/robustwireframe.frag")
                        }
                    }
                ]
            }
        ]
    }
}
shader 详见Qt3D.Shader章节




----------------------------------------------
ObjectPicker & animation(5.9)
https://www.kdab.com/qt-3d-animation-easter-teaser/
ClipAnimator 5.9 提供。可加载设计好的动画
----------------------------------------------
Entity {
    id: cube 
    components: [
        Transform {
            id: cubeTransform
        },
        Mesh {
            source: "qrc:/assets/egg/egg.obj"
        },
        TexturedMetalRoughMaterial {
            baseColor: TextureLoader {
                format: Texture.SRGB8_Alpha8
                source: "qrc:/assets/egg/basecolor.png"
            }
            metalness: TextureLoader { source: "qrc:/assets/egg/metalness.png" }
            roughness: TextureLoader { source: "qrc:/assets/egg/roughness.png" }
            normal: TextureLoader { source: "qrc:/assets/egg/normal.png" }
            ambientOcclusion: TextureLoader { source: "qrc:/assets/egg/ambientocclusion.png" }
        },
        ObjectPicker {
            onClicked: animator.running = true
        },
        ClipAnimator {
            id: animator
            loops: 3
            clip: AnimationClipLoader { source: "qrc:/jumpinganimation.json" }
            channelMapper: ChannelMapper {
                mappings: [
                    ChannelMapping { channelName: "Location"; target: cubeTransform; property: "translation" },
                    ChannelMapping { channelName: "Rotation"; target: cubeTransform; property: "rotation" },
                    ChannelMapping { channelName: "Scale"; target: cubeTransform; property: "scale3D" }
                ]
            }
        }
    ]
}




----------------------------------------------
-- 批量生成对象
----------------------------------------------
   NodeInstantiator {
      id: collection
      property int maxCount: parent.numberOfBars
      model: maxCount
      delegate: BarEntity {
          id: cubicEntity
          entityMesh: CuboidMesh {xExtent: 0.1; yExtent: 0.1; zExtent: 0.1}
          rotationTimeMs: sceneRoot.barRotationTimeMs
          entityIndex: index
          entityCount: sceneRoot.numberOfBars
          entityAnimationsState: animationState
          magnitude: 0
      }
    }

    NodeInstantiator {
        id: grid
        model: rows * columns
        property int rows: 6
        property int columns: 11

        Entity {
            property int _row: index / grid.columns
            property int _col: index % grid.columns

            components: [ sphereTransform, sphereMesh, sphereMaterial ]
            SphereMesh {
                id: sphereMesh
                slices: 60
                rings: 60
                radius: 0.65
            }
            Transform {
                id: sphereTransform
                translation: Qt.vector3d(-7.5 + _col * 1.5, -4.0 + _row * 1.5, 0)
            }
            MetalRoughMaterial {
                id: sphereMaterial
                baseColor: scene.baseColor
                metalness: 0.2 * _row
                roughness: 0.1 * _col
            }
        }
    }


----------------------------------------------
-- 杂
----------------------------------------------  
KeyboardInput
    可响应键盘消息
    
    
LogicComponent
    可设置逻辑。如物体位置/精灵创建/离屏销毁等。
    
    
FrameGraph
    如何渲染场景
    
    
CameraSelector NoDraw    
    Viewport {
      CameraSelector {
          ClearBuffers {
              buffers: ClearBuffers.ColorDepthBuffer
              NoDraw { } // Prevents from drawing anything
          }
          RenderPassFilter {
              ...
          }
          RenderPassFilter {
              ...
          }
      }
    }

ClearBuffers
    ClearBuffers {
      buffers: ClearBuffers.DepthBuffer
      CameraSelector {
          id: lightCameraSelector
      }
    }
    

--------------------------------------------------    
三维旋转控制
-------------------------------------------------- 
    // 旋转
    Transform {
        id: modelTransform
        property real angle: 0
        matrix: {
            var m = cameraMatrix.inverted();
            m.translate(Qt.vector3d(6,
                                    -4 - (1.0 - showDetailsTransitionState) * 10,
                                    -20 * showDetailsTransitionState));
            m.rotate(modelTransform.angle, Qt.vector3d(0, 1, 0));  // 动画绕y轴旋转360度
            m.rotate(15, Qt.vector3d(0, 0, 1)); // 沿z轴倾斜15度
            return m;
        }
    }
    
    //
    Transform {
        id: cameraRotationTransform
        matrix: {
            var m = Qt.matrix4x4();
            m.rotate(-19 * window.carouselOffset, Qt.vector3d(0.0, 1.0, 0.0));
            m.rotate(5 * mainCamera.roll, Qt.vector3d(0.0, 0.0, 1.0));
            m.lookAt(Qt.vector3d( 0.0, 0.0, 0.0 ),
                     Qt.vector3d(-40 * Math.sin(mainCamera.yaw), mainCamera.roll * 3, -40 * Math.cos(mainCamera.yaw) ),
                     Qt.vector3d( 0.0, 1.0, 0.0 ));
            return m;
        }
    }
    
    Transform {
        id: modelTransform
        matrix: {
            var m = cameraMatrix.inverted();
            m.translate(Qt.vector3d(0.0, -1.5 + (1.5 * showDetailsTransitionState), -40));
            m.rotate(40 * Math.min(1.0, showDetailsTransitionState * 1.5), Qt.vector3d(0, 1, 0));
            m.translate(Qt.vector3d(-25 * Math.max(0, showDetailsTransitionState - 0.4), 0.0, 0.0));
            return m;
        }
    }    
-------------------------------------------------- 
贴图位置的控制
-------------------------------------------------- 
import Qt3D.Core 2.0
import Qt3D.Render 2.0
Texture2D {
    property alias source: image.source
    minificationFilter: Texture.LinearMipMapLinear
    magnificationFilter: Texture.Linear
    generateMipMaps: true
    wrapMode {
        x: WrapMode.ClampToEdge
        y: WrapMode.ClampToEdge
    }
    TextureImage {
        id: image
    }
}