xna 3d пулевая ванна и метод рисования не удалось - PullRequest
4 голосов
/ 29 апреля 2011

Я разрабатываю 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();
        }
    }

Имейте в виду, что мой космический корабль - это поле объекта пули, и именно так я получаю космический корабль. Вращение кватерниона. Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 30 апреля 2011

Вы должны объединить эффект. Матрица мира противоположна порядку, в котором вы сейчас это делаете.Это не должно влиять на форму объекта, но решит другие проблемы.Должно быть так:

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

XNA - это основная структура строк, конкатенация слева направо.Ваш код (справа налево) - это то, как вы делаете это для OpenGL, основной структуры столбца.

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

Насколько я понимаю, на основании вашего кода ваши снаряды изменят направление после выстрела, если ваш корабль изменит направление.

Вам необходимо создать объект снаряда и сохранить направление каждого отдельного снаряда каждыйобъект снаряда.Когда снаряд создан, вы установите его направление так же, как и у корабля (как вы делали выше).Однако в течение всего оставшегося срока службы этого снаряда вам не нужно менять его направление.

Пример: пуля 1 выстреливает из ТОЧКИ А в ТОЧКУ В, затем корабль поворачивает и выпускает пулю 2 из ТОЧКИC на ТОЧКУ D.

Каждый из маркеров 1 и 2 будет иметь уникальные векторы, по которым они путешествуют.

...