GeometryRenderer为什么要渲染线条,而不是三角形

时间:2018-09-07 01:58:44

标签: qt qml qt3d

我正在尝试使用GeometryRenderer程序生成多维数据集。为什么将GeometryRenderer.primitiveType设置为LineLoop,Lines或TriangleFan时一切正常,但是使用Triangles或TrianglesStrip却完全不画任何东西?

query = ("INSERT INTO  billed_items(item_name,billed_qty,price,item_bill_series) VALUES(%s,%s,%s,%s)")
c.execute(query,((name),(no),(price),(series))
conn.commit()

1 个答案:

答案 0 :(得分:3)

如果我按照以下方式修改您的QML,那么我可以看到两个三角形:

import QtQuick 2.2
import Qt3D.Core 2.0
import Qt3D.Render 2.0
import Qt3D.Extras 2.0

Entity {
    id: root
    PhongMaterial { id: material; diffuse: Qt.rgba(0.8, 0., 0., 1.0) }
    GeometryRenderer {
        id: renderer
        primitiveType: GeometryRenderer.Triangles
        instanceCount: 1
        geometry: Geometry {
            Attribute {
                name: defaultPositionAttributeName
                attributeType: Attribute.VertexAttribute
                vertexBaseType: Attribute.Float
                vertexSize: 3
                byteOffset: 0
                byteStride: 3 * 4
                count: 6
                buffer: Buffer {
                    type: Buffer.VertexBuffer
                    data: new Float32Array([
                                    // #1 triangle
                                    -0.9, -0.5, 0.0,
                                    -0.0, -0.5, 0.0,
                                    -0.45, 0.5, 0.0,
                                    // #2 triangle
                                    0.0, -0.5, 0.0,
                                    0.9, -0.5, 0.0,
                                    0.45, 0.5, 0.0,
                                ])
                }
            }
        }
    }
    components: [ renderer, material ]
}

我认为该错误与GeometryRenderer和Entity的错误层次结构有关。

要获得正确的照明,您还需要为GeometryRenderer提供顶点法线。

编辑:

由于GeometryRenderer是否总是需要indexBufferprimitiveType: TrianglesTriangleStrip的{​​{1}}的常见问题,我将提出更为详细的答案。

TriangleFan中的GeometryRenderer不一定不需要索引数组(我不确定primitiveType: Triangles的源代码)。

看不到三角形的原因是:您以错误的顺序定义了顶点!更改Qt3D中顶点的顺序,以使在沿三角形逆时针旋转时,每三个连续的顶点都形成一个三角形。然后,三角形法线将指向您。

或者,从相反的方向看一下您的实体:您将看到两个三角形。

在使用巨大的缓冲区时,由于内存/效率的原因,您不想重复大量的顶点,因此,您绝对应该考虑使用vertexBuffer