当前位置:   article > 正文

Qt3D模块初探_qt用什么开发3d

qt用什么开发3d

0.前言

Qt3D 是由诺基亚发起,后由 Digia 和 KDAB 完善(新版貌似基本都是 KDAB 做的),基于 OpenGL 的三维图像展示和处理模块。可惜的是, Qt3D 的资料比较少,而且随着版本更迭,很多网上老的 Demo 也不能跑了。

除了 QtCreator 中的示例,这里推荐几个 Qt3D 的 github 项目,可以参照学习:

https://github.com/MidoriYakumo/learnopengl-qt3d

https://github.com/jaredtao/Qt3D-learn

https://github.com/KDAB/qt3d-examples

此外,可以看下 Qt3D 概述:https://doc.qt.io/qt-5/qt3d-overview.html

因为我也刚玩,所以很多东西还不了解,慢慢学。文本代码链接:https://github.com/gongjianbo/HelloQt3D

1.在QtQuick中使用Qt3D

使用前,先把会用到的Qt3D模块加到pro文件中:

  1. QT += qml quick
  2. QT += 3dcore 3drender 3dinput 3dlogic 3dextras 3dquick 3danimation

要创建一个3D场景嵌入到QtQuick中,需要一个Scene3D对象。在Scene中,我们通过Entity来定义我们的3D对象。多个Entity的组织结构就类似对象树,Scene3D需要一个根Entity来定义一些基本的行为,一个简单的空窗口示例如下:

  1. import QtQuick 2.15
  2. import QtQuick.Scene3D 2.15
  3. import Qt3D.Core 2.15
  4. import Qt3D.Render 2.15
  5. Item{
  6. //创建3d场景嵌入到QtQuick
  7. Scene3D {
  8. id: scene3d
  9. anchors.fill: parent
  10. anchors.margins: 20
  11. //实体Entity是一个Node子类,可以聚合几个Component3D实例来指定其行为
  12. //根实体
  13. Entity {
  14. //RenderSettings组件必须为场景根实体的组件。
  15. //它指定渲染策略和选择设置,并托管活动的FrameGraph
  16. RenderSettings {
  17. //相当于glClearColor
  18. activeFrameGraph: ClearBuffers {
  19. buffers: ClearBuffers.ColorBuffer
  20. clearColor: Qt.rgba(0.0,0.5,0.0,1.0)
  21. RenderSurfaceSelector {
  22. // Default render output: window surface
  23. }
  24. }
  25. }
  26. }
  27. }
  28. Text {
  29. anchors.centerIn: parent
  30. text: "First Window"
  31. }
  32. }

Qt3D为我们提供了一些基本的Mesh、Material组件,对于简单的应用,我们可以直接拼接这些基本形状(我本一些基本的信息都写在了代码注释上):

  1. import QtQuick.Scene3D 2.15
  2. import Qt3D.Core 2.15
  3. import Qt3D.Render 2.15
  4. import Qt3D.Input 2.15
  5. import Qt3D.Extras 2.15
  6. import Qt3D.Logic 2.15
  7. //创建3d场景嵌入到QtQuick
  8. Scene3D {
  9. //自动宽高比
  10. cameraAspectRatioMode: Scene3D.AutomaticAspectRatio
  11. aspects: ["logic", "input"]
  12. //实体Entity是一个Node子类,可以聚合几个Component3D实例来指定其行为
  13. //根实体
  14. Entity {
  15. id: root
  16. //相机
  17. Camera {
  18. id: camera
  19. //透视投影
  20. projectionType: CameraLens.PerspectiveProjection
  21. fieldOfView: 45
  22. nearPlane: 0.1
  23. farPlane: 1000.0
  24. position: Qt.vector3d(0.0, 0.0, 10.0)
  25. upVector: Qt.vector3d(0.0, 1.0, 0.0)
  26. viewCenter: Qt.vector3d(0.0, 0.0, 0.0)
  27. }
  28. //用于控制相机
  29. OrbitCameraController {
  30. // 鼠标左键按下,沿x轴或y轴拖动时,移动相机位置
  31. // 鼠标右键按下,沿x轴或y轴拖动时,控制相机偏转
  32. camera: camera
  33. }
  34. //RenderSettings组件必须为场景根实体的组件。
  35. //它指定渲染策略和选择设置,并托管活动的FrameGraph
  36. RenderSettings {
  37. //正向渲染。逐个光源计算的一种渲染方式。
  38. activeFrameGraph: ForwardRenderer {
  39. camera: camera
  40. clearColor: Qt.rgba(0.0, 0.3, 0.0, 1.0)
  41. }
  42. }
  43. //InputSettings组件必须为场景根实体的组件。
  44. //它存储一个指向对象的指针,该对象充当各种输入类要处理的输入事件的源。
  45. InputSettings{
  46. }
  47. //物体Node
  48. Entity {
  49. PhongMaterial {
  50. id: material
  51. //环境光
  52. ambient: "gray"
  53. //漫反射光
  54. diffuse: "orange"
  55. //镜面高光
  56. specular: "yellow"
  57. //高光半径
  58. shininess:32
  59. }
  60. /*CuboidMesh {
  61. id: cube
  62. }
  63. Transform {
  64. id: trans
  65. matrix: {
  66. let m = Qt.matrix4x4();
  67. //旋转下角度,默认正视的看不出效果
  68. m.rotate(45, Qt.vector3d(1, 1, 0))
  69. return m;
  70. }
  71. }
  72. components: [material, cube, trans]*/
  73. Entity{
  74. id: sub1
  75. CuboidMesh {
  76. id: cube1
  77. xExtent: 2
  78. zExtent: 2
  79. }
  80. Transform {
  81. id: trans1
  82. matrix: {
  83. let m = Qt.matrix4x4();
  84. //矩形旋转下角度,默认正视的看不出效果
  85. m.rotate(45, Qt.vector3d(1, 1, 0))
  86. return m;
  87. }
  88. }
  89. components: [cube1, trans1,material]
  90. }
  91. Entity{
  92. id:sub2
  93. SphereMesh {
  94. id: ball2
  95. //半径默认为1
  96. radius: 1
  97. //网格环数
  98. rings: 2
  99. //网格切片数
  100. slices: 10
  101. }
  102. Transform {
  103. id: trans2
  104. matrix: {
  105. let m = Qt.matrix4x4();
  106. //和另一个mesh错开位置
  107. m.translate(Qt.vector3d(3, 0, 0))
  108. return m;
  109. }
  110. }
  111. components: [ball2, trans2,material]
  112. }
  113. }
  114. }
  115. }

