代码之家  ›  专栏  ›  技术社区  ›  Bartosz Boczula

旋转相关模型的正确方式

  •  0
  • Bartosz Boczula  · 技术社区  · 10 年前

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

    Input geometry

    最初的图纸看起来不错,一切看起来都很整齐:

    enter image description here

    然而,当我开始旋转时,一切都会破裂:

    enter image description here

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

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

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

    还有一个附带问题,你们知道用什么方式来表示这种结构吗?目前,这是两个独立的实例,但如果我想添加内部、镜子等,最好为所有对象创建一些具有公共属性的容器类,对吗?

    1 回复  |  直到 10 年前
        1
  •  1
  •   kaiser    10 年前

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

    1. 单个部分的每个网格的顶点在x、y、z的范围[-1,1]内
    2. 将Objectspace中的每个零件移动到其与汽车相对的位置(缩放、旋转、移动)。通常,Objectspace的x、y、z的范围为[-1,1]。一、 e轮胎可能应按比例缩小并移动到车体底部。
    3. 使用一个世界矩阵将整个汽车移动到场景中的最终位置(缩放、旋转、移动)。在这里,您可以对汽车进行实际缩放、旋转或平移,以将其放置在最终场景中。
    4. 这是通过将WorldMatrix与所有零件的每个ObjectSpace矩阵相乘来完成的。
    5. 因此,对于每个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;
        ...
    }
    

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

    推荐文章