Qt 3D 를 Qt Quick 3D 로 이식하기: 마이그레이션 가이드
이 가이드는 현재 Qt 3D 로 마이그레이션하고자 하는 Qt Quick 3D로 마이그레이션하고자 하는 개발자를 대상으로 합니다.범위 차이
범위의 차이
반면 Qt 3D 와 Qt Quick 3D 둘 다 3D API를 제공한다는 점에서 비슷해 보일 수 있지만, 근본적으로 다른 접근 방식으로 설계되었습니다.
Qt 3D 는 사용자 정의 3D 렌더러를 구현하기 위한 유연한 API로, 렌더링 프로세스의 다양한 측면에 대한 저수준 추상화를 제공합니다. 그 결과, Qt 3D 는 C++와 QML 모두를 위한 API를 제공합니다.
반면, Qt Quick 3D 는 3D 콘텐츠 렌더링에 중점을 둔 고수준 API이며, Qt Quick 의 확장으로 설계되었습니다. 따라서 이 API의 대부분은 QML 기반입니다. 따라서 현재 Qt 3D 애플리케이션이 C++에 크게 의존하고 있다면, Qt Quick 3D 로 마이그레이션하려면 QML로 전환해야 합니다.
아키텍처상의 차이점
Qt 3D 와 Qt Quick 3D 는 아키텍처 측면에서 상당한 차이를 보입니다. Qt Quick 3D 는 Qt Quick 와 동일한 디자인 패턴을 따르며, 3D 렌더링을 지원하도록 기능을 확장한 것입니다.
첫 번째 주요 차이점은 디자인 패턴의 사용에 있습니다. Qt 3D 는 엔티티-컴포넌트 시스템 (ECS) 패턴을 사용합니다. 이 시스템에서는 일반적인 엔티티 클래스가 사용되며, 구성(composition) 패턴에 따라 엔티티에 다양한 컴포넌트를 추가하여 특화시킬 수 있습니다. 반면, Qt Quick 3D 는 더 광범위한 Qt 프레임워크와 일치하는 상속 기반 API를 사용하며, 여기서 특화된 노드는 공통 기본 클래스의 하위 클래스입니다. 이러한 근본적인 차이점으로 인해 두 API 간에는 직접적인 1:1 대응 관계가 없습니다.
또 다른 중요한 차이점은 스레딩 모델에 있습니다. Qt 3D 는 ‘어스펙트( Aspects)’라는 개념을 도입하는데, 이는 엔티티에 연결된 다양한 유형의 컴포넌트에 대해 서로 다른 진입점을 제공합니다. 각 어스펙트는 스레드 풀에 의해 처리되는 태스크를 생성할 수 있으며, 프로바이더와 종속성의 트리를 따라 프레임 렌더링에 필요한 모든 작업을 완료합니다. 반면, Qt Quick 3D 는 Qt Quick 와 동일한 스레딩 모델을 사용합니다. 이 모델에는 메인 GUI 스레드에서 접근하여 씬 상태를 관리할 수 있는 프론트엔드 API와, 렌더 스레드에서 작동하는 백엔드 API가 있습니다. 렌더 스레드가 특정 작업을 위해 추가 스레드를 활용할 수는 있지만, 사용자 관점에서 볼 때 개념적 모델은 두 개의 스레드만을 포함합니다. Qt Quick 3D 에는 ‘어스펙트(Aspects)’라는 별개의 개념은 없지만, Qt 3D 의 어스펙트가 제공하는 기능 중 상당수는 여전히 사용할 수 있습니다.
렌더링 관점에서 볼 때, Qt 3D 는 매우 유연한 사용자 정의 방식을 제공하여 맞춤형 렌더링 파이프라인을 생성할 수 있게 해줍니다. 그러나 이러한 유연성은 복잡성을 수반합니다. 기본적으로 Qt 3D 는 미리 구성된 렌더링 파이프라인을 제공하지 않습니다. 반면, Qt Quick 3D 는 더 사용자 친화적으로 설계되어 있으며, 장면의 요구 사항에 자동으로 적응하는 기본 제공 렌더링 파이프라인을 갖추고 있습니다. 예를 들어, Qt Quick 3D 의 방향광이 그림자를 드리우도록 설정된 경우, 렌더링 파이프라인은 자동으로 섀도우 맵 생성 패스를 포함하며, 이 섀도우 맵은 장면 내의 머티리얼에서 사용됩니다. Qt 3D 에서는 이러한 기능을 구현하려면 프레임 그래프를 수동으로 구성하고, 섀도우 매핑 패스를 지원하도록 머티리얼을 확장해야 했습니다. 또한, 포인트 라이트나 스포트라이트와 같은 다양한 조명 유형의 경우, 프레임 그래프와 머티리얼 정의를 추가로 수정해야 합니다. Qt 3D 는 섀도우 매핑 기법에 대한 강력한 사용자 정의 옵션을 제공하지만, 이는 Qt Quick 3D 에 비해 상당한 오버헤드를 초래할 수 있습니다. 에서는 조명의 단일 속성을 설정하는 것만으로도 그림자를 활성화할 수 있기 때문입니다.
모듈별 세부 정보
Qt 3D 코어
Qt 3D 의 Core 모듈은 다른 Qt 3D 모듈이 구축되는 기반이 되는 기본 프리미티브를 제공합니다. Qt 3D Core의 대부분의 클래스는 Qt Quick 3D 에 상응하는 컴포넌트가 있지만, Entity-Component-System(ECS) 아키텍처를 특별히 지원하는 클래스는 예외입니다. Qt Quick 3D 는 Qt 3D 에서 사용되는 일반적인 엔티티-컴포넌트 조합에 해당하는 미리 조립된 컴포넌트를 제공하여 개발 과정을 간소화합니다.
예를 들어, Qt3D에서 렌더링 가능한 엔티티의 설정은 다음과 같습니다.
PhongMaterial {
id: material
}
TorusMesh {
id: torusMesh
radius: 5
minorRadius: 1
rings: 100
slices: 20
}
Transform {
id: torusTransform
scale3D: Qt.vector3d(1.5, 1, 0.5)
rotation: fromAxisAndAngle(Qt.vector3d(1, 0, 0), 45)
}
Entity {
id: torusEntity
components: [ torusMesh, material, torusTransform ]
}위의 코드에서 볼 수 있듯이, 엔티티는 메시, 머티리얼, 트랜스폼으로 구성되어 있습니다. Qt Quick 3D 에서 이에 상응하는 코드는 다음과 같습니다:
Model {
id: torusModel
scale: Qt.vector3d(1.5, 1, 0.5)
eulerRotation.x: 45
geometry: TorusGeometry {
radius: 5
tubeRadius: 1
rings: 100
segments: 20
}
materials: [
PrincipledMaterial {
id: material
]
}이 예제에서 엔티티는 ` Model`로 대체되는데, 이는 ` Node ` 컴포넌트의 서브클래스이며, ` Qt 3D`의 ` Transform ` 컴포넌트에 상응하는 기능을 상속받습니다. 또한 모든 `Node` 서브클래스는 부모-자식 관계를 가진 씬 그래프의 일부가 됩니다. Model 컴포넌트는 지오메트리와 머티리얼을 가질 수 있는 렌더링 가능한 엔티티입니다. 이 경우 geometry 속성을 사용하여 Qt 3D 코드에서 사용하는 절차적 API와 일치시키지만, source 속성을 사용하여 정적 파일에서 지오메트리를 지정하는 것도 가능합니다. Model 컴포넌트의 materials 속성은 지오메트리에 음영을 적용하는 데 사용될 머티리얼 목록입니다. 지오메트리가 여러 하위 집합을 포함할 수 있고, 각 하위 집합마다 별도의 머티리얼을 사용할 수 있기 때문에 이 속성은 목록 형태입니다. ` PrincipledMaterial ` 컴포넌트는 Metallic-Roughness 워크플로를 사용하는 PBR(Physically Based Rendering) 머티리얼이며, 이 예제의 경우 ` Qt 3D ` 스니펫에서 사용되는 ` PhongMaterial `을 대체합니다.
Qt 3D 입력
Qt 3D 는 자체 맞춤형 입력 시스템을 통해 다양한 입력 클래스를 제공합니다. 반면, Qt Quick 3D 는 주로 Qt Quick 의 입력 클래스를 재사용합니다. 3D 씬과 상호작용하기 위해, Qt Quick 3D 는 레이 캐스팅 및 오브젝트 피킹을 수행하는 추가 API를 제공합니다.
View3D 는 Qt Quick 3D 에서 피킹 작업을 처리하는 주요 클래스로, 명시적 및 암시적 피킹 메서드를 모두 제공합니다. 명시적 피킹 API를 사용하면 View3D 에서 x 및 y 좌표를 지정하여 2D 공간에서 직접 피킹할 수 있습니다. 이 작업은 피킹된 오브젝트와 피킹 위치에 대한 세부 정보를 포함하는 pickResult 값을 반환합니다. 이 API는 동기식이며, 이는 광선이 투사된 직후 결과를 확인할 수 있음을 의미합니다. 또한 씬 내의 임의의 지점에서 광선을 투사할 수 있습니다. 명시적 및 암시적 피킹 방법 모두 첫 번째 히트 결과뿐만 아니라 모든 히트 결과의 목록을 반환할 수 있습니다.
import QtQuick
import QtQuick.Controls
import QtQuick3D
ApplicationWindow {
width: 640
height: 480
visible: true
View3D {
id: view
anchors.fill: parent
PerspectiveCamera {
z: 200
}
DirectionalLight {
}
PrincipledMaterial {
id: material
baseColor: "red"
}
PrincipledMaterial {
id: selectedMaterial
baseColor: "blue"
}
Model {
id: sphereModel
source: "#Sphere"
pickable: true
materials: [
material
]
}
}
MouseArea {
anchors.fill: parent
onClicked: (mouse) => {
let result = view.pick(mouse.x, mouse.y)
if (result.hitType == PickResult.Model) {
if (result.objectHit == sphereModel) {
// toggle selection
if (sphereModel.materials[0] == material)
sphereModel.materials[0] = selectedMaterial
else
sphereModel.materials[0] = material
}
} else {
// deselect
sphereModel.materials[0] = material
}
}
}
}이 예제 코드 스니펫에서는 구체 모델이 포함된 간단한 씬을 생성합니다. 구체 모델은 ‘ pickable ’로 설정되어 있어, 씬에 광선이 투사될 때 이 모델이 피킹 대상으로 고려됩니다. ‘ View3D ’ 위에는 클릭을 감지하는 ‘ MouseArea ’가 배치되어 있습니다. 클릭이 감지되면, 클릭의 x 및 y 좌표를 인수로 받아 ` pick ` 메서드가 호출됩니다. 그런 다음 픽 작업의 결과를 사용하여 구체 모델이 맞았는지 여부를 판단합니다. 맞았다면, 구체 모델의 머티리얼을 빨간색과 파란색 머티리얼 사이에서 전환합니다.
import QtQuick
import QtQuick.Controls
import QtQuick3D
ApplicationWindow {
width: 640
height: 480
visible: true
View3D {
id: view
anchors.fill: parent
Node {
eulerRotation.y: 45
PerspectiveCamera {
z: 200
}
}
DirectionalLight {
}
Node {
id: anchorItem
Item {
anchors.centerIn: parent
width: 250
height: 250
Button {
anchors.centerIn: parent
text: "Click Me"
}
}
}
}
}이 예제 코드 스니펫에서는 화면 중앙에 Button 가 배치된 간단한 씬이 생성됩니다. Button은 2D 아이템이지만, 부모가 Node 이므로 3D 공간으로 투영됩니다. 이러한 컴포넌트는 2D 공간에서와 동일한 방식으로 상호작용할 수 있습니다. View3D 는 장면 내로 광선을 투사하고, 장면에 포함된 모든 2D 아이템으로 입력 이벤트를 전달하는 작업을 자동으로 처리합니다.
import QtQuick
import QtQuick.Controls
import QtQuick3D
ApplicationWindow {
width: 640
height: 480
visible: true
View3D {
id: view
anchors.fill: parent
Node {
eulerRotation.y: 25
PerspectiveCamera {
z: 200
}
DirectionalLight {
}
}
Model {
source: "#Cube"
pickable: true
materials: [
PrincipledMaterial {
baseColorMap: Texture {
sourceItem: Pane {
width: 250
height: 250
Button {
anchors.centerIn: parent
text: "Click Me"
}
}
}
}
]
}
}
}마찬가지로 위의 코드 스니펫에서는 큐브( Model )가 Button 를 포함하는 Pane 텍스처와 함께 생성됩니다. 이 경우 Button 를 포함하는 Pane 컴포넌트를 렌더링하여 250x250 픽셀 크기의 Texture 가 생성됩니다. 일반적으로 이 텍스처는 상호작용이 불가능하지만, Model 에서 pickable 를 true로 설정하면, 이전 예제에서 입력 이벤트를 Button 로 전달했던 것과 동일한 암시적 피킹 메커니즘이 이 예제에서는 입력 이벤트를 Button 로 전달하는 데 사용됩니다. Model 의 큐브의 경우, 큐브의 각 면이 이제 Button 와 상호작용하게 됩니다.
Qt 3D 의 입력 클래스 대부분은 Qt Quick 3D 로 직접 변환할 수 없으므로 약간의 포팅 작업이 필요하지만, Qt Quick 3D 의 암시적 피킹 메커니즘 덕분에 3D 장면 내의 2D 항목과 쉽게 상호작용할 수 있습니다.
Qt 3D 논리
Qt 3D 의 Logic 모듈에는 렌더링된 각 프레임에 대한 콜백을 제공하는 단일 컴포넌트가 포함되어 있습니다. Qt Quick 3D 에서는 이에 상응하는 접근 방식으로, 렌더링된 각 프레임에 대한 타이밍 정보와 콜백 메커니즘을 제공하는 일반적인 Qt Quick 컴포넌트인 FrameAnimation 컴포넌트를 사용합니다.
FrameAnimation {
running: true
onTriggered: {
console.log(`currentFrame: ${currentFrame}, frameTime: ${frameTime}`)
}
}이 컴포넌트는 매 프레임마다 특정 동작을 수행하고자 하는 오브젝트의 자식 노드로 포함하는 것을 포함하여, 씬 내 어디에서나 사용할 수 있습니다.
다만, 이 패턴은 매 프레임마다 특정 동작을 수행하고자 할 때만 필요하다는 점에 유의해야 합니다. FrameAnimation 를 사용하면 일부 게임 엔진에서 폴링 동작을 재현할 수 있지만, Qt Quick 3D 에서도 Qt Quick 와 동일한 이벤트 기반 패턴을 사용할 수 있습니다.
Qt 3D 렌더링
Qt 3D 의 Render 모듈에는 렌더링에 필요한 대부분의 핵심 클래스가 포함되어 있습니다. Qt Quick 3D 에서는 이에 상응하는 기능의 대부분이 사용자에게 직접 노출되지 않는 내부 구현 세부 사항으로 제공됩니다. 그러나 Qt Quick 3D 의 기능을 확장하고 사용자 정의하는 데 사용할 수 있는 API 형태로 사용자에게 노출된 일부 클래스도 있습니다.
지오메트리
Qt 3D 의 지오메트리 또는 메쉬 데이터는 QGeometryRenderer 클래스나 GeometryRenderer 컴포넌트로 표현됩니다. Qt Quick 3D 에서는 이에 상응하는 것으로 QQuick3DGeometry 클래스와 ProceduralMesh 컴포넌트가 있습니다. Qt 3D 에서는 QGeometryRenderer 클래스가 더 낮은 수준의 구현을 제공하며, 사용자가 지오메트리 데이터의 일부로 버텍스 속성 레이아웃을 직접 제공해야 합니다. Qt Quick 3D 에서는 사용할 내장 정점 속성을 제어할 수 있지만, 버퍼의 레이아웃은 구현 세부 사항으로서 내부적으로 처리됩니다.
이것이 어떻게 이루어지는지에 대한 자세한 내용은 Qt Quick 3D 의 ‘Custom Geometry’ 예제를 확인해 보시기 바랍니다.
텍스처
Qt 3D 의 텍스처는 ` QAbstractTexture`의 서브클래스로 표현됩니다. ` Qt Quick 3D`에서는 이에 상응하는 것이 ` Texture ` 컴포넌트로, 이는 텍스처와 샘플러를 프론트엔드에서 표현한 것입니다. 하지만 텍스처 컴포넌트가 사용하는 데이터는 다양한 출처에서 가져올 수 있습니다. 가장 간단한 방법은 ` source ` 속성을 이미지 파일로 설정하는 것인데, 그러면 해당 파일이 텍스처 데이터로 GPU에 업로드됩니다. 또한 2D QML 콘텐츠를 소스로 사용하거나, QQuick3DTextureData 를 상속받거나, ProceduralTextureData 컴포넌트를 사용하여 런타임에 텍스처 데이터를 절차적으로 생성할 수도 있습니다. 이러한 유형을 사용하면 크기, 형식 및 원시 이미지 데이터를 제공하여 텍스처 데이터를 지정할 수 있습니다. 또한 render extensions 를 사용하여 GPU에서 텍스처를 생성할 수도 있습니다.
구체적인 방법에 대한 자세한 내용은 Qt Quick 3D 의 ‘Procedural Texture Example’을 참고하십시오.
머티리얼
Qt 3D 에서는 일부 내장 머티리얼을 사용할 수 있었지만, 이 경우 해당 머티리얼이 호환되는 내장 framegraphs 로만 제한되었습니다. Qt Quick 3D 도 내부 렌더링 전략과 호환되는 내장 머티리얼을 제공한다는 점에서 비슷한 상황입니다. 그러나 Qt 3D 와 Qt Quick 3D 모두에서 사용자 정의 머티리얼을 생성할 수 있습니다.
Qt 3D 에서는 QMaterial, QEffect, QTechnique, QRenderPass, QShaderProgram 로 구성된 트리 구조를 활용하는 상당히 복잡한 과정이었습니다. Qt Quick 3D 에서는 머티리얼에 대한 이 과정이 단일 CustomMaterial 컴포넌트로 간소화되었습니다. 이 컴포넌트를 사용하면 머티리얼에 대한 사용자 정의 셰이더 코드를 지정할 수 있으며, 나머지 설정은 렌더러에서 처리합니다. CustomMaterial 에는 셰이딩 모드와 언셰이딩 모드, 두 가지 모드가 있습니다. 셰이딩 모드에서는 사용자 정의 셰이더 코드 API를 통해 내장된 PrincipledMaterial 셰이더를 사용자 정의할 수 있으며, 비셰이딩 모드에서는 처음부터 직접 셰이더 코드를 작성할 수 있습니다. 두 경우 모두 셰이더 언어는 GLSL이며, Qt Quick 3D API의 나머지 부분과의 통합을 용이하게 하기 위해 Qt 특유의 키워드 확장이 일부 포함되어 있습니다.
구체적인 구현 방법에 대한 자세한 내용은 셰이딩 모드 및 비셰이딩 모드 예제와 함께, Qt Quick 3D 의 사용자 정의 GLSL 셰이더 언어 사용에 대한 이 개요를 참조하십시오.
이펙트
Qt3D의 관점에서 볼 때, 3D 씬을 렌더링하는 것과 후처리 효과를 렌더링하는 것 사이에는 차이가 없으며, 저수준 관점에서도 이는 맞습니다. 그러나 Qt Quick 3D 에서는 이를 구분하고 있습니다. Models 3D 씬의 일부는 materials 목록을 포함하며, 이들은 메인 패스 동안 렌더링됩니다. 이러한 메인 패스의 결과는 3D 콘텐츠로, 창 표면이나 텍스처에 직접 렌더링됩니다. Effects 는 Qt Quick 3D 와 달리, 각 pass 가 렌더 타겟 전체를 덮는 단일 쿼드로 처리되는 포스트 프로세싱 효과를 의미합니다. 메인 컬러 패스의 결과 텍스처는 텍스처로 첫 번째 이펙트 패스(effect pass)로 전달되고, 해당 패스의 결과는 다시 텍스처로 다음 텍스처 패스( Effect )로 전달되며, 이 과정이 반복됩니다. 그런 다음 최종 패스는 출력 렌더 타깃(대개 창 표면)으로 렌더링됩니다. 일부 Effects 는 메인 패스 중에 생성된 buffers (예: 깊이 텍스처)를 필요로 하고, 다른 것들은 중간 단계를 필요로 하는데, 이 모든 것은 Qt Quick 3D 의 Effects API를 사용하여 정의할 수 있습니다.
Qt Quick 3D 는 이 후처리 효과 체인을 전문적으로 다루며, 원하는 효과를 얻기 위해 필요한 만큼의 렌더 패스를 정의할 수 있는 API를 제공합니다.
구체적인 구현 방법에 대한 자세한 내용은 Qt Quick 3D 포스트 프로세싱 예제를 참조하십시오.
인스턴스 버퍼
Qt 3D 에서는 인스턴싱과 인스턴스 버퍼의 사용이 상당히 저수준이므로, 사용 방법은 구체적인 사용 사례에 따라 달라집니다. Qt Quick 3D 에서는 내장 머티리얼에 설정할 수 있는 몇 가지 고정된 인스턴싱 속성이 있지만, 이를 설정하려면 인스턴스 데이터를 버퍼로 제공해야 합니다. 이 데이터를 제공하는 방법에는 여러 가지가 있으며, 일단 데이터가 제공되면 Model 컴포넌트의 instancing 속성을 설정하여 인스턴스 버퍼 데이터를 인스턴싱하려는 대상과 연결하기만 하면 됩니다.
자세한 내용은 Qt Quick 3D 에서 인스턴싱에 관한 이 기사를 확인해 주세요.
렌더러 확장 기능
Qt 3D 의 목적은 애플리케이션에 맞춤형 렌더링 솔루션을 정의할 수 있는 강력한 방법을 제공하는 것입니다. Qt Quick 3D 는 사용자 정의의 용이성보다는 사용 편의성을 목표로 하기 때문에 이 정도의 사용자 정의 기능을 제공하지는 않지만, 위에 나열된 모든 방법 외에도 렌더링 파이프라인을 확장할 수 있는 몇 가지 방법을 제공합니다. 이는 render extensions 을 구현함으로써 이루어지며, 이를 통해 렌더러와 동일한 데이터를 사용하여 렌더러에 사용자 정의 렌더링 패스를 추가할 수 있습니다. 이는 Qt Quick 3D 렌더링 파이프라인과 Qt Rendering Hardware Interface (RHI) API에 대한 깊은 이해가 필요한 저수준 API입니다.
구체적인 구현 예시는 ‘Stencil Outline Extension Example’을 참고하십시오.
Qt 3D 추가 기능
Qt 3D 의 Extras 모듈은 머티리얼, 지오메트리 생성기, 카메라 컨트롤러 등 “바로 사용 가능한” 환경을 제공하는 다양한 유틸리티를 제공합니다. 또한 포워드 렌더러 프레임 그래프도 포함되어 있습니다. Qt Quick 3D 에서는 프레임 그래프를 명시적으로 정의할 필요가 없으며, 대신 씬의 요구 사항에 따라 프레임 그래프가 자동으로 생성됩니다.
내장 머티리얼
Qt Quick 3D 에서는 PrincipledMaterial 또는 SpecularGlossyMaterial 를 사용하거나, 사용자 정의 셰이더 코드가 포함된 CustomMaterial 을 정의하여 머티리얼을 제공합니다. PrincipledMaterial 는 Metallic-Roughness 워크플로를 사용하는 PBR(물리 기반 렌더링) 셰이더입니다. 생성된 셰이더의 복잡도는 사용자가 설정한 속성과 씬의 내용에 따라 증가합니다. 예를 들어, 조명이 그림자를 드리우는 경우 생성된 셰이더에는 그림자 수신 코드가 포함되며, 라이트 프로브나 리플렉션 프로브가 존재하는 경우 셰이더는 해당 조명 정보를 반영합니다. 이러한 동적 적용은 셰이딩 모드의 CustomMaterial 에도 적용됩니다. 그러나 셰이딩되지 않은 CustomMaterial 셰이더는 조명과 같은 씬 정보를 자동으로 고려하지 않습니다.
지오메트리 헬퍼
Qt 3D 와 마찬가지로, Qt Quick 3D 도 다양한 내장 지오메트리 프리미티브와 절차적 지오메트리 생성기를 제공합니다.
다음 표는 Qt 3D 의 지오메트리 클래스와 Qt Quick 3D 의 해당 클래스 간의 대응 관계를 보여줍니다:
| Qt 3D | Qt Quick 3D |
|---|---|
| ConeMesh | ConeGeometry |
| CuboidMesh | CuboidGeometry |
| CylinderMesh | CylinderGeometry |
| ExtrudedTextMesh | ExtrudedTextGeometry |
| PlaneMesh | PlaneGeometry |
| 구 메쉬 | SphereGeometry |
| 토러스 메쉬 | TorusGeometry |
카메라 컨트롤러
카메라 제어를 위해, ` Qt Quick 3D `는 ` OrbitCameraController ` 및 ` WasdController`와 유사한 옵션을 제공합니다. ` WasdController `는 Qt3D의 ` FirstPersonCameraController `와 유사하지만, 카메라뿐만 아니라 씬 내의 모든 항목을 제어할 수 있습니다.
| Qt 3D | Qt Quick 3D |
|---|---|
| FirstPersonCameraController | WasdController |
| OrbitCameraController | OrbitCameraController |
Qt 3D 애니메이션
Qt 3D 의 애니메이션 모듈은 3D 환경에서 다양한 유형의 애니메이션이 어떻게 처리되는지를 정의합니다. Qt Quick 3D 에서는 동등한 기능이 여러 모듈에 분산되어 있으며, 가능한 경우 Qt Quick 의 기존 클래스를 활용하는 경우가 많습니다. 예를 들어, QtQuick 임포트에서 제공하는 다양한 애니메이션 클래스를 사용하여 3D 노드의 속성을 애니메이션화할 수 있습니다.
3D 콘텐츠 제작 도구에서 애니메이션을 가져올 때, 일반적으로 타임라인을 사용하여 정의됩니다. Qt Quick Timeline 이 모듈은 이러한 애니메이션을 정의하는 데 필요한 클래스를 제공하며, 애니메이션이 포함된 모든 가져온 콘텐츠는 작동하기 위해 이 모듈이 필요합니다.
씬 내 아이템에 대한 기본 변환(평행 이동, 회전, 크기 조정 등) 외에도, Qt Quick 3D 은 아머처 기반 애니메이션을 지원합니다. 이 방식에서는 스켈레톤의 본을 애니메이션화하여 각 관절이나 본과 관련된 정점에 영향을 줍니다. 이는 Skin 컴포넌트를 통해 구현되며, 이 컴포넌트는 씬에서 본을 나타내는 Node 객체를 Model's 지오메트리의 해당 본 가중치와 연결합니다. 이 경우, 스켈레톤 애니메이션은 변환을 사용하여 본을 애니메이션화함으로써 구현됩니다.
Qt Quick 3D 또한 모델의 지오메트리 변화를 직접 애니메이션화할 수 있는 모프 타겟(morph target) 애니메이션도 지원합니다. 모프 타겟은 모델 지오메트리의 미리 정의된 스냅샷이며, ‘ MorphTarget ’ 컴포넌트를 사용하여 이들 사이에서 애니메이션을 적용할 수 있습니다.
여러 애니메이션을 결합하거나 블렌딩하기 위해서는 ‘ Qt Quick Timeline ’의 ‘Blend Trees’ 모듈에 포함된 컴포넌트를 사용합니다. 이 모듈을 사용하면 서로 다른 애니메이션 간의 상호작용을 관리하기 위한 복잡한 트리를 정의할 수 있습니다. 이러한 일반적인 애니메이션 클래스 대부분은 ‘ Qt Quick 3D ’에만 국한된 것이 아니라, 더 광범위한 ‘ Qt Quick ’ 프레임워크의 일부이며, 새로운 메서드를 도입하기보다는 기존 기능을 활용합니다.
Qt 3D Scene2D
Qt 3D 에서는 Scene2D 컴포넌트를 사용하여 2D Qt Quick 씬을 3D 씬 내에서 사용할 수 있는 텍스처로 렌더링합니다. Qt Quick 3D 에서는 Texture 컴포넌트의 sourceItem 속성을 사용하여 이를 구현합니다. sourceItem 속성은 기존 Item 를 참조하거나 인라인 항목을 정의할 수 있습니다. 최상위 항목이 텍스처 크기를 결정하며, Qt Quick 장면은 Texture 컴포넌트에 매핑되는 레이어로 렌더링됩니다.
또한, 3D 장면 내에서 Item-based 컴포넌트를 직접 사용할 수 있으며, 이 경우 텍스처 없이도 3D 공간에 투영됩니다.
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.