看来你的矩阵连接是错误的。因为你在一个大模型中添加不同的模型,你应该这样做:
-
单个部分的每个网格的顶点在x、y、z的范围[-1,1]内
-
将Objectspace中的每个零件移动到其与汽车相对的位置(缩放、旋转、移动)。通常,Objectspace的x、y、z的范围为[-1,1]。一、 e轮胎可能应按比例缩小并移动到车体底部。
-
使用一个世界矩阵将整个汽车移动到场景中的最终位置(缩放、旋转、移动)。在这里,您可以对汽车进行实际缩放、旋转或平移,以将其放置在最终场景中。
-
这是通过将WorldMatrix与所有零件的每个ObjectSpace矩阵相乘来完成的。
-
因此,对于每个Object,您都会得到一个具有以下结构的Matrix链:
carPart的LocalSpace->汽车的ObjectSpace->场景中的世界空间=>(ObjectSpaceMatrix*WorldMatrix适用于汽车的每个部分)。
在您的模型中,您的汽车零件似乎在[0,1]范围内。因为缩放是从(0,0,0)开始的,所以通常会向一个方向过度移动。要么更改网格中的顶点,要么首先使用[-0.5、-0.5和-0.5]平移对象部分,以确保对象居中且缩放正确。
下面是一些你可以使用的结构的伪代码:
class CarPart
{
Float4x4 ObjectSpaceMatrix; //matrix moves part to its position in the "CarObjectSpace" withing range[-1,1]
Mesh Instance;
}
class Car
{
Float4x4 WorldSpaceMatrix; //matrix moves complete mesh inside the scene
CarPart Tires;
CarPart Body;
CarPart Engine;
...
}
void render()
{
Float4x4 FinalTiresMatrix = Car.Tires.ObjectSpaceMatrix * Car.WorldSpaceMatrix;
Float4x4 BodyTiresMatrix = Car.Body.ObjectSpaceMatrix * Car.WorldSpaceMatrix;
...
}
我希望这对你有帮助,
祝你好运