XNA设置等距相机视图还是世界?

时间:2012-08-12 23:26:21

标签: c# 3d xna directx

我正在尝试使用相机创建等距(35度)视图。

我正在画一个围绕Z轴旋转的三角形。

由于某种原因,三角形在旋转的某个点被切割 给出这个结果

http://img442.imageshack.us/img442/8987/imagezle.jpg

我按角度和z距离计算摄像机位置 使用此网站:http://www.easycalculation.com/trigonometry/triangle-angles.php

这是我定义相机的方式:

// isometric angle is 35.2º => for -14.1759f Y = 10 Z
Vector3 camPos = new Vector3(0, -14.1759f, 10f);
Vector3 lookAt = new Vector3(0, 0, 0);
viewMat = Matrix.CreateLookAt(camPos, lookAt, Vector3.Up);


//projectionMatrix = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, Game.GraphicsDevice.Viewport.AspectRatio, 1, 100);
float width = GameInterface.vpMissionWindow.Width;
float height = GameInterface.vpMissionWindow.Height;
projMat = Matrix.CreateOrthographic(width, height, 1, 1000);

worldMat = Matrix.Identity;

这就是我重新计算世界矩阵旋转的方法:

worldMat = Matrix.CreateRotationZ(3* visionAngle);

// keep triangle arround this Center point
worldMat *= Matrix.CreateTranslation(center);

effect.Parameters["xWorld"].SetValue(worldMat);

// updating rotation angle
visionAngle += 0.005f;

知道我可能做错了什么吗?这是我第一次参与3D项目。

2 个答案:

答案 0 :(得分:2)

您的三角形正被远平面裁剪。

当GPU渲染内容时,它只会将( - 1,-1,0)范围内的像素渲染为(1,1,1)。即:在视口的左下角和右上角之间。但也在Z轴上的一些“近”平面和一些“远”平面之间。 (除了进行裁剪之外,这也决定了深度缓冲区覆盖的值的范围。)

您的投影矩阵采用世界或视图空间中的顶点,并对它们进行变换,使其适合光栅空间。您可能已经看到了透视投影矩阵的view frustum的标准图像,它显示了当转换回世界空间时该栅格区域的边缘是如何出现的。正交投影也存在同样的情况,但视区的边缘是平行的。

简单的答案是增加到远处平面的距离,以便所有几何体都落在栅格区域内。这是Matrix.CreateOrthographic的第四个参数。

增加近平面和远平面之间的距离会降低深度缓冲的精度 - 所以避免使它比你需要的更大。

答案 1 :(得分:0)

我认为你的远方平面正在裁剪它,所以你应该把投影矩阵做得更大一点平面论证......

 projMat = Matrix.CreateOrthographic(width, height, 1, 10000);