如何以相同的角度将相机移到模型后面?

时间:2012-12-07 20:56:37

标签: c# 3d xna camera

我遇到了将相机移到3D世界中的物体后面的困难。我会创建两种视图模式。

1:对于fps(第一人称)。 第二名:角色背后的外部视图(第二人称)。

我在网上搜索了一些例子,但它在我的项目中不起作用。

如果按下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
            {
                    //....

2 个答案:

答案 0 :(得分:1)

如果我是你,我会带你现在正在工作的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;

有意义吗?这样,每次这样做时,在两个视图之间切换都没有大量令人讨厌的数学,这是微不足道的。

答案 1 :(得分:1)

这是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