Qt 3D QML几何渲染器

时间:2019-01-28 14:05:20

标签: qml qt3d

我正在尝试使用QML GeometryRenderer绘制自己的3D几何,但是出了点问题。我添加了其他3D元素以检查它们是否显示,并且发生这种情况。有任何建议吗?我认为问题在于几何定义。当我在GeometryRenderer中使用众所周知的SphereGeometry更改自己的几何时,将正确显示球体。我无法在Qt网站上找到完整的文档,甚至无法找到一个简单的示例来进行测试并用作初始项目。

在以下我的代码中:

GeometryRender.qml

import Qt3D.Core 2.12
import Qt3D.Render 2.12
import Qt3D.Extras 2.12

Entity {
    id: root
    PhongMaterial { id: material; diffuse: Qt.rgba(1.0, 0., 0., 1.0) }


    GeometryRenderer {
                id: geometry


                primitiveType: GeometryRenderer.Triangles


                 geometry: Geometry {
                    boundingVolumePositionAttribute: position

                    Attribute {
                        id: position
                        attributeType: Attribute.VertexAttribute
                        vertexBaseType: Attribute.Float
                        vertexSize: 3
                        count: 2
                        byteOffset: 0
                        byteStride: 3 * 4// 5
                        name: defaultPositionAttributeName
                        buffer: vertexBuffer
                    }


               }

                Buffer {
                    id: vertexBuffer
                    type: Buffer.VertexBuffer
                    data: new Float32Array([
                      -2.0, -2.0, -2.0,
                       2.0, -2.0, -2.0,
                       2.0,  2.0, -2.0,

                       -2.0, -2.0, -2.0,
                        2.0,  2.0, -2.0,
                        2.0, -2.0, -2.0,

                    ])
                }
            }

    components: [geometry, material ]
}

1 个答案:

答案 0 :(得分:0)

count中的Attribute变量需要设置为您在vertexBuffer中提供的顶点数。

Attribute {
  id: position
  attributeType: Attribute.VertexAttribute
  vertexBaseType: Attribute.Float
  vertexSize: 3
  count: 6
  byteOffset: 0
  byteStride: 3 * 4// 5
  name: defaultPositionAttributeName
  buffer: vertexBuffer
}

另一种可能性是避免顶点重复,而是提供一个indexBuffer。 然后,相关部分将如下所示:

geometry: Geometry {
  boundingVolumePositionAttribute: position
  Attribute {
    attributeType: Attribute.VertexAttribute
    vertexBaseType: Attribute.Float
    vertexSize: 3
    count: 3
    byteOffset: 0
    byteStride: 3 * 4 // 1 vertex (=3 coordinates) * sizeof(float)
    name: defaultPositionAttributeName
    buffer: vertexBuffer
  }
  Attribute {
    attributeType: Attribute.IndexAttribute
    vertexBaseType: Attribute.UnsignedInt
    vertexSize: 1
    count: 6
    byteOffset: 0
    byteStride: 1 * 4 // 1 index * sizeof(Uint32)
    buffer: indexBuffer
  }
}
Buffer {
  id: vertexBuffer
  type: Buffer.VertexBuffer
  data: new Float32Array([
    -2.0, -2.0, -2.0,
    2.0, -2.0, -2.0,
    2.0,  2.0, -2.0
  ])
}
Buffer {
  id: indexBuffer
  type: Buffer.IndexBuffer
  data: new Uint32Array([
    0, 1, 2,
    0, 2, 1
  ])
}