Qt 3DQt Quick 3D 로 포팅합니다: 마이그레이션 가이드

이 가이드는 현재 Qt 3D 로 마이그레이션하고자 하는 Qt Quick 3D.

범위 차이점

동안 Qt 3DQt Quick 3D 는 모두 3D API를 제공하므로 비슷해 보일 수 있지만 근본적으로 다른 접근 방식으로 설계되었습니다.

Qt 3D 는 커스텀 3D 렌더러를 구현하기 위한 유연한 API로, 렌더링 프로세스의 다양한 측면에 대한 저수준 추상화를 제공합니다. 따라서 Qt 3DC++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 3DQt Quick 과 동일한 디자인 패턴을 따르며, 3D 렌더링을 지원하도록 기능을 확장합니다.

첫 번째 주요 차이점은 디자인 패턴의 사용입니다. Qt 3D엔티티 컴포넌트 시스템 (ECS) 패턴을 사용합니다. 이 시스템에서는 일반적인 엔티티 클래스가 사용되며, 구성 패턴에 따라 엔티티에 다양한 컴포넌트를 추가하여 특화할 수 있습니다. 반면 Qt Quick 3D 에서는 보다 광범위한 Qt 프레임워크에 부합하는 상속 기반 API를 사용하며, 여기서 특수 노드는 공통 베이스 클래스의 서브클래스입니다. 이러한 근본적인 차이로 인해 두 API 간에는 직접적인 1:1 매핑이 없습니다.

또 다른 중요한 차이점은 스레딩 모델에 있습니다. Qt 3D 에서는 엔티티에 연결된 다양한 유형의 컴포넌트에 대해 서로 다른 진입점을 제공하는 Aspect 개념을 소개합니다. 각 측면은 프레임 렌더링에 필요한 모든 작업을 완료하기 위해 공급자 및 종속성 트리를 따라 스레드 풀에서 처리되는 작업을 생성할 수 있습니다. 반면 Qt Quick 3DQt Quick 과 동일한 스레딩 모델을 사용합니다. 여기에는 장면 상태 관리를 위해 메인 GUI 스레드에서 액세스할 수 있는 프론트엔드 API와 렌더 스레드에 백엔드 API가 있습니다. 렌더 스레드는 특정 작업을 위해 추가 스레드를 사용할 수 있지만 사용자 관점에서의 개념적 모델에는 두 개의 스레드만 포함됩니다. Qt 3D 에서 제공하는 기능의 대부분은 여전히 사용할 수 있지만 Qt Quick 3D 에는 뚜렷한 Aspects 개념이 없습니다.

렌더링 관점에서 볼 때 Qt 3D 은 고도로 사용자 정의 가능한 접근 방식을 제공하여 맞춤형 렌더링 파이프라인을 생성할 수 있습니다. 그러나 이러한 유연성에는 복잡성이 수반되며 기본적으로 Qt 3D 은 사전 구성된 렌더링 파이프라인을 제공하지 않습니다. 반면 Qt Quick 3D 은 장면의 필요에 따라 자동으로 조정되는 기본 렌더링 파이프라인을 통해 보다 사용자 친화적으로 설계되었습니다. 예를 들어 Qt Quick 3D 에서 디렉셔널 라이트가 그림자를 드리우도록 설정된 경우 렌더링 파이프라인에 그림자 맵 생성 패스가 자동으로 포함되어 씬의 머티리얼에 사용됩니다. Qt 3D 에서 이러한 기능을 사용하려면 프레임 그래프를 수동으로 구성하고 섀도 매핑 패스를 지원하도록 머티리얼을 확장해야 합니다. 또한 포인트 또는 스포트라이트와 같은 다양한 조명 유형의 경우 프레임 그래프와 머티리얼 정의를 추가로 수정해야 합니다. Qt 3D 에서는 섀도 매핑 기법에 대한 강력한 커스터마이징 옵션을 제공하지만, 섀도 활성화가 라이트의 단일 프로퍼티 설정만큼 간단한 Qt Quick 3D 과 비교하면 상당한 오버헤드가 발생할 수 있습니다.

모듈별 세부 정보

Qt 3D Core

Qt 3D Core 모듈은 다른 Qt 3D 모듈을 구축하는 기본 프리미티브를 제공합니다. Qt 3D Core의 대부분의 클래스는 ECS(엔티티 컴포넌트 시스템) 아키텍처를 특별히 지원하는 클래스를 제외하고 Qt Quick 3D 에 해당하는 컴포넌트를 가지고 있습니다. Qt Quick 3DQt 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
    ]
}

