【问题标题】:Moving child objects as parent object rotates当父对象旋转时移动子对象
【发布时间】:2013-08-21 16:27:40
【问题描述】:

我在尝试串联移动简单模型时遇到问题。我有 20 个较小的模型连接到一个较大的模型。它本质上是一个带有多个外部大炮的飞碟。我见过其他问题,比如this one,看起来几乎是我想要的。但是,这只会创建绘图转换。我实际上需要在 3d 空间中移动子模型,因为它们可以被独立破坏,因此需要碰撞检测。这是我旋转父级的方式(在 Update() 函数中):

angle += 0.15f;

RotationMatrix = Matrix.CreateRotationX(MathHelper.PiOver2) * Matrix.CreateRotationZ(MathHelper.ToRadians(angle) * MathHelper.PiOver2);

我尝试了很多解决方案,但定位总是不正确,所以它们看起来并不依附。这是我得到的最接近的:

cannons[x].RotationMatrix = Matrix.CreateRotationX(MathHelper.PiOver2) * 
Matrix.CreateRotationZ(MathHelper.ToRadians(angle + cannons[x].angle) * 
MathHelper.PiOver2);

cannons[x].position.X = (float)(Math.Cos(MathHelper.ToRadians(angle + cannons[x].originAngle) *
 MathHelper.PiOver2) * 475) + position.X;

cannons[x].position.Y = (float)(Math.Sin(MathHelper.ToRadians(angle + cannons[x].originAngle) *
 MathHelper.PiOver2) * 475) + position.Y;

我在该代码中做错了什么?或者,如果我的方法完全不可行,那么正确的做法是什么?

【问题讨论】:

    标签: c# xna


    【解决方案1】:

    您应该对所有内容使用矩阵转换。

    class Physics {
    
     public Vector3 Traslation;
     public Vector3 Scale;
     public Quaternion Rotation;
    
     public Physics Parent;
     public List<Physics> Children;
     public Matrix World;
    
    
     public Update() {
          World =   Matrix.CreateScale(Scale) 
                  * Matrix.CreateFromQuaternion(Rotation) 
                  * Matrix.CreateTranslation;
          if (Parent!=null) {
             World *= Parent.World ;
          }    
          foreach (var child in children) child.Update();         
     }
    }
    

    意识到这段代码没有优化,可以改进。

    这样你的大模型应该有一个物理对象和小模型的 20 个物理对象,通过 Parent 属性附加到大模型。

    如果您需要绝对坐标中的对象的 Traslation、Rotation 和 Scale,您可以使用 Matrix.Decompose 方法,尽管将 World 矩阵传递给您的着色器以转换顶点要好得多。

    【讨论】:

    • 我不确定我是否理解。如果我使用它,我是否必须完全替换所有与位置相关的代码?
    • 子位置将与父空间相关,如果您移动大模型并更新变换,则附加到父空间的所有内容都将被移动而不改变其平移,旋转和缩放也是如此,所以你不需要为你的大炮做额外的计算
    • +1 表示没有三角函数的解决方案。欧拉角非常不适合做 3D 数学。就个人而言,我会拥有一个 4x4 矩阵,而不是单独的缩放、旋转和平移值。我发现四元数太过分了,在数学上比矩阵更抽象、更复杂。是否有任何原生处理四元数的 GPU?只等……
    • 单矩阵可以更快但更难理解,四元数非常适合插值旋转:)
    • @Blau:是的,四元数对旋转很有用,我当然使用过它们,但主要是因为它们比其他任何东西更有效(4 个浮点数对 9 个旋转矩阵),但作为 OP似乎对这一切都很陌生,坚持使用矩阵将是一个很好的第一步。一旦你理解了数学,转向四元数会容易得多。让他了解分层系统的想法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多