旋转相关模型的正确方法

时间:2016-04-05 10:58:43

标签: 3d transformation directx-11

我有一个我想画的汽车模型,包括两个部分,车身和轮胎。每个都是单独的* .OBJ文件中的单独模型,每个模型都使用单独的drawcall绘制。

Input geometry

初始图纸看起来不错,所有内容似乎都排好了:

enter image description here

但是,当我开始旋转时,一切都会中断:

enter image description here

每个对象都以相同的方式进行转换(使用XNAMath的平移,缩放和旋转矩阵),每个对象在世界空间中都有自己的位置。

我认为这里的问题是轮换的“锚点”。

  • 如何围绕“锚点”旋转对象?
  • 应该使用哪个“锚点”?
  • 两个对象使用共同的“锚点”是否足够?

还有一个问题,你们知道什么是代表这种结构的正确方法吗?现在这些是两个独立的实例,但是如果我想添加内部,镜像等,那么使用所有对象的公共属性创建一些容器类会更好吗?对吧?

1 个答案:

答案 0 :(得分:1)

似乎你的矩阵连接是错误的。因为你在一个大模型中添加不同的模型,你应该这样做:

  1. 单个零件的每个网格都具有x,y,z
  2. 范围[-1,1]内的顶点
  3. 将对象空间中的每个部分移动到它在汽车中的位置(缩放,旋转,移动),通常,对象空间与x,y,z的范围[-1,1]相同。即轮胎可能应按比例缩小并移至车身底部。
  4. 将带有一个世界矩阵的整车移动到场景中的最终位置(缩放,旋转,移动)。在这里,您可以对汽车进行真正的缩放,旋转或平移,以将其放置在最终场景中。
  5. 这是通过将WorldMatrix与所有部分的每个ObjectSpace矩阵相乘来完成的。
  6. 因此,对于每个对象,您将获得具有以下结构的Matrix链: carPart的LocalSpace - >汽车的ObjectSpace - >场景中的WorldSpace => (ObjectSpaceMatrix * WorldMatrix用于汽车的每个部分)。
  7. 在您的模型中,您的汽车零件看起来在[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;
        ...
    }
    

    我希望这会对你有所帮助, 祝你好运!