Qt Quick 3D - Simple Fog Example▲
Sélectionnez
// Copyright (C) 2022 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
import
QtQuick
import
QtQuick.Controls
import
QtQuick.Layouts
import
QtQuick.Dialogs
import
QtQuick3D
import
QtQuick3D.Helpers
Window
{
id
:
window
width
:
1280
height
:
800
color
:
"black"
visible
:
true
View3D {
id
:
root
anchors.fill
:
parent
Fog {
id
:
theFog
enabled
:
cbFogEnabled.checked
depthEnabled
:
cbDepthEnabled.checked
heightEnabled
:
cbHeightEnabled.checked
transmitEnabled
:
cbTransmitEnabled.checked
density
:
valDensity.value
depthNear
:
valDepth.first.value
depthFar
:
valDepth.second.value
depthCurve
:
valDepthCurve.value
leastIntenseY
:
valHeightMin.value
mostIntenseY
:
valHeightMax.value
heightCurve
:
valHeightCurve.value
transmitCurve
:
valTransmitCurve.value
}
environment
:
SceneEnvironment {
backgroundMode
:
SceneEnvironment.Color
clearColor
:
theFog.color
fog
:
theFog
}
PerspectiveCamera {
id
:
camera
z
:
300
SequentialAnimation
{
running
:
cbAutoMove.checked
loops
:
-
1
NumberAnimation
{
target
:
camera
property
:
"z"
from
:
600
to
:
-
600
duration
:
5000
}
NumberAnimation
{
target
:
camera
property
:
"z"
from
:
-
600
to
:
600
duration
:
5000
}
}
}
DirectionalLight {
}
PointLight {
y
:
100
}
Model {
source
:
"#Rectangle"
eulerRotation.x
:
-
75
y
:
-
200
scale
:
Qt.vector3d(100
, 100
, 100
)
materials
:
PrincipledMaterial {
baseColor
:
"green"
}
}
RandomInstancing {
id
:
randomInstancing
instanceCount
:
2000
position
:
InstanceRange {
from
:
Qt.vector3d(-
500
, -
300
, 0
)
to
:
Qt.vector3d(500
, 300
, -
2000
)
}
scale
:
InstanceRange {
from
:
Qt.vector3d(1
, 1
, 1
)
to
:
Qt.vector3d(50
, 50
, 50
)
}
rotation
:
InstanceRange {
from
:
Qt.vector3d(0
, 0
, 0
)
to
:
Qt.vector3d(180
, 180
, 180
)
}
color
:
InstanceRange {
from
:
"#000000"
to
:
"#ffffff"
}
randomSeed
:
2022
}
Model {
instancing
:
randomInstancing
source
:
"#Sphere"
materials
:
PrincipledMaterial {
}
scale
:
Qt.vector3d(0.005, 0.005, 0.005)
}
WasdController {
controlledObject
:
camera
}
}
Rectangle
{
color
:
"lightGray"
width
:
350
height
:
parent.height -
40
anchors.verticalCenter
:
parent.verticalCenter
x
:
8
radius
:
8
ColumnLayout
{
anchors.centerIn
:
parent
GroupBox
{
title
:
"Fog"
ColumnLayout
{
RowLayout
{
CheckBox
{
id
:
cbFogEnabled
text
:
"Enabled"
checked
:
true
}
Button
{
text
:
"Color: "
+
theFog.color
onClicked
:
colorDialog.open()
}
}
}
}
GroupBox
{
title
:
"Depth Fog"
ColumnLayout
{
CheckBox
{
id
:
cbDepthEnabled
text
:
"Enabled"
checked
:
true
}
RowLayout
{
Label
{
text
:
"Density"
}
Slider
{
id
:
valDensity
focusPolicy
:
Qt.NoFocus
from
:
0.0
to
:
1.0
value
:
1.0
}
Label
{
text
:
valDensity.value.toFixed(2
)
}
}
RowLayout
{
Label
{
text
:
"Near/Far"
}
RangeSlider {
id
:
valDepth
focusPolicy
:
Qt.NoFocus
from
:
-
1000.0
to
:
1000.0
first.value
:
10.0
second.value
:
1000.0
}
}
Label
{
text
:
"Near: "
+
valDepth.first.value.toFixed(2
) +
" Far: "
+
valDepth.second.value.toFixed(2
)
}
RowLayout
{
Label
{
text
:
"Curve"
}
Slider
{
id
:
valDepthCurve
focusPolicy
:
Qt.NoFocus
from
:
0.0
to
:
1.0
value
:
1.0
}
Label
{
text
:
valDepthCurve.value.toFixed(2
)
}
}
}
}
GroupBox
{
title
:
"Height Fog"
ColumnLayout
{
CheckBox
{
id
:
cbHeightEnabled
text
:
"Enabled"
checked
:
false
}
RowLayout
{
Label
{
text
:
"Least Intense Y"
}
Slider
{
id
:
valHeightMin
focusPolicy
:
Qt.NoFocus
from
:
-
1000.0
to
:
1000.0
value
:
10.0
}
}
RowLayout
{
Label
{
text
:
"Most Intense Y"
}
Slider
{
id
:
valHeightMax
focusPolicy
:
Qt.NoFocus
from
:
-
1000.0
to
:
1000.0
value
:
0.0
}
}
Label
{
text
:
"Least intense Y: "
+
valHeightMin.value.toFixed(2
) +
" Most intense Y: "
+
valHeightMax.value.toFixed(2
)
}
RowLayout
{
Label
{
text
:
"Curve"
}
Slider
{
id
:
valHeightCurve
focusPolicy
:
Qt.NoFocus
from
:
0.0
to
:
100.0
value
:
1.0
}
Label
{
text
:
valHeightCurve.value.toFixed(2
)
}
}
}
}
GroupBox
{
title
:
"Light Transmission"
ColumnLayout
{
CheckBox
{
id
:
cbTransmitEnabled
text
:
"Enabled"
checked
:
false
}
RowLayout
{
Label
{
text
:
"Curve"
}
Slider
{
id
:
valTransmitCurve
focusPolicy
:
Qt.NoFocus
from
:
0.0
to
:
100.0
value
:
1.0
}
Label
{
text
:
valTransmitCurve.value.toFixed(2
)
}
}
}
}
}
}
Item
{
width
:
debugViewToggleText.implicitWidth
height
:
debugViewToggleText.implicitHeight
anchors.right
:
parent.right
Label
{
id
:
debugViewToggleText
text
:
"Click here "
+
(dbg.visible ? "to hide DebugView"
:
"for DebugView"
)
anchors.right
:
parent.right
anchors.top
:
parent.top
}
MouseArea
{
anchors.fill
:
parent
onClicked
:
dbg.visible =
!
dbg.visible
DebugView {
y
:
debugViewToggleText.height *
2
anchors.right
:
parent.right
source
:
root
id
:
dbg
visible
:
false
}
}
}
CheckBox
{
id
:
cbAutoMove
anchors.right
:
parent.right
anchors.bottom
:
parent.bottom
text
:
"Auto Move"
checked
:
true
}
ColorDialog
{
id
:
colorDialog
selectedColor
:
theFog.color
onAccepted
:
theFog.color =
selectedColor
}
}