2.画一个三角

没有三角的3D学习是不完整的,要画三角,需要给Entity添加GeometryRenderer几何渲染对象和Material材质对象。顶点信息在Geometry中,而着色器在Matrial中:

  1. import QtQuick 2.15
  2. import QtQuick.Scene3D 2.15
  3. import Qt3D.Core 2.15
  4. import Qt3D.Render 2.15
  5. import Qt3D.Extras 2.15
  6. //Qt3D QML的文档不怎么详细,有些可以参见CPP版本的
  7. //创建3d场景嵌入到QtQuick
  8. Scene3D{
  9. id:scene
  10. anchors.fill: parent
  11. //根实体Entity
  12. Entity {
  13. //RenderSettings组件必须为场景根实体的组件。
  14. //它指定渲染策略和选择设置,并托管活动的FrameGraph
  15. RenderSettings {
  16. id: renderSettings
  17. //保存当前活动的FrameGraph
  18. //Qt 3D渲染方面允许渲染算法完全由数据驱动。
  19. //该控制的数据结构被称为framegraph
  20. activeFrameGraph: ClearBuffers {
  21. //为什么ColorBuffer渲染不出来三角?
  22. buffers: ClearBuffers.ColorDepthBuffer
  23. clearColor: Qt.rgba(0.0,0.5,0.0,1.0)
  24. //可以用来选择Qt3D渲染内容的表面。
  25. //该表面可以是窗口表面或屏幕外表面。
  26. RenderSurfaceSelector {
  27. //与可以在RenderPass上设置的每个材质状态相反,
  28. //在RenderStateSet上设置的状态是全局设置的
  29. RenderStateSet {
  30. renderStates: DepthTest {
  31. //如果片段深度小于z缓冲区值,则通过深度测试
  32. depthFunction: DepthTest.Less
  33. }
  34. }
  35. }
  36. }
  37. }
  38. //三角实体Entity
  39. Entity{
  40. //几何渲染器
  41. GeometryRenderer {
  42. id: geometry
  43. //几何体
  44. //Geometry类型用于将Attribute对象列表分组在一起,
  45. //以形成Qt3D能够使用GeometryRenderer渲染的几何形状。
  46. geometry: Geometry {
  47. //属性Attribute,对应Shader中的attribute
  48. Attribute {
  49. id: position
  50. attributeType: Attribute.VertexAttribute
  51. vertexBaseType: Attribute.Float
  52. vertexSize: 3
  53. count: 3
  54. name: "position"
  55. buffer: Buffer {
  56. type: Buffer.VertexBuffer
  57. usage: Buffer.StaticDraw
  58. accessType: Buffer.Write
  59. data: new Float32Array(
  60. [
  61. -0.5, -0.5, 0.0,
  62. 0.5, -0.5, 0.0,
  63. 0.0, 0.5, 0.0,
  64. ])
  65. }
  66. }
  67. }
  68. }//end GeometryRenderer
  69. //材质定义如何渲染Entity
  70. Material {
  71. id: material
  72. effect: Effect {
  73. //一个渲染方法Technique指定一组RenderPass对象,FilterKey对象,Parameter对象和GraphicsApiFilter,
  74. //它们共同定义了给定图形API可以渲染的渲染技术。
  75. techniques: Technique {
  76. //指定使用的图形API过滤器
  77. //profile 默认为 NoProfile。 Core模式时,设置为CoreProfile。精简。
  78. graphicsApiFilter.profile: GraphicsInfo.profile === GraphicsInfo.CoreProfile ?
  79. GraphicsApiFilter.CoreProfile : GraphicsApiFilter.NoProfile
  80. //指定tehcnique使用的渲染通道
  81. renderPasses: RenderPass {
  82. //着色器
  83. shaderProgram: ShaderProgram {
  84. //GLSL可以用字符串或者文件
  85. vertexShaderCode: vertStr
  86. //vertexShaderCode: loadSource('qrc:/triangle1.vert')
  87. fragmentShaderCode: fragStr
  88. //fragmentShaderCode: loadSource('qrc:/triangle1.frag')
  89. }
  90. }
  91. }
  92. }
  93. }//end Material
  94. components: [geometry, material]
  95. }
  96. }
  97. property string vertStr: '
  98. #version 330 core
  99. layout (location = 0) in vec3 position;
  100. void main()
  101. {
  102. gl_Position = vec4(position, 1.0f);
  103. }
  104. '
  105. property string fragStr: '
  106. #version 330 core
  107. out vec4 color;
  108. void main()
  109. {
  110. color = vec4(0.0f, 1.0f, 0.0f, 1.0f);
  111. }
  112. '
  113. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/619098
推荐阅读
相关标签
  

闽ICP备14008679号