【问题标题】:xna 3d bullet bath and draw method gone wrongxna 3d 子弹浴和绘制方法出错
【发布时间】:2023-03-29 03:34:01
【问题描述】:

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

请记住,我的宇宙飞船是子弹对象的场,这就是我获得宇宙飞船的方式。旋转四元数。提前致谢。

【问题讨论】:

    标签: c# visual-studio xna xna-4.0


    【解决方案1】:

    您应该将与当前执行顺序相反的 effect.World 矩阵连接起来。这不应该影响对象的形状,但会解决其他问题。应该是这样的:

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

    XNA 是一个行主框架,串联是从左到右的。您的代码(从右到左)是您为 OpenGL(列主要框架)所做的方式。

    【讨论】:

      【解决方案2】:

      据我了解,根据您的代码,如果您的飞船改变方向,您的炮弹会在发射后改变方向。

      您需要创建一个射弹对象并存储每个射弹的方向每个射弹的对象。当射弹被实例化时,您将其方向设置为与船相同(如您在上面所做的那样)。但是,在该弹丸的整个剩余生命周期内,您都不需要改变它的方向。

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

      子弹 1 和子弹 2 将各自具有独特的矢量,它们可以在上面移动。

      【讨论】:

      • 是的,上面的代码只是为了测试..我已经这样做了,我得到了相同的结果..所以这不是其他问题..:S
      • 你能写一些调试代码来确认你的单个射弹的方向向量在帧之间没有变化吗?
      • 另外,你的弹丸在发射后会改变方向,还是只是以奇怪的方向发射?
      • 事情不是我遇到问题的方向。对象在draw方法中改变形状!我不知道为什么!:我也有方向,但这不是那么重要。
      • 好的,所以你的子弹正在改变形状?如果是这种情况,这很容易解决
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多