Contents

Qt 3D

› Features

Qt 3D C++ Classes

Qt3D.Core Qt3D.Input Qt3D.Logic Qt3D.Render

Qt 3D QML Types Modules

Qt3D.Core Qt3D.Input Qt3D.Logic Qt3D.Render

Qt 3D QML/C++ Examples

Audio Visualizer Example
Materials QML&C++ Example
Multi Viewport QML Example
Planets QML Example
Scene3D QML Example
Shadow Map QML Example
Simple QML&C++ Example
Wave QML Example
Wireframe QML Example
Basic Shapes C++ Example
Deferred Renderer C++ Example

Drawing with Qt 3D

 Transforms
 Textures
 Geometries
 Lights
 Materials

 

Trends in 3D

> 3D 유저 인터페이스 를 사용하는 산업 군이 확대 되고 있습니다.

> Automotive IVI 시스템
> Medical Learning 시스템에서의 3D UI 도입> 공장자동화 시스템의 3D UI 사용
> 지형 모델링의 3D 유저 인터페이스
> 애니메이션의 3D 모델링
> 자동차 와 같은 제품의 3D 시각화 구현

> Virtual Reality 가 현실화 되고 있습니다.

> 가상현실 체험 가능한 제품 군 출시
> VR과 AR을접목시킨 가상 현실 체험 제품 출시
> Oculus Rift, Steam VR/HTC VIVE, SONY Morpheus, 삼성 Gear VR, 구글 카드보드 등

> 다양한 산업 군에 접목시키는 가상현실 제품이 확대되고 있습니다.

> Microsoft HoleLens, magic Leap 등

> 360º 촬영 가능한 이미지 & 비디오 시스템이 출시 되었습니다.

> GoPro Odyssey 를 이용한 구글 카드보드 & Jump
> Ricoh THETA
> 노키아 OZO

> 3D Scanning  과 3D Printing 시스템이 발전하고 있습니다.

 

Qt 3D

> Qt 3D 는 Qt&OpenGL 로 만든 High Level 3D API 로서 Native C++와 Qt Quick API 를 제공하고 모든 종류의 Rendering 구현이 가능합니다.
> Qt는 3D 와 OpenGL Contents 를 쉽게 통합 개발 가능한 장점으로 지금까지 수많은 3D 솔루션들을 제작해 왔습니다.
> Qt 3D는 확장성이 용이하고 Multithread 지원이 가능한 아키텍처로 구성되며 Qt에서 제공되는 QML 과 C++ API 로 개발이 가능합니다.
> 본 문서는 Qt 3D로 구현한 예제 모음 입니다. 각 예제 들의 소스코드가 포함된 Tutorial 은 http://doc.qt.io/qt-5/qt3d-examples.html 에서 확인 할 수 있습니다.
> Qt 5.7 상용 제품의 체험 판은 https://www.qt.io/download-eval-for-applications-step-2/ 에서 다운로드 할 수 있습니다.
> Qt 3D에 관한 궁금 하신 부분은 webyhong@ocube.co.kr 로 문의 바랍니다.

 

Features

> Simulation Engine 은 3D Rendering 뿐만 아니라 AI, Logic, Audio 등을 지원하여 Medical, Robotics, 물리학, 게임 등 복잡한 시뮬레이션 표현이 가능합니다.
> Qt3D는 강력한 Front-end와 Back-end 분리시스템으로구성되어 서로 간섭 없이 유연한 환경 구축이 가능합니다.
> 고유의 오브젝트 통합을 위해 ECS(Entity Component System) 을 사용합니다.
     > ECS 는 복잡하고, 방대한 코드로부터 자유롭습니다.
     > 실시간으로객체의 동작을 변경시킬 수 있는 유연성을 갖고 있습니다.
     > Back-end 에서 동작하는 Aspects System 에 의해 강력한 퍼포먼스를 보여줍니다.

 

Qt 3D Core C++ Classes

Qt3DCore 는 ECS Framework 구조로 구현상의 dependency 로부터 자유롭고, Thread Pool 기능을 수행하며, Back-end<->Front-end 커뮤니케이션을 담당합니다

QAbstractAspect

QAspectEngine

QAspectJob

QBackendNode

QBackendNodeMapper

QComponent

QComponentAddedChange

QComponentRemovedChange

QDynamicPropertyUpdatedChange

QTransform

QNodeCreatedChange

QNodeCreatedChangeBase

QNodeDestroyedChange

QNodeId   QCameraLens

QPropertyNodeAddedChange

QPropertyNodeRemovedChange

QPropertyUpdatedChange

