我有一个我想画的汽车模型,包括两个部分,车身和轮胎。每个都是单独的* .OBJ文件中的单独模型,每个模型都使用单独的drawcall绘制。
初始图纸看起来不错,所有内容似乎都排好了:
但是,当我开始旋转时,一切都会中断:
每个对象都以相同的方式进行转换(使用XNAMath的平移,缩放和旋转矩阵),每个对象在世界空间中都有自己的位置。
我认为这里的问题是轮换的“锚点”。
还有一个问题,你们知道什么是代表这种结构的正确方法吗?现在这些是两个独立的实例,但是如果我想添加内部,镜像等,那么使用所有对象的公共属性创建一些容器类会更好吗?对吧?
答案 0 :(得分:1)
似乎你的矩阵连接是错误的。因为你在一个大模型中添加不同的模型,你应该这样做:
在您的模型中,您的汽车零件看起来在[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;
...
}
我希望这会对你有所帮助, 祝你好运!