1

我正在尝试使用相机创建等距(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 项目。

4

2 回答 2

2

你的三角形被远平面剪裁了。

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

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

简单的答案是增加与远平面的距离,以使所有几何图形都落在栅格区域内。它是 的第四个参数Matrix.CreateOrthographic

增加近平面和远平面之间的距离会降低深度缓冲区的精度 - 因此请避免将其设置得比您需要的大。

于 2012-08-13T08:03:30.730 回答
0

我认为你的远平面正在裁剪它,所以你应该使投影矩阵远平面参数更大......

 projMat = Matrix.CreateOrthographic(width, height, 1, 10000);
于 2012-08-13T07:58:08.157 回答