QPropertyUpdatedChangeBase

QPropertyValueAddedChange

QPropertyValueAddedChangeBase

QPropertyValueRemovedChange

QPropertyValueRemovedChangeBase

QSceneChange   QEntity

QStaticPropertyUpdatedChangeBase

QStaticPropertyValueRemovedChangeBase

QStaticPropertyValueAddedChangeBase

Quick::QQmlAspectEngine   QNode

 

Qt 3D Input C++ Classes

Qt3D Input은 기본적으로 마우스와 키보드의 Input을 담당하며, 고유의 Device Mapping 구현이 가능합니다.

QAbstractActionInput

QAction

QAxis

QInputAspect

QInputSettings

QKeyboardHandler

QMouseEvent

QAbstractAxisInput

QActionInput

QAxisSetting

QInputChord

QKeyEvent

QLogicalDevice

QMouseHandler

QAbstractPhysicalDevice

QAnalogAxisInput

QButtonAxisInput

QInputSequence

QKeyboardDevice

QMouseDevice

QWheelEvent

 

Qt 3D Logic C++ Classes

Qt3D Logic 은 각각의 프레임 당 코드를 담당합니다.

QFrameAction

QLogicAspect

 

Qt 3D Render C++ Classes

Qt3D Render 는 3D 렌더링 프레임워크로 Material/Effect/Technique 의 Sub system을 갖고 있습니다.

AssimpIO

QAttribute

QCameraSelector

QComputeCommand

QFilterKey

QGeometryRenderer

QMaterial

QParameter

QPointLight

QRenderPassFilter

QRenderTarget

QShaderData

QTechnique

QTexture2D

QTexture3D

QTextureData

QTextureWrapMode

QAbstractLight

QBlendEquationArguments

QClearBuffers

QDirectionalLight

QFrameGraphNode

QGraphicsApiFilter

QMesh

QPickEvent

QPointSize

QRenderSettings

QRenderTargetOutput

QShaderProgram

QTechniqueFilter

QTexture2DArray

QTextureBuffer

QTextureImage

QViewport

QAbstractTexture

QBuffer

QClipPlane

QDispatchCompute

QFrustumCulling

QLayer

QNoDraw

QPickTriangleEvent

QRenderAspect

QRenderStateSet

QRenderTargetSelector

QSortPolicy

QTexture1D

QTexture2DMultisample

QTextureCubeMap

QTextureImageData

QTexture2DMultisampleArray

QAbstractTextureImage

QCamera

QColorMask

QEffect

QGeometry

QLayerFilter

QObjectPicker

QPickingSettings

QRenderPass

QRenderSurfaceSelector

QSceneLoader

QSpotLight

QTexture1DArray

QTextureCubeMapArray

QTextureRectangle

 

Qt 3D Core QML Types Module

CameraLens

EntityLoader

QuaternionAnimation

Component3D

Node

Transform

Entity

NodeInstantiator

 

Qt 3D Input QML Types Module

AbstractActionInput

Action

Axis

InputChord

KeyEvent

LogicalDevice

MouseHandler

AbstractAxisInput

ActionInput

AxisSetting

InputSequence

KeyboardDevice

MouseDevice

WheelEvent

AbstractPhysicalDevice

AnalogAxisInput

ButtonAxisInput

InputSettings

KeyboardHandler

MouseEvent

 

Qt 3D Logic QML Types Module

FrameAction

 

Qt 3D Render QML Types Modules

AbstractTextureImage

Camera

DirectionalLight

FrameGraphNode

GraphicsApiFilter

Material

Parameter

RenderPass

ShaderProgram

TextureImage

Attribute

CameraSelector

DispatchCompute

FrustumCulling

Layer

Mesh

PickEvent

RenderSurfaceSelector

SortPolicy

Viewport

BlendEquationArguments

ClearBuffers

Effect

Geometry

LayerFilter

NoDraw

PickTriangleEvent

RenderTargetSelector

SpotLight

Buffer

ClipPlane

FilterKey

GeometryRenderer

Light

ObjectPicker

PointLight

SceneLoader

Technique

 

Audio Visualizer Example
audio visualizer example
  • Audio VisualizerQt3D rendering 과 Qt Quick 2D요소를 결합하여 어떻게 애플리케이션을 구현하는지 설명합니다.
  • MediaPlayer 를 이용하여 Qt Quick 2D 의 예제를 구현합니다. 플레이어는 playButton 과 stopButton으로 컨트롤되며 mainview 에 따라 상태가 변화됩니다.
  • Visualizer 로 전달된 신호는 bar animation 을 전개합니다.
  • 3D 요소는 visualizer.qml 로 작성됩니다.
  • NodeInstantiator 는 바생성에 사용되며 visualizer은 진행 상태 표기를 위한 Entity 를 가지고 있습니다. BarEntity.qml 을 통해 바의 회전 애니메이션과 색상 변경이 가능합니다.

 

