我遇到了将相机移到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
{
//....
答案 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
。