Qt Quick 3D - Custom Geometry Example▲
Sélectionnez
// Copyright (C) 2023 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
import
QtQuick
import
QtQuick.Controls
import
QtQuick.Layouts
import
QtQuick3D
import
QtQuick3D.Helpers
import
CustomGeometryExample
ApplicationWindow
{
id
:
window
width
:
1280
height
:
720
visible
:
true
title
:
"Custom Geometry Example"
property
bool
isLandscape
:
width
&
gt; height
View3D {
id
:
v3d
anchors.left
:
window.isLandscape ? controlsPane.right :
parent.left
anchors.top
:
window.isLandscape ? parent.top :
controlsPane.bottom
anchors.right
:
parent.right
anchors.bottom
:
parent.bottom
camera
:
camera
environment
:
SceneEnvironment {
id
:
env
backgroundMode
:
SceneEnvironment.Color
clearColor
:
"#002b36"
}
Node {
id
:
originNode
PerspectiveCamera {
id
:
cameraNode
z
:
600
}
}
DirectionalLight {
id
:
directionalLight
color
:
Qt.rgba(0.4, 0.2, 0.6, 1.0)
ambientColor
:
Qt.rgba(0.1, 0.1, 0.1, 1.0)
}
PointLight {
id
:
pointLight
position
:
Qt.vector3d(0
, 0
, 100
)
color
:
Qt.rgba(0.1, 1.0, 0.1, 1.0)
ambientColor
:
Qt.rgba(0.2, 0.2, 0.2, 1.0)
}
Model {
id
:
gridModel
visible
:
false
scale
:
Qt.vector3d(100
, 100
, 100
)
geometry
:
GridGeometry {
id
:
grid
horizontalLines
:
20
verticalLines
:
20
}
materials
:
[
DefaultMaterial {
lineWidth
:
sliderLineWidth.value
}
]
}
Model {
id
:
triangleModel
visible
:
false
scale
:
Qt.vector3d(100
, 100
, 100
)
geometry
:
ExampleTriangleGeometry {
normals
:
cbNorm.checked
normalXY
:
sliderNorm.value
uv
:
cbUV.checked
uvAdjust
:
sliderUV.value
}
materials
:
[
DefaultMaterial {
Texture {
id
:
baseColorMap
source
:
"qt_logo_rect.png"
}
cullMode
:
DefaultMaterial.NoCulling
diffuseMap
:
cbTexture.checked ? baseColorMap :
null
specularAmount
:
0.5
}
]
}
Model {
id
:
pointModel
visible
:
false
scale
:
Qt.vector3d(100
, 100
, 100
)
geometry
:
ExamplePointGeometry {
}
materials
:
[
DefaultMaterial {
lighting
:
DefaultMaterial.NoLighting
cullMode
:
DefaultMaterial.NoCulling
diffuseColor
:
"yellow"
pointSize
:
sliderPointSize.value
}
]
}
Model {
id
:
torusModel
visible
:
false
geometry
:
TorusMesh {
radius
:
radiusSlider.value
tubeRadius
:
tubeRadiusSlider.value
segments
:
segmentsSlider.value
rings
:
ringsSlider.value
}
materials
:
[
PrincipledMaterial {
id
:
torusMaterial
baseColor
:
"#dc322f"
metalness
:
0.0
roughness
:
0.1
}
]
}
OrbitCameraController {
origin
:
originNode
camera
:
cameraNode
}
}
Pane {
id
:
controlsPane
width
:
window.isLandscape ? implicitWidth :
window.width
height
:
window.isLandscape ? window.height :
implicitHeight
ColumnLayout
{
GroupBox
{
title
:
"Mode"
ButtonGroup {
id
:
modeGroup
buttons
:
[ radioGridGeom, radioCustGeom, radioPointGeom, radioQMLGeom ]
}
ColumnLayout
{
RadioButton
{
id
:
radioGridGeom
text
:
"GridGeometry"
checked
:
true
}
RadioButton
{
id
:
radioCustGeom
text
:
"Custom geometry from application (triangle)"
checked
:
false
}
RadioButton
{
id
:
radioPointGeom
text
:
"Custom geometry from application (points)"
checked
:
false
}
RadioButton
{
id
:
radioQMLGeom
text
:
"Custom geometry from QML"
checked
:
false
}
}
}
Pane {
id
:
gridSettings
visible
:
false
ColumnLayout
{
Button
{
text
:
"+ Y Cells"
onClicked
:
grid.horizontalLines +=
1
Layout.alignment
:
Qt.AlignHCenter
}
RowLayout
{
Layout.alignment
:
Qt.AlignHCenter
Button
{
text
:
"- X Cells"
onClicked
:
grid.verticalLines -=
1
}
Button
{
text
:
"+ X Cells"
onClicked
:
grid.verticalLines +=
1
}
}
Button
{
text
:
"- Y Cells"
onClicked
:
grid.horizontalLines -=
1
Layout.alignment
:
Qt.AlignHCenter
}
Label
{
text
:
"Line width (if supported)"
}
Slider
{
Layout.fillWidth
:
true
id
:
sliderLineWidth
from
:
1.0
to
:
10.0
stepSize
:
0.5
value
:
1.0
}
}
}
Pane {
id
:
triangleSettings
visible
:
false
ColumnLayout
{
CheckBox
{
id
:
cbNorm
text
:
"provide normals in geometry"
checked
:
false
}
RowLayout
{
enabled
:
cbNorm.checked
Label
{
Layout.fillWidth
:
true
text
:
"Normal adjust: "
}
Slider
{
id
:
sliderNorm
from
:
0.0
to
:
1.0
stepSize
:
0.01
value
:
0.0
}
}
CheckBox
{
id
:
cbTexture
text
:
"enable base color map"
checked
:
false
}
CheckBox
{
id
:
cbUV
text
:
"provide UV in geometry"
checked
:
false
}
RowLayout
{
enabled
:
cbUV.checked
Label
{
Layout.fillWidth
:
true
text
:
"UV adjust:"
}
Slider
{
id
:
sliderUV
from
:
0.0
to
:
1.0
stepSize
:
0.01
value
:
0.0
}
}
}
}
Pane {
id
:
pointSettings
visible
:
false
RowLayout
{
ColumnLayout
{
RowLayout
{
Label
{
text
:
"Point size (if supported)"
}
Slider
{
id
:
sliderPointSize
from
:
1.0
to
:
16.0
stepSize
:
1.0
value
:
1.0
}
}
}
}
}
Pane {
id
:
torusSettings
visible
:
false
ColumnLayout
{
Label
{
text
:
"Radius: ("
+
radiusSlider.value +
")"
}
Slider
{
id
:
radiusSlider
from
:
1.0
to
:
1000.0
stepSize
:
1.0
value
:
200
}
Label
{
text
:
"Tube Radius: ("
+
tubeRadiusSlider.value +
")"
}
Slider
{
id
:
tubeRadiusSlider
from
:
1.0
to
:
500.0
stepSize
:
1.0
value
:
50
}
Label
{
text
:
"Rings: ("
+
ringsSlider.value +
")"
}
Slider
{
id
:
ringsSlider
from
:
3
to
:
35
stepSize
:
1.0
value
:
20
}
Label
{
text
:
"Segments: ("
+
segmentsSlider.value +
")"
}
Slider
{
id
:
segmentsSlider
from
:
3
to
:
35
stepSize
:
1.0
value
:
20
}
CheckBox
{
id
:
wireFrameCheckbox
text
:
"Wireframe Mode"
checked
:
false
onCheckedChanged
: {
env.
debugSettings.
wireframeEnabled =
checked
torusMaterial.
cullMode =
checked ?
Material.
NoCulling
:
Material.
BackFaceCulling
}
}
}
}
}
states
:
[
State
{
name
:
"gridMode"
when
:
radioGridGeom.checked
PropertyChanges
{
gridModel.visible
:
true
gridSettings.visible
:
true
env.debugSettings.wireframeEnabled
:
false
originNode.position
:
Qt.vector3d(0
, 0
, 0
)
originNode.rotation
:
Qt.quaternion(1
, 0
, 0
, 0
)
cameraNode.z
:
600
}
}
,
State
{
name
:
"triangleMode"
when
:
radioCustGeom.checked
PropertyChanges
{
triangleModel.visible
:
true
triangleSettings.visible
:
true
env.debugSettings.wireframeEnabled
:
false
originNode.position
:
Qt.vector3d(0
, 0
, 0
)
originNode.rotation
:
Qt.quaternion(1
, 0
, 0
, 0
)
cameraNode.z
:
600
}
}
,
State
{
name
:
"pointMode"
when
:
radioPointGeom.checked
PropertyChanges
{
pointModel.visible
:
true
pointSettings.visible
:
true
env.debugSettings.wireframeEnabled
:
false
originNode.position
:
Qt.vector3d(0
, 0
, 0
)
originNode.rotation
:
Qt.quaternion(1
, 0
, 0
, 0
)
cameraNode.z
:
600
}
}
,
State
{
name
:
"qmlMode"
when
:
radioQMLGeom.checked
PropertyChanges
{
torusModel.visible
:
true
torusSettings.visible
:
true
directionalLight.eulerRotation
:
Qt.vector3d(-
40
, 0
, 0
)
directionalLight.color
:
"white"
pointLight.color
:
"white"
pointLight.position
:
Qt.vector3d(0
, 0
, 0
)
originNode.position
:
Qt.vector3d(0
, 0
, 0
)
originNode.eulerRotation
:
Qt.vector3d(-
40
, 0
, 0
)
cameraNode.z
:
600
}
}
]
}
}