Materials QML & C++ Example
materials example
  • Materials 은 Qt 3D의 material 시스템을 사용합니다.

 

Multi Viewport QML Example
multi viewport example
  • 좌측의 이미지는 Multi Viewport가 가상 카메라를 통해 윈도우의 4분면 시점 장면을 렌더링한 화면입니다. 이러한 화면은 보통 3D CAD 또는 모델링 툴 그리고 레이싱 게임의 차량용 사이드 미러의 조정 또는 CCTV 카메라 디스플레이에 적용됩니다.
  • Multiple RenderViews 를 위해 Framegraph Rules 를 정의하고 FrameGraph 에서 5개의 RenderView 사물을구성합니다.
  • RenderView가 동작을 표시하게 되면 RenderCommands 가 생성되고 이때 한 개의 RenderView는 다른 객체와 독립적으로 평행선에 놓이게 됩니다.
  • Qt 3D는 사용가능한 코어의 숫자에 따라서 Task 기반의 접근 방식을 사용합니다.

 

Planets QML Example
planets qml example
  • Planets 예제는 Qt Quick 2D elements 로 Qt 3D 렌더링을결합하여 사용하는 애플리케이션입니다. 이 예제는 태양계의 8개 행성을 보여줍니다.
  • Scene3D 를 사용하여 3D 컨텐츠를 렌더링한 PlanetsMain.qml 을 호출합니다.
  • 행성의 움직임과 로테이션을 포함한 메인 파트는 SolarSystem.qml 에서 작업되었습니다.
  • SolarSystem.qml에서는 우선 Camera, Light, Configuration 이 추가 되고, 행성 Materials 의 Effects 그리고 행성 사진이 포함됩니다.
  • 자세한 내용은 홈페이지의 http://doc.qt.io/qt-5/qt3d-planets-qml-example.html  를 참고하십시요.
  • 움직임과 로테이션을 계산한 행성 데이터는 loadPlanetData() 로 불리는 planet.js 의 자바스크립트로 구성 됩니다.
  • 좌측의 이미지는 Animate() function 에서 호출된 화면입니다.

 

 

Scene3D QML Example
scene3d example
  • Qt Quick Application 을 통해 3D 화면을 구현합니다. 3D화면은 single active camera 와 single active light source 를포함하며, 시각 데이터는 고정된 위치에 표시됩니다.
  • 3D scene 와 애니메이션을 위한 entity 를 main.qml 에 입력합니다.
  • Scene3d/AnimatedEntity.qml 에 active camera 를 저장합니다.

 

Shadow Map QML Example
shadow map example
  • 좌측 이미지는 Qt 3D Shadow Map 이 커스텀 렌더링 기술을 적용시키기 위해 어떻게 렌더러를 구성하는지를나타내는 예제입니다.
  • 2개의 pass rendering 을 사용하기 위해 shadow mapping 기술이 적용됐습니다. 첫번째 pass에서 그림자 정보를 생성하고 두번째 pass에서 Phong shading 기술로 Forward 렌더링을 사용하여 화면을 생성하고 동시에 그림자를 그리기 위한 첫번째 패스 정보를 수집하여 사용합니다.
  • Q3D 와 Q3D Renderer 모듈을 사용하여 화면을 세팅하고, ShadowMapLight.qml에 커스텀 Light 를 지정합니다.
  • 데이터 기반의 Frame graphShadowMapFrameGraph.qml 파일에 구성하고 Shadow Map 을 생성합니다.
  • Shadow mapping 에 Effects 를 적용하고 Phong Shading 를 사용하여 렌더링을 구성합니다.

 

Simple QML & C++ Example
simple qml example
  • Simple QML&C++ 예제는 Qt3D 의 화면 렌더링에 대해서 설명합니다.
  • Q3D와 Q3D 모듈을 사용하기 위해서 Qt3D.CoreQt3D Render 모듈을 호출합니다.
  • 먼저 화면 구성을 세팅합니다. 본체에서 생성된 Camera 는 키보드 또는 마우스로 컨트롤 가능한 Camera controller 과 마지막 렌더링 시 사용됩니다.
  • 셋팅값과 축값을 특정합니다. CameraController.qml 파일에 LogicalDevice type 을 정의 하고 애플리케이션내에서의 움직임과 축으로 사용합니다.

 

