我有一个平台模型,上面装有一个炮塔。炮塔有两个枪管,我正试图从枪管中射出子弹。
炮塔本身是模型中包含的网格。我可以通过操纵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个单位(其中位置是整个模型的位置)。
但这不起作用;它在桶的尖端正确地开始,但是当它旋转时它并不完全遵循它。)
我想到了另一个解决方案,在枪管的尖端添加两个小球体,并以某种方式获得它们在世界空间中的坐标,以便将子弹的起始位置放置在那里。知道怎么做吗?
谢谢!
答案 0 :(得分:0)
我已经使用第二种方法解决了这个问题(将球体置于枪管尖端的方法)。
Matrix world = transforms[sphereBone.Index] * any_other_transformation_applied
之后
theModel.CopyAbsoluteBoneTransformsTo(transforms);
做了这个伎俩。
感谢。