XNA мир космоса и движение объекта - PullRequest
3 голосов
/ 22 ноября 2011

Я только начал с 3D-кодирования в XNA и пытаюсь разобраться в нескольких вещах.

Моя цель с XNA - сделать игру для космических симуляторов (оригинал, я знаю), я могу рисовать модели, и моя камера работает так, как мне бы хотелось, где я сталкиваюсь с проблемамипонимание того, как двигать корабли противника.Я сделал кое-что стоящее с рулевым поведением в 2d, но не в 3d.

Мой вопрос:

Если я пытаюсь перемещать корабли, чтобы «искать» местоположение, как это движение влияет на матрицу мира корабля (если вообще)?Я использую vector3s и добавляю ускорение к скорости, а затем к скорости.Это правильный подход?

Мне не нужно писать прямо сейчас, иначе я бы просто пытался понять, какой подход выбрать.

Спасибо

1 Ответ

4 голосов
/ 19 января 2012

Дайте вашему объекту / объекту / кораблю положение (Vector3) и вращение (Matrix), и затем вы можете использовать следующий код (и образец внизу этого ответа), чтобы перемещать корабль.

Например, чтобы переместить корабль вперед на 5 единиц:

Entity myShip = new Entity();
myShip.GoForward(5.0f);

Чтобы ваш корабль перевернулся на 90 градусов

myShip.Roll(MathHelper.PiOver2);

А вот пример кода

public class Entity
{
    Vector3 position = Vector3.Zero;
    Matrix rotation = Matrix.Identity;

    public void Yaw(float amount)
    {
        this.rotation *= Matrix.CreateFromAxisAngle(this.rotation.Up, amount);
    }

    public void YawAroundWorldUp(float amount)
    {
        this.rotation *= Matrix.CreateRotationY(amount);
    }

    public void Pitch(float amount)
    {
        this.rotation *= Matrix.CreateFromAxisAngle(this.rotation.Right, amount);
    }

    public void Roll(float amount)
    {
        this.rotation *= Matrix.CreateFromAxisAngle(this.rotation.Forward, amount);
    }

    public void Strafe(float amount)
    {
        this.position += this.rotation.Right * amount;
    }

    public void GoForward(float amount)
    {
        this.position += this.rotation.Forward * amount;
    }

    public void Jump(float amount)
    {
        this.position += this.rotation.Up * amount;
    }

    public void Rise(float amount)
    {
        this.position += Vector3.Up * amount;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...