Tatsächlich wurden die Vertices im BlenderScript vortransformiert. Hm nun habe ich eine Lösung für Modelle mit einem Bone. Mit mehreren sieht das ganze aber wieder merkwürdig aus.
Wenn ich nun die Vertices beim Laden alle in die Bone-Spaces transformiere, bekomme ich bei 2 Bones irgendwelche merkwürdigen Formen:
|
C#-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
...
absoluteTransform = bone.Transform * parentAbsoluteMatrix;
InverseBindMatrices[j] = Matrix.Invert(absoluteTransform);
...
Matrix m = InverseBindMatrices[vertices[i].BlendIndices0] * vertices[i].BlendWeight.X
+ InverseBindMatrices[vertices[i].BlendIndices1] * vertices[i].BlendWeight.Y
+ InverseBindMatrices[vertices[i].BlendIndices2] * vertices[i].BlendWeight.Z
+ InverseBindMatrices[vertices[i].BlendIndices3] * vertices[i].BlendWeight.W;
vertices[i].Position = Vector3.Transform(Vertices.Positions[i], m);
vertices[i].Normal = Vector3.Transform(Vertices.Normals[i], m);
...
|
Die Matrizen für den Shader berechne ich dann so:
|
C#-Quelltext
|
1
2
|
AbsoluteTransforms[bone.Index] = Transforms[bone.Index] * parentMatrix;
SkinTransforms[bone.Index] = AbsoluteTransforms[bone.Index
|
Wobei Transforms die relativen Transformen jeweils eines Frames beinhält.
Transformiere ich die Vertices zu beginn nicht, bekomme ich bei 2 Bones dass richtige Bild, wenn ich die Shader Matrizen so berechne:
|
C#-Quelltext
|
1
2
3
|
AbsoluteTransforms[bone.Index] = Transforms[bone.Index] * parentMatrix;
for (int i = 0; i < SkinTransforms.Length; i++)
SkinTransforms[i] = Mesh.InverseBindMatrices[i] * AbsoluteTransforms[i];
|
Bei mehr als 2 Bones pro Vertex sieht das dann aber wieder anders aus.