Xna 3d子弹浴和绘制方法出错

本文关键字:绘制 方法 出错 3d 子弹 Xna | 更新日期: 2023-09-27 17:54:23

我正在设计一款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();
        }
    }

记住我的宇宙飞船是子弹物体的场,这就是我如何得到宇宙飞船的。旋转四元数。

Xna 3d子弹浴和绘制方法出错

您应该将效果连接起来。世界矩阵与你当前做的顺序相反。这不会影响物体的形状,但会解决其他问题。应该是这样的:

effect.World = transforms[mesh.ParentBone.Index] * worldMatrix;

XNA是一个行主要框架,连接是从左到右。你的代码(从右到左)是如何为OpenGL(一个列主框架)做的。

我的理解是,根据你的代码,如果你的船改变方向,你的炮弹在发射后会改变方向。

你需要创建一个抛射物体并存储每个抛射物体的方向每个抛射物体的方向。当弹丸被实例化时,你将把它的方向设置为与船相同(就像你上面所做的那样)。然而,在弹丸的整个生命周期内,你不需要改变它的方向。

示例:子弹1从A点向B点发射,然后船转向并从C点向d点发射子弹2

子弹头1和子弹头2将各自有唯一的运动向量