Wave QML Example
wave QML Example
  • Wave 는 꼭지점과 기하학 shader 를 이용하여구현합니다.

 

Wireframe QML Example
wireframe qml example
  • Q3DScatter Rendering 은 single-pass wireframe 렌더링 방식을 사용하여 하나의 세잎매듭을 구현합니다.
  • 우선 본체를 생성하기 위해 Material 과 Geometry 그리고 Transformation 을 고려해야 합니다. 이들은 모두 Qcomponet 에서 Mesh, Material, Transform 의 서브클래스 형태로 정의돼 있습니다.
  • 형태를 특정하기 위해 TransformMesh 컴퍼넌트를사용하여 추상적인 모델을 구체적인 형태로 재구성합니다
  • 이제 transform, mesh, root.material 컴퍼넌트를 조합하여 여러 객체들이 쉽게 화면 공유하도록 설정합니다.
  • TrefoilKnot 커스텀 이미지를 사용한 main.qml 에 세잎매듭에 애니메이션 기능을 활용하기 위해 Qt Quick 모듈을 호출합니다.
  • 다양한 레벨로 커스터마이징 할 수 있는 Material System은 매우 강력하고 유연하게 동작할수 있습니다.
  • 애니메이션 Elements 를 사용하여 예제를 실행합니다.

 

Drawingwith Qt3D: Transforms
  • Scene graph 는 시뮬레이션의 공간 을 담당합니다.
  • Qt3DCore::Qentity: 시뮬레이션 객체
  • Qt3DCore::QTransform: 위치, 크기, 방향 표시
  • Transforms(변형) 계층은 parent/child 상속 관계에의 해 컨트롤 되며 이러한 방식은 Qwidget, QQuickItem, QGraphicsItem 등과 유사합니다.
  • Transforms의 3D 화면을 렌더링 하기 위해 Qt3DRender::Qcamera 를 제공합니다.

 

Drawingwith Qt3D: Geometries
geometries
  • shape 를 사용하여 렌더링 할 객체를 그립니다.
  • Qt3DRender::QGeometryRenderer 의 geometry 요소로 특정 모양을 만듭니다.
  • Qt 3DRender::QGeometryRenderer 는 아래와 같이다양하고 편리한 서브클래스 툴을 제공합니다.
    • Qt3DExtras::QSphereMesh
    • Qt3DExtras::QCuboidMesh
    • Qt3DExtras::QPlaneMesh
    • Qt3DExtras::QTorusMesh
    • Qt3DExtras::QConeMesh
    • Qt3DExtras::QCylinderMesh
  • Qt3DRender::QMesh 는파일을 로드합니다.
  • 쉽게 고유의 Geometry 구현이 가능합니다.

 

Drawing with Qt3D: Material
qt3d material
  • Geometry 만 사용할 경우 사물은 어둡게 표시됩니다. 그렇기 때문에 Qt3DREnder::Qmaterial 컴퍼넌트는 surface appearance 를 제공합니다.
  • Q3D 는 Material 에서 아래와 같이 편리한 서브클래스들을 제공합니다.
    • Qt3DExtras::QPhongMaterial
    • Qt3DExtras::QPhongAlphaMaterial
    • Qt3DExtras::QDiffuseMapMaterial
    • Qt3DExtras::QGoochMaterial
  • 고유의 Material 을 쉽게 만들 수 있습니다.

 

Drawing with Qt3D: Textures
qt3d material
  • Qt3D는모든 종류의 Textures 표현이 가능합니다.
  • Textures 를 사용하기 위해 한 개 또는 여러 개의 이미지를 수집합니다.
  • Qt3DRender::QAbstractTexture 는 텍스쳐 타입에 따라 다양한 서브클래스들을 제공합니다.
    • 1D – 유용한 looup function
    • 2D – 대부분의 서브클래스 타입
    • 3D – 일반적인 볼륨 데이터
    • Arrays of 2D…
  • Qt3DRender::QTextureLoader 은 DDS 파일로 로드되며 모든 종류의 테스쳐 타입을 지원합니다.

 

Drawing with Qt3D: Lights
lights 1 lights2 lights 3
  • 빌트인 된 사물은 lights 모듈로 밝기 작업을 할 수있습니다.
  • Qt3DRender::QAbstractLight 컴퍼넌트는 아래의 서브클래스들을 제공합니다.
    • Point light
    • Directional light
    • Spotlight
  • lights는 렌더링 되지 않으며 오직 객체에 효과를 주기위해서 사용 됩니다.