버텍스 스키닝
소개
Qt Quick 3D 메시 지오메트리의 스켈레탈 애니메이션을 위한 버텍스 스키닝을 지원합니다.
스켈레탈 애니메이션의 실제 시연은 간단한 스키닝 예제를 참조하십시오.
대부분의 경우, 애플리케이션 개발자는 스키닝 API를 수동으로 사용하지 않습니다. 일반적인 워크플로는 외부 콘텐츠 제작 도구를 사용하여 스켈레톤과 스킨을 정의한 다음(이를 리깅이라고도 함), Balsam 에셋 임포트 도구를 사용하여 에셋을 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 속성 | WeightSemantic attribute |
|---|---|
QVector4D(2, 0, 0, 0) | QVector4D(1.0, 0.0, 0.0, 0.0) |
해당 정점은 joint2의 영향을 100% 받게 되며, 해당 관절이 움직이는 만큼 정확히 움직이게 됩니다. JointSemantic 속성의 마지막 세 인덱스는 해당 가중치가 0.0 이므로 무시됩니다.
또 다른 예로, 다음과 같은 속성이 있다고 가정해 보겠습니다:
JointSemantic 속성 | WeightSemantic 속성 |
|---|---|
QVector4D(1, 2, 0, 0) | QVector4D(0.5, 0.25, 0.0, 0.0) |
이 버텍스는 조인트1의 움직임의 50%와 조인트2의 움직임의 25%만큼 이동하게 됩니다.
또한, 스켈레톤은 추상적인 표현이므로 모델은 관절에 대한 기하학적 정보를 명시해야 합니다. 성능상의 이유로 이 정보는 직접 명시하지 않습니다. 대신, ` Model.inverseBindPoses `에는 각 관절을 초기 위치로 이동시키는 데 필요한 변환 행렬의 역행렬이 포함되어 있습니다.
스켈레톤 애니메이션 적용
골격 내의 관절을 변환하면 해당 관절에 연결된 모든 정점이 이동합니다. Joint 클래스는 Node 클래스를 상속받으므로, 표준 QML animations 를 사용하여 골격을 간단히 애니메이션화할 수 있습니다.
NumberAnimation {
target: joint1
property: "eulerRotation.z"
duration: 5000
from: -90
to: 90
running: true
}SequentialAnimation, ParallelAnimation 및 NumberAnimation 을 중첩하여 복잡한 애니메이션을 만들 수도 있지만, 일반적으로 스킨이 적용된 모델에 애니메이션을 적용할 때는 타임라인 애니메이션을 사용하는 것이 더 편리합니다.
© 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.