我正在设计一款3D游戏,其中我有一个太空飞船后面的相机可以移动。我在游戏中添加了一些小行星,我想添加子弹。我使用四元数来控制宇宙飞船的路径和它后面的摄像机。然而,当我在子弹上使用相同的四元数(特定的旋转以便我可以计算子弹的路径)时,我得到了一个非常有趣的效果并且路径完全错误。关于为什么会发生这种情况的任何想法?
public void Update(GameTime gameTime)
{
lazerRotation = spaceship.spaceShipRotation;
Vector3 rotVector = Vector3.Transform(new Vector3(0, 0, -1), lazerRotation);
Position += rotVector* 10 * (float)gameTime.ElapsedGameTime.TotalSeconds;
//
}
//spaceShipRotation = Quaternion.Identity;
//Quaternion additionalRot = Quaternion.CreateFromAxisAngle(new Vector3(0, -1, 0), leftRightRot) * Quaternion.CreateFromAxisAngle(new Vector3(1, 0, 0), upDownRot);
//spaceShipRotation *= additionalRot;
//Vector3 addVector = Vector3.Transform(new Vector3(0, 0, -1), spaceShipRotation);
// futurePosition += addVector * movement * velocity;
public void Draw(Matrix view, Matrix projection)
{
// //Quaternion xaxis = Quaternion.CreateFromAxisAngle(new Vector3(0, 0, -1), spaceship.leftrightrot);
// //Quaternion yaxis = Quaternion.CreateFromAxisAngle(new Vector3(0, 1, 0), spaceship.updownrot);
// //Quaternion rot = xaxis * yaxis;
//Matrix x = Matrix.CreateRotationX(spaceship.leftrightrot);
//Matrix y = Matrix.CreateRotationY(spaceship.updownrot);
//Matrix rot = x * y;
Matrix[] transforms = new Matrix[Model.Bones.Count];
Model.CopyAbsoluteBoneTransformsTo(transforms);
Matrix worldMatrix = Matrix.CreateFromQuaternion(lazerRotation) * Matrix.CreateTranslation(Position);
foreach (ModelMesh mesh in Model.Meshes)
{
foreach (BasicEffect effect in mesh.Effects)
{
effect.World = worldMatrix * transforms[mesh.ParentBone.Index]; //position
effect.View = view; //camera
effect.Projection = projection; //2d to 3d
effect.EnableDefaultLighting();
effect.PreferPerPixelLighting = true;
}
mesh.Draw();
}
}
请记住,我的宇宙飞船是子弹物体的一个领域,这就是我获得宇宙飞船的方式。旋转四元数。提前谢谢。
答案 0 :(得分:2)
你应该连接效果.World矩阵与你当前正在执行它的顺序相反。这不应该影响对象的形状,但会解决其他问题。它应该是这样的:
effect.World = transforms[mesh.ParentBone.Index] * worldMatrix;
XNA是一个主要的行框架,连接是从左到右。您的代码(从右到左)就是您为OpenGL这一列主要框架所做的工作。
答案 1 :(得分:1)
据我了解,根据您的代码,如果您的船改变方向,您的射弹将在被解雇后改变方向。
你需要创建一个射弹物体并存储每个射弹物体的每个射弹的方向。当实例化射弹时,您将其方向设置为与船舶相同(如上所述)。然而,在该射弹的整个生命周期中,你不需要改变它的方向。
示例:子弹1从POINT A向POINT B发射,然后船转动并从POINT C向POINT D发射子弹2.
子弹1和2将分别具有独特的向量。