버텍스 스키닝
소개
Qt Quick 3D 는 메시 지오메트리의 스켈레탈 애니메이션을 위한 버텍스 스키닝을 지원합니다.
스켈레탈 애니메이션의 실제 데모는 간단한 스키닝 예제를 참조하십시오.
대부분의 경우 애플리케이션 개발자는 스키닝 API를 수동으로 사용하지 않습니다. 일반적인 워크플로에서는 외부 콘텐츠 제작 툴을 사용하여 스켈레톤과 스킨을 정의한 다음( 리깅이라고도 함), 발삼 에셋 가져오기 툴을 사용하여 에셋을 Qt Quick 3D 의 기본 형식으로 변환하는 것이 일반적입니다.
스켈레톤 정의하기
스켈레톤 애니메이션의 기본은 Skeleton. 이는 척추동물의 실제 골격이 작동하는 방식에서 영감을 받아 모델이 어떻게 움직일 수 있는지를 추상적으로 표현한 것입니다. 스켈레톤의 '뼈'는 Joint 노드의 계층 구조로 표현됩니다. 물론 이것이 반드시 실제 뼈를 나타낼 필요는 없습니다.
Skeleton { id: qmlskeleton Joint { id: joint0 index: 0 skeletonRoot: qmlskeleton Joint { id: joint1 index: 1 skeletonRoot: qmlskeleton } Joint { id: joint2 index: 2 skeletonRoot: qmlskeleton } } }
모델에 스켈레톤 연결하기
모델에 스켈레톤을 적용하려면 모델의 skeleton 속성을 설정합니다:
Model { skeleton: qmlskeleton ...
스켈레톤이 효과를 발휘하려면 모델의 geometry 에 스키닝 정보가 포함되어야 합니다. 버텍스 버퍼에 JointSemantic
및 WeightSemantic
과 함께 vertex attributes 을 포함하면 됩니다.
JointSemantic
속성은 스켈레톤의 어떤 조인트가 주어진 버텍스에 영향을 줄 수 있는지 결정합니다. 여기에는 Joint.index 에 지정된 인덱스 값이 사용됩니다. 이 속성에는 4개의 인덱스가 포함되어 있으므로 최대 4개의 조인트가 하나의 버텍스에 영향을 줄 수 있습니다.
WeightSemantic
속성은 해당 조인트의 영향력 강도를 설명합니다. 여기에는 4개의 부동 소수점 값이 포함되며, 각 값은 JointSemantic
속성에서 해당 위치의 인덱스가 있는 조인트에 부여되는 가중치를 결정합니다.
예를 들어 위의 스켈레톤에서 버텍스에 다음과 같은 속성이 있는 경우
JointSemantic attribute | WeightSemantic attribute |
---|---|
QVector4D(2, 0, 0, 0) | QVector4D(1.0, 0.0, 0.0, 0.0) |
속성이 있다면 해당 버텍스는 조인트2의 영향을 100% 받게 되며 해당 조인트만큼 정확하게 움직입니다. JointSemantic
속성의 마지막 세 인덱스는 해당 가중치가 0.0
이므로 무시됩니다.
다른 예로, 이러한 속성의
JointSemantic 속성 | WeightSemantic attribute |
---|---|
QVector4D(1, 2, 0, 0) | QVector4D(0.5, 0.25, 0.0, 0.0) |
를 사용하면 버텍스는 조인트1의 움직임의 50%에 조인트2의 움직임의 25%를 더한 만큼 이동합니다.
또한 스켈레톤은 추상적인 표현이므로 모델에서 조인트에 대한 지오메트리 정보를 지정해야 합니다. 성능상의 이유로 이 정보를 직접 지정하지 않습니다. 대신 Model.inverseBindPoses 에는 각 조인트를 초기 위치로 이동하는 데 필요한 변환 행렬의 역수가 포함되어 있습니다.
스켈레톤 애니메이션
스켈레톤에서 조인트를 변환하면 해당 조인트에 연결된 모든 버텍스가 이동합니다. 조인트는 Node 에서 상속되므로 표준 QML animations 을 사용하여 간단하게 스켈레톤에 애니메이션을 적용할 수 있습니다.
NumberAnimation { target: joint1 property: "eulerRotation.z" duration: 5000 from: -90 to: 90 running: true }
SequentialAnimation, ParallelAnimation 및 NumberAnimation 를 중첩하여 복잡한 애니메이션을 만들 수도 있지만, 일반적으로 스킨 모델 애니메이션에는 타임라인 애니메이션 을 사용하는 것이 더 편리합니다.
© 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.