スキニング
3Dモデルを「スケルトン」と呼ばれるボーン構造を用いて変形させる技術 ポリゴンの3Dモデルを変形させる場合、3Dモデルを構成する頂点に対して、位置情報とは別に対応するボーンおよびそのボーンから受ける影響を表す「ウェイト」を格納する 実際には以下のような感じのデータとなる:
code:ts
interface Vertex {
position: Vector3;
normal: Vector3;
uv: Vector2;
joints: {
bone: Bone;
weight: number;
}[];
}
実際の3Dモデルデータにおいては、ボーンはボーンを表すインデックスとして表現されることが多い
実装
https://gyazo.com/bb1b53d738b1e754202d43a213980992
混ぜるジョイントは4個が主流
スキンの各ジョイントは inverseBindMatrix を持つ
これはジョイントのレスト状態におけるメッシュと相対な空間の逆行列であり、 実際に使うときはメッシュの頂点を inverseBindMatrix を用いてジョイントのローカル空間に引き込んだ上でジョイントの行列を適用する
code:js
jointMatrixi = mesh.worldMatrix.inverse * jointi.worldMatrix * inverseBindMatrixi code:glsl
// ...
in vec4 skinIndex;
in vec4 skinWeight;
void main() {
// ...
vec4 skinned = vec4(0.0);
skinned += (
) * position;
// ...
}
実装例