Ось у камеры от третьего лица неправильно сферическая вокруг игрока - проблема логики - PullRequest
4 голосов
/ 09 марта 2011

Я делаю 3D-игру в XNA, используя Ox Engine. Документов очень мало, и я до сих пор выживаю, но теперь я уже довольно давно преодолел логический блок и думаю, что пришло время обратиться за помощью извне.

Все движения и мышь выглядят как x, и камера следует правильно, однако, когда я перемещаю мышь вверх / вниз по оси Y, чтобы камера двигалась в своем круговом «пузыре» вокруг персонажа, это заставляет все остальное выходить из синхронизации. Персонаж должен вращаться вокруг камеры , но также необходимо указать, в каком направлении персонаж направлен на . Я не могу иметь оба.

Когда у меня есть код, чтобы указать ему направление персонажа и отойти от него (транспонировать), он перемещает саму орбиту:

</p> <pre><code> if (changeY > 0) { if (camMemory.Y > 110) tempMatrix *= Matrix.CreateFromAxisAngle(model.Orientation.Left, MathHelper.ToRadians(changeY)); } else if (changeY < 0) { if (camMemory.Y < 400)//FAKE PLACEHOLDER VALUE... highest point in arc goes here tempMatrix *= Matrix.CreateFromAxisAngle(model.Orientation.Left, MathHelper.ToRadians(changeY)); } Vector3 camPos = new Vector3(0, 0, 0) ; camMemory = tempMatrix.Translation; //NOTE: this is the piece that causes the "bubble" to move moveAmount = tempMatrix.Forward * 200f; ///// tempMatrix.Translation += moveAmount; camPos = tempMatrix.Translation + model.Position; //Pointer in front, Camera behind, make camera face pointer. Engine.Camera.SetTransformByLookTarget(camPos, model.Orientation.Up, trackPos);

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

Однако, когда я исправляю эту проблему, я не достаточно далеко от персонажа, чтобы иметь правильное представление, и просто умножение на tempMatrix.Translation , чтобы «расширить» «пузырь», заставляет меня сильно упасть места. Я лишен прозрений. Любая идея будет принята с благодарностью.

tl, dr : Как сделать так, чтобы орбитальная камера пузырилась вокруг персонажа, больше не перемещая центральную точку (транспонирование не работает или я использую это неправильно!)

Редактировать: Я хотел бы наградить это, лол

1 Ответ

3 голосов
/ 10 марта 2011

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

Способ получить их оба - это установить положение камеры на основе смещений для базисных векторов матрицы персонажа. Таким образом, когда персонаж вращается и меняет базовый вектор, ваша камера будет следовать ему. В то же время или независимо, изменение значения смещения также заставит вашу камеру вращаться вокруг персонажа.

Похоже, что ваш код вращается только вокруг оси X модели. Чтобы продемонстрировать подход к этой оси, вы можете сделать что-то вроде этого:

Vector3 offset = Vector3.Transform(model.Orientation.Backward, Matrix.CreateFromAxisAngle(model.Orientation.Left, camMemory.Y));

camPos = model.Position + (offset * bubbleSize);

Так что теперь, если персонаж вращается сам по себе, камера будет следовать, потому что модель. Ориентация. Назад будет меняться. Но также, если camMemory.Y изменяется (я предполагаю, что это отключено от входа), камера будет вращаться самостоятельно.

Обратите внимание, как масштабирование вектора смещения влияет на размер пузырька.

...