Qt 3D이 예제에서 엔티티는 Node 컴포넌트의 하위 클래스인 Model 로 대체되며, Transform 에서 컴포넌트와 동일한 것을 상속받습니다. 또한 모든 노드 하위 클래스는 부모-자식 관계를 가진 씬 그래프의 일부가 됩니다. Model 컴포넌트는 지오메트리와 머티리얼을 가질 수 있는 렌더링 가능한 엔티티입니다. 이 경우 geometry 프로퍼티를 사용하여 Qt 3D 코드에서 사용하는 절차적 API와 일치시키지만 source 프로퍼티를 사용하여 정적 파일에서 지오메트리를 지정할 수도 있습니다. Model 컴포넌트의 materials 속성은 지오메트리를 음영 처리하는 데 사용할 머티리얼의 목록입니다. 지오메트리가 여러 개의 하위 집합을 포함할 수 있고 각 하위 집합이 별도의 재질을 사용할 수 있기 때문에 목록입니다. PrincipledMaterial 컴포넌트는 메탈릭 러프니스 워크플로우를 사용하는 PBR(물리 기반 렌더링) 머티리얼이며, 이 예제의 경우 Qt 3D 스니펫에서 사용된 PhongMaterial 을 대체합니다.

Qt 3D Input

Qt 3D 은 자체 커스텀 입력 시스템을 통해 다양한 입력 클래스를 제공합니다. 반면 Qt Quick 3D 은 주로 Qt Quick 의 입력 클래스를 재사용합니다. 3D 장면과 상호 작용하기 위해 Qt Quick 3D 는 광선 캐스팅과 오브젝트 선택을 수행하는 추가 API를 제공합니다.

View3DQt 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 이 있는 간단한 장면을 만들었습니다. 버튼은 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"
                            }
                        }
                    }
                }
            ]
        }
    }
}

위의 코드 스니펫에서도 마찬가지로 Button 을 포함하는 Pane 텍스처로 큐브 Model 가 생성됩니다. 이 경우 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 로직 모듈에는 렌더링되는 각 프레임에 대해 콜백을 제공하는 단일 컴포넌트가 포함되어 있습니다. Qt Quick 3D 에서는 렌더링된 각 프레임에 대한 타이밍 정보와 콜백 메커니즘을 제공하는 일반 Qt Quick 컴포넌트인 FrameAnimation 컴포넌트를 사용하는 것이 동등한 접근 방식입니다.

FrameAnimation {
    running: true
    onTriggered: {
        console.log(`currentFrame: ${currentFrame}, frameTime: ${frameTime}`)
    }
}

이 컴포넌트는 프레임마다 어떤 동작을 수행하려는 객체의 자식을 포함하여 씬의 어느 곳에서나 사용할 수 있습니다.

하지만 이 패턴은 프레임마다 특정 동작을 수행하려는 경우에만 필요하다는 점에 유의할 필요가 있습니다. FrameAnimation 을 사용하면 일부 게임 엔진에서 폴링 동작을 재현할 수 있지만 Qt Quick 3D 에서 Qt Quick 과 동일한 이벤트 구동 패턴을 사용할 수도 있습니다.

Qt 3D Render

Qt 3D 렌더 모듈에는 렌더링에 필요한 대부분의 중요한 클래스가 포함되어 있습니다. 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 커스텀 지오메트리 예제를 참조하세요.

텍스처

Qt 3D 의 텍스처는 QAbstractTexture 의 서브클래스로 표현되며, Qt Quick 3D 에서는 텍스처와 샘플러의 프론트엔드 표현인 Texture 컴포넌트가 이에 해당합니다. 텍스처 컴포넌트가 사용하는 데이터는 다양한 소스에서 가져올 수 있습니다. 가장 간단한 방법은 source 속성을 이미지 파일로 설정하면 텍스처 데이터로 GPU에 업로드되는 것입니다. 2D QML 콘텐츠를 소스로 사용하거나 QQuick3DTextureData 또는 ProceduralTextureData 컴포넌트를 서브클래싱하여 런타임에 텍스처 데이터를 절차적으로 생성하는 것도 가능합니다. 이러한 유형을 사용하면 크기, 형식 및 원시 이미지 데이터를 제공하여 텍스처 데이터를 지정할 수 있습니다. render extensions 을 사용하여 GPU에서 텍스처를 생성할 수도 있습니다.

이 방법에 대한 자세한 내용은 Qt Quick 3D 프로시저럴 텍스처 예제를 참조하세요.

머티리얼

Qt 3D 에서 일부 기본 제공 머티리얼을 사용할 수 있었지만, 이 경우 사용할 수 있는 머티리얼이 framegraphs 에 내장된 것으로 제한되었습니다. Qt Quick 3D 도 내부 렌더링 전략과 함께 작동하는 다양한 기본 제공 머티리얼을 제공한다는 점에서 비슷한 상황입니다. 하지만 Qt 3DQt 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 콘텐츠입니다. EffectsQt Quick 3D 에서 각 pass 이 전체 렌더링 대상을 덮는 단일 쿼드가 되는 포스트 프로세싱 효과를 참조한다는 점에서 다릅니다. 그런 다음 메인 컬러 패스의 결과 텍스처가 첫 번째 효과 패스에 텍스처로 전달되고, 그 패스의 결과가 다음 Effect 패스에 텍스처로 전달되는 식으로 전달됩니다. 그런 다음 최종 패스가 출력 렌더링 대상(일반적으로 창 표면)에 렌더링됩니다. 일부 Effects 에는 뎁스 텍스처처럼 메인 패스 중에 생성된 buffers 이 필요하고, 다른 에는 중간 단계가 필요하며, 이 모든 단계는 Qt Quick 3D 의 효과 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입니다.

