XNA中网格的偏移量

时间:2012-07-03 13:13:42

标签: 3d xna offset mesh

我有一个平台模型,上面装有一个炮塔。炮塔有两个枪管,我正试图从枪管中射出子弹。

炮塔本身是模型中包含的网格。我可以通过操纵ModelBone.Transform矩阵来旋转炮塔,如下所示:

turretBone.Transform = Matrix.CreateRotationX(3.14f /2f) * turretMatrix * Matrix.CreateTranslation(turretBone.Transform.Translation);
theModel.CopyAbsoluteBoneTransformsTo(transforms);

其中 theModel 代表整个模型(平台+炮塔), turretBone 是代表炮塔的ModelBone, turretMatrix 代表4x4 XNA矩阵它描述了炮塔的旋转,使其面向玩家。

这部分完美无缺。

现在,我想从炮塔的尖端发射一颗子弹。出于某种原因,我无法确定barrells尖端的位置,以便我将其用作子弹的起源位置。

火焰的方向是可以的,因为我使用turretBone.Transform.Down作为方向。 (我知道上/下/等是相对的,但想象下来就像在顶视野射击游戏中,枪管朝向玩家射击,即在XNA 2D中增加Y)。

据我所知,turretBone.Transform是相对于它的父级的,对吗?所以,如果我想向右移动100个单位,向下移动400个单位,我该怎么做?

我试过这样的事情:

Position + turretBone.Translation + turretBone.Transform.Right * 900f + turretBone.Transform.Down * 400f

向右移动900个单位,从炮塔向下移动400个单位(其中位置是整个模型的位置)。

但这不起作用;它在桶的尖端正确地开始,但是当它旋转时它并不完全遵循它。)

我想到了另一个解决方案,在枪管的尖端添加两个小球体,并以某种方式获得它们在世界空间中的坐标,以便将子弹的起始位置放置在那里。知道怎么做吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

我已经使用第二种方法解决了这个问题(将球体置于枪管尖端的方法)。

Matrix world = transforms[sphereBone.Index] * any_other_transformation_applied

之后

theModel.CopyAbsoluteBoneTransformsTo(transforms);

做了这个伎俩。

感谢。