问题描述
尝试为 QtQuick3D 实现自定义几何:
mycustomgeometry.h:
#ifndef MYCUSTOMGEOMETRY_H
#define MYCUSTOMGEOMETRY_H
#include <QQuick3DGeometry>
class MyCustomGeometry : public QQuick3DGeometry
{
Q_OBJECT
public:
MyCustomGeometry();
virtual ~MyCustomGeometry();
signals:
public slots:
void setData(QByteArray vertexData,QByteArray indexData);
};
#endif // MYCUSTOMGEOMETRY_H
mycustomgeometry.cpp:
#include "mycustomgeometry.h"
#include <QVector3D>
// simulate data coming from my application (should look like a cut cuboid)
static unsigned char vertexData[] = {
0x00,0x00,0xe0,0xb3,0x8c,0xca,0x4c,0xbd,0x1c,0x63,0x89,0x3d,0x60,0x35,0x0c,0xcf,0xa4,0x61,0x64,0x2e,0x37,0xb8,0xcc,0x2a,0xb7,0xbc,0x68,0x2d,0xe4,0x2f,0x80,0xcb,0x18,0xf0,0xcd,0x28,0x2c,0xd8,0xf8,0xce,0xa0,0x20,0xbd
};
static unsigned char indexData[] = {
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x00
};
MyCustomGeometry::MyCustomGeometry()
{
QByteArray v(reinterpret_cast<char*>(::vertexData),sizeof(::vertexData));
QByteArray i(reinterpret_cast<char*>(::indexData),sizeof(::indexData));
setData(v,i);
}
MyCustomGeometry::~MyCustomGeometry()
{
}
void MyCustomGeometry::setData(QByteArray vertexData,QByteArray indexData)
{
clear();
setPrimitiveType(PrimitiveType::Triangles);
addAttribute(Attribute::PositionSemantic,Attribute::F32Type);
addAttribute(Attribute::IndexSemantic,Attribute::U32Type);
addAttribute(Attribute::normalSemantic,Attribute::F32Type);
setVertexData(vertexData);
setIndexData(indexData);
setStride(sizeof(float) * 3);
QVector3D boundsMin,boundsMax;
auto vertices = reinterpret_cast<const float*>(vertexData.constData());
for(size_t i = 0; i < vertexData.length() / sizeof(float); i += 3)
{
for(size_t j = 0; j < 3; j++)
{
boundsMin[j] = (std::min(vertices[i + j],i == 0 ? vertices[i + j] : boundsMin[j]));
boundsMax[j] = (std::max(vertices[i + j],i == 0 ? vertices[i + j] : boundsMax[j]));
}
}
setBounds(boundsMin,boundsMax);
}
main.qml:
import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick3D 1.15
import QtQuick3D.Helpers 1.15
import QtQuick.Controls 2.15
import MyCustomGeometry 1.0
Window {
id: mainWindow
width: 400
height: 300
visible: true
flags: Qt.Tool
title: qsTr("3D demo")
View3D {
id: view
anchors.fill: parent
camera: camera
renderMode: View3D.Overlay
PerspectiveCamera {
id: camera
position: Qt.vector3d(0,200,300)
eulerRotation.x: -30
}
WasdController {
controlledobject: camera
mouseEnabled: true
}
DirectionalLight {
eulerRotation.x: -30
}
Model {
id: cube
objectName: "cube"
visible: true
position: Qt.vector3d(-100,0)
scale: Qt.vector3d(slider.k,slider.k,slider.k)
source: "#Cube"
materials: [DefaultMaterial {diffuseColor: "red"}]
eulerRotation.y: 90
}
Model {
id: sphere
objectName: "sphere"
visible: true
position: Qt.vector3d(100,slider.k)
//source: "#Sphere"
geometry: MyCustomGeometry {}
materials: [DefaultMaterial {diffuseColor: "blue"}]
eulerRotation.y: 90
}
}
Slider {
id: slider
property real k: Math.pow(10,slider.value)
from: -3; to: 6; value: 3
}
}
立方体和球体(注释 geometry:
和取消注释 source:
时)正确显示。
但是带有自定义几何图形的模型没有。
我也尝试使用 16 位整数作为索引,但得到了相同的结果。
编辑:在 Qt 6.0.0 上测试过并且可以工作,所以这是一个仅限于 Qt 5.15.2 的问题
解决方法
如果按照 {{3}} 设置 const BotsGrid = () => {
const [icons,setIcons] = useState({
SapIcon: SapIcon,ExcelIcon: ExcelIcon,OutlookIcon: OutlookIcon,BrowserIcon: BrowserIcon,OneDriveIcon: OneDriveIcon,XhisIcon: XhisIcon
});
属性,它也适用于 Qt 5:
name