Qt 3D QML Geometry Renderer
Я пытаюсь использовать QML GeometryRenderer для рисования моей собственной 3D-геометрии, но что-то идет не так. Я добавил другие 3D-элементы, чтобы проверить, отображаются ли они, и это происходит. у кого-нибудь есть предложения? Я думаю, что проблема связана с определением геометрии. когда я изменяю свою собственную геометрию с помощью хорошо известной SphereGeometry внутри GeometryRenderer, сфера отображается правильно. Я не могу найти полную документацию на веб-сайте 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 ответ
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
])
}