이 작업을 수행하는 방법에 대한 예제는 스텐실 아웃라인 확장 예제를 확인하세요.

Qt 3D Extras

Qt 3D Extras 모듈은 머티리얼, 지오메트리 생성기, 카메라 컨트롤러 등 '즉시 사용 가능한' 경험을 촉진하는 다양한 유틸리티를 제공합니다. 또한 포워드 렌더러 프레임 그래프도 포함되어 있습니다. Qt Quick 3D 에서는 프레임 그래프를 명시적으로 정의할 필요 없이 씬의 요구 사항에 따라 프레임 그래프가 자동으로 생성됩니다.

빌트인 머티리얼

Qt Quick 3D 에서는 PrincipledMaterial 또는 SpecularGlossyMaterial 을 사용하거나 사용자 지정 셰이더 코드로 CustomMaterial 을 정의하여 머티리얼을 제공합니다. PrincipledMaterial 은 메탈릭 러프니스 워크플로우를 사용하는 PBR(물리 기반 렌더링) 셰이더입니다. 생성된 셰이더의 복잡도는 사용자가 설정한 속성과 씬의 콘텐츠에 따라 증가합니다. 예를 들어 조명이 그림자를 드리우는 경우 생성된 셰이더에는 그림자 수신 코드가 포함되며, 조명 프로브 또는 반사 프로브가 있는 경우 셰이더에 해당 조명 정보가 통합됩니다. 이 동적 적응은 음영 모드의 CustomMaterial 에도 적용됩니다. 그러나 음영 처리되지 않은 CustomMaterial 셰이더는 조명과 같은 장면 정보를 자동으로 고려하지 않습니다.

지오메트리 헬퍼

Qt 3D 와 유사하게 Qt Quick 3D 도 많은 내장 지오메트리 프리미티브와 많은 절차적 지오메트리 생성기를 제공합니다.

다음 표는 Qt 3D 의 지오메트리 클래스를 Qt Quick 3D 의 해당 클래스에 매핑한 표입니다:

카메라 컨트롤러

카메라 제어의 경우 Qt Quick 3DOrbitCameraControllerWasdController 와 유사한 옵션을 제공합니다. WasdController 은 Qt3D의 FirstPersonCameraController 과 유사하지만 카메라뿐만 아니라 씬의 모든 항목을 제어할 수 있습니다.

Qt 3D 애니메이션

Qt 3D 애니메이션 모듈은 3D에서 다양한 유형의 애니메이션을 처리하는 방법을 정의합니다. Qt Quick 3D 에서도 동일한 기능이 여러 모듈에 분산되어 있으며, 가능한 경우 Qt Quick 의 기존 클래스를 활용하기도 합니다. 예를 들어 QtQuick 임포트의 다양한 애니메이션 클래스를 사용하여 3D 노드의 프로퍼티에 애니메이션을 적용할 수 있습니다.

3D 콘텐츠 제작 도구에서 애니메이션을 임포트할 때는 일반적으로 타임라인을 사용하여 애니메이션을 정의합니다. Qt Quick 타임라인 모듈은 이러한 애니메이션을 정의하는 데 필요한 클래스를 제공하며, 애니메이션이 포함된 모든 임포트된 콘텐츠는 이 모듈이 작동해야 합니다.

장면의 항목에 대한 기본 변환(예: 이동, 회전, 크기 조정) 외에도 Qt Quick 3D 은 뼈대의 뼈대를 애니메이션하여 각 관절 또는 뼈와 연결된 버텍스에 영향을 주는 뼈대 기반 애니메이션을 지원합니다. 이는 씬의 뼈를 나타내는 Node 오브젝트와 Model's 지오메트리의 해당 뼈 가중치를 연결하는 Skin 컴포넌트를 통해 이루어집니다. 이 경우 스켈레톤 애니메이션은 트랜스폼을 사용하여 뼈를 애니메이션하는 방식으로 이루어집니다.

Qt Quick 3D 또한 모프 타깃 애니메이션을 지원하여 모델의 지오메트리 변경 사항을 직접 애니메이션할 수 있습니다. 모프 타깃은 모델 지오메트리의 사전 정의된 스냅샷이며, MorphTarget 컴포넌트를 사용하여 타깃 간에 애니메이션을 적용할 수 있습니다.

여러 애니메이션을 결합하거나 블렌딩하려면 Qt Quick 타임라인 블렌드 트리 모듈의 컴포넌트가 사용됩니다. 이 모듈을 사용하면 서로 다른 애니메이션의 상호 작용 방식을 관리하기 위한 복잡한 트리를 정의할 수 있습니다. 이러한 일반 애니메이션 클래스는 대부분 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 공간에 투영되는 3D 장면 내에서 Item-based 컴포넌트를 직접 사용할 수도 있습니다.

© 2025 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.