Как переместить камеру за моделью с таким же углом?

Я сталкиваюсь с трудностями при перемещении камеры за объектом в трехмерном мире. Я бы создал два режима просмотра.

1: для кадров в секунду (от первого лица). 2-й: внешний вид сзади персонажа (второе лицо).

Я искал в сети какой-то пример, но он не работает в моем проекте.

Вот мой код, используемый для изменения вида при нажатии F2

 //Camera
        double X1 = this.camera.PositionX;
        double X2 = this.player.Position.X;
        double Z1 = this.camera.PositionZ;
        double Z2 = this.player.Position.Z;


        //Verify that the user must not let the press F2
        if (!this.camera.IsF2TurnedInBoucle)
        {
            // If the view mode is the second person
            if (this.camera.ViewCamera_type == CameraSimples.ChangeView.SecondPerson)
            {
                this.camera.ViewCamera_type = CameraSimples.ChangeView.firstPerson;

                //Calcul position - ?? Here my problem
                double direction = Math.Atan2(X2 - X1, Z2 - Z1) * 180.0 / 3.14159265;
                //Calcul angle - ?? Here my problem

                this.camera.position = ..
                this.camera.rotation = ..

                this.camera.MouseRadian_LeftrightRot = (float)direction;
            }
            //IF mode view is first person
            else
            {
                    //....

person Mehdi Bugnard    schedule 07.12.2012    source источник


Ответы (2)


Вот очень простая камера от третьего лица (то, что вы имели в виду под вторым лицом) в Xna. Предполагается, что у вас сохранена мировая матрица игрока и вы можете получить к ней доступ:

Vector3 _3rdPersonCamPosition = playerWorldMatrix.Translation + (playerWorldMatrix.Backward * trailingDistance) + (playerWorldMatrix.Up * heightOffset);// add a right or left offset if desired too
Vector3 _3rdPersonCamTarget = playerWorldMatrix.Translation;//you can offset this similarly too if desired
view = Matrix.CreateLookAt(_3rdPersonCamPosition, _3rdPersonCamTarget , Vector3.Up);

Если ваша FPS-камера работает правильно и предполагает, что она находится в том же положении и ориентации, что и игрок, вы можете заменить ее матрицей вида вместо playerWorldMatrix выше, как это:

Matrix FPSCamWorld = Matrix.Invert(yourWorkingFPSviewMatrixHere);

Теперь везде, где я написал playerWorldMatrix, вместо него можно использовать FPSCamWorld.

person Steve H    schedule 08.12.2012

Если бы я был на вашем месте, я бы взял вашу ныне работающую FPS-камеру (я предполагаю, что она движется правильно, имеет позиционную матрицу и т. д.?) и добавил к ней еще одно преобразование перевода, чтобы «переместить ее» назад за игроком.

Перефразируй:

Если ваша «матрица перевода/просмотра» для представления FPS выглядит примерно так:

(извините, давно не работал с XNA, поэтому не помню правильных имен классов)

var camTranslateMatrix = [matrix representing player position];
var camDirectionMatrix = [matrix representing player direction, etc];
var camViewMatrix = camTranslateMatrix * camDirectionMatrix;

Затем вы можете изменить его так:

var camTranslateMatrix = [matrix representing player position];
var camDirectionMatrix = [matrix representing player direction, etc];

// If not in 3rd person, this will be identity == no effect
var camThirdPersonMatrix =
       IsInThirdPersonMode ?
             new TranslateMatrix(back a bit and up a bit) :
             IdentityMatrix();

var camViewMatrix = 
      camTranslateMatrix * 
      camDirectionMatrix * 
      camThirdPersonMatrix;

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

person JerKimball    schedule 07.12.2012