Как да преместя камерата зад модел със същия ъгъл?

Срещам, че изпитвам затруднения при преместването на камерата зад обект в 3D свят. Бих създал режим на два изгледа.

1: за fps (от първо лице). 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)


Ето една много проста камера от 3-то лице (това, което имахте предвид под 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