управлять космическим кораблем по 3 осям в XNA - PullRequest
1 голос
/ 14 апреля 2011

когда я управляю космическим кораблем по 1 оси, все в порядке, то есть глубина (z) и поворот на плоскости z на 360 градусов, то есть 2 оси. У меня также есть камера прямо за ней, я должен сохранить свою позицию. Когда 3-й приходит на место, все идет плохо. позвольте мне показать вам некоторый код: Вот часть, которая терпит неудачу:

метод рисования космического корабля:

public void Draw(Matrix view, Matrix projection)
        {
public float ForwardDirection { get; set; }
        public float VerticalDirection { get; set; }

            Matrix[] transforms = new Matrix[Model.Bones.Count];
            Model.CopyAbsoluteBoneTransformsTo(transforms);

            Matrix worldMatrix = Matrix.Identity;
            Matrix worldMatrix2 = Matrix.Identity;

            Matrix rotationYMatrix = Matrix.CreateRotationY(ForwardDirection);
            Matrix rotationXMatrix = Matrix.CreateRotationX(VerticalDirection); // me

            Matrix translateMatrix = Matrix.CreateTranslation(Position);

            worldMatrix = rotationYMatrix * translateMatrix;
            worldMatrix2 = rotationXMatrix * translateMatrix;
            //worldMatrix*= rotationXMatrix;

            foreach (ModelMesh mesh in Model.Meshes) //NEED TO FIX THIS
            {
                foreach (BasicEffect effect in mesh.Effects)
                {
                    effect.World =
                        worldMatrix * transforms[mesh.ParentBone.Index]; ; //position
                    //effect.World =
                        //worldMatrix2 * transforms[mesh.ParentBone.Index]; ; //position
                    effect.View = view; //camera
                    effect.Projection = projection; //2d to 3d

                    effect.EnableDefaultLighting();
                    effect.PreferPerPixelLighting = true;
                }
                mesh.Draw();
            }
        }

Для дополнительной оси реализован worldMatrix2, который я не знаю, как объединить с другой осью. Я умножу это? Также:

Метод обновления камеры имеет похожую проблему:

public void Update(float avatarYaw,float avatarXaw, Vector3 position, float aspectRatio)
        {
            //Matrix rotationMatrix = Matrix.CreateRotationY(avatarYaw);
            Matrix rotationMatrix2 = Matrix.CreateRotationX(avatarXaw);

            //Vector3 transformedheadOffset =
                //Vector3.Transform(AvatarHeadOffset, rotationMatrix);

            Vector3 transformedheadOffset2 = Vector3.Transform(AvatarHeadOffset, rotationMatrix2);
            //Vector3 transformedheadOffset2 = Vector3.Transform(transformedheadOffset, rotationMatrix2);


            //Vector3 transformedReference =
                //Vector3.Transform(TargetOffset, rotationMatrix);


            Vector3 transformedReference2 = Vector3.Transform(TargetOffset, rotationMatrix2);
            //Vector3 transformedReference2 = Vector3.Transform(transformedReference, rotationMatrix2);


            Vector3 cameraPosition = position + transformedheadOffset2;  /** + transformedheadOffset;  */
            Vector3 cameraTarget = position + transformedReference2;  /** +  transformedReference;  */

            //Calculate the camera's view and projection 
            //matrices based on current values.
            ViewMatrix =
                Matrix.CreateLookAt(cameraPosition, cameraTarget, Vector3.Up);
            ProjectionMatrix =
                Matrix.CreatePerspectiveFieldOfView(
                    MathHelper.ToRadians(GameConstants.ViewAngle), aspectRatio,
                    GameConstants.NearClip, GameConstants.FarClip);
        }
    }

Наконец, вот метод обновления класса Game:

spaceship.Update(currentGamePadState,
    currentKeyboardState); // this will be cahnged when asteroids are placed in the game, by adding a new parameter with asteroids.
            float aspectRatio = graphics.GraphicsDevice.Viewport.AspectRatio;
            gameCamera.Update(spaceship.ForwardDirection,spaceship.VerticalDirection,
                spaceship.Position, aspectRatio);

1 Ответ

1 голос
/ 15 апреля 2011

Где-то в вашем коде у вас, вероятно, есть методология, которая манипулирует и устанавливает переменные «ForwardDirection» и «VerticalDirection», которые, по-видимому, представляют угловые значения вокруг оси Y & X соответственно. Предположительно, вы можете иметь переменную, которая представляет угловое значение вокруг оси Z. Я также предполагаю (и ваш код подразумевает), что эти переменные, в конечном счете, определяют, как вы сохраняете ориентацию вашего космического корабля от кадра к кадру.

Пока вы продолжаете пытаться изобразить ориентацию, используя эти углы, вам будет трудно добиться контроля над своим космическим кораблем.

Существует несколько типов представлений ориентации. Подход с тремя углами имеет свои недостатки, когда речь идет о комбинировании поворотов в трех измерениях.

Я рекомендую вам сменить парадигму и подумать о сохранении и управлении вашими ориентациями в форме матрицы или кватерниона. Когда вы научитесь манипулировать матрицей или кватернионом, то, что вы пытаетесь сделать, становится невероятно легким.

...