我正在尝试使用相机创建等距(35度)视图。
我正在画一个围绕Z轴旋转的三角形。
由于某种原因,三角形在旋转的某个点被切割 给出这个结果
我按角度和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项目。
答案 0 :(得分:2)
您的三角形正被远平面裁剪。
当GPU渲染内容时,它只会将( - 1,-1,0)范围内的像素渲染为(1,1,1)。即:在视口的左下角和右上角之间。但也在Z轴上的一些“近”平面和一些“远”平面之间。 (除了进行裁剪之外,这也决定了深度缓冲区覆盖的值的范围。)
您的投影矩阵采用世界或视图空间中的顶点,并对它们进行变换,使其适合光栅空间。您可能已经看到了透视投影矩阵的view frustum的标准图像,它显示了当转换回世界空间时该栅格区域的边缘是如何出现的。正交投影也存在同样的情况,但视区的边缘是平行的。
简单的答案是增加到远处平面的距离,以便所有几何体都落在栅格区域内。这是Matrix.CreateOrthographic
的第四个参数。
增加近平面和远平面之间的距离会降低深度缓冲的精度 - 所以避免使它比你需要的更大。
答案 1 :(得分:0)
我认为你的远方平面正在裁剪它,所以你应该把投影矩阵做得更大一点平面论证......
projMat = Matrix.CreateOrthographic(width, height, 1, 10000);