我有一个平台模型,上面装有炮塔。炮塔有两个枪管,我正试图从枪管中发射子弹。
炮塔本身是模型中包含的网格。我可以通过操纵 ModelBone.Transform 矩阵来旋转炮塔,如下所示:
turretBone.Transform = Matrix.CreateRotationX(3.14f /2f) * turretMatrix * Matrix.CreateTranslation(turretBone.Transform.Translation);
theModel.CopyAbsoluteBoneTransformsTo(transforms);
其中theModel代表整个模型(平台 + 炮塔),turretBone是代表炮塔的 ModelBone,turretMatrix代表一个 4x4 XNA 矩阵,描述炮塔面向玩家的旋转。
这部分工作完美。
现在,我想从炮塔的枪管尖端发射一颗子弹。由于某种原因,我无法确定枪管尖端的位置,因此我将其用作子弹的起始位置。
火的方向没问题,因为我使用 turretBone.Transform.Down 作为方向。(我知道向上/向下/等是相对的,但将向下想象为在顶视图射击游戏中,枪管朝玩家向下射击,即在 XNA 2D 中增加 Y)。
我知道 turretBone.Transform 是相对于它的父级的,对吗?那么,如果我想向右移动 100 个单位,向下移动 400 个单位,我该怎么办?
我试图做这样的事情:
Position + turretBone.Translation + turretBone.Transform.Right * 900f + turretBone.Transform.Down * 400f
将炮塔向右移动 900 个单位,向下移动 400 个单位(其中Position是整个模型的位置)。
但这不起作用;它在桶的尖端正确开始,但随着它的旋转,它并没有完全跟随它)。
我想到了另一种解决方案,在枪管顶端添加两个小球体,并以某种方式获取它们在世界空间中的坐标,从而将子弹的起始位置放置在那里。知道该怎么做吗?
谢谢!