2012-08-12 88 views
1

我试图通过使用相机创建一个等角(35度)视图。XNA设置等距相机视图或世界?

我画绕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项目。

+0

什么是“出于某种原因,被切断的旋转给这个结果的某一个点”是什么意思?我认为你遗漏了一个字。 – 2012-08-13 00:07:41

+0

感谢,我忘了“三角” – 2012-08-13 01:13:43

回答

1

你的三角形是由远平面裁剪。

当您的GPU渲染的东西,它只呈现落在范围内的像素(-1,-1,0)(1,1,1)。即:在视口的左下角和右上角之间。但也在Z轴上的某个“近”平面和某个“远”平面之间。 (与裁剪一样,这也决定了深度缓冲区所覆盖的值的范围。)

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

简单的答案是增加你的远平面的距离,使你的所有几何落在光栅区域内。这是Matrix.CreateOrthographic的第四个参数。

增加你的近及远平面之间的距离会减少你的深度缓存的精度 - 因此避免任何大于你需要它。

+0

我能够通过设置近平面为-500修复它,但它混淆了我,因为我虽然我们只能在近平面正值 – 2012-08-13 11:19:11

+0

负近平面的产生问题*透视*照相机。透视相机代表视图*平截头体*。如果近平面为零,那么近平面将是单个点,如果近平面是负平面,则近平面(以及相机后面的所有几何体)将被倒置。这会导致各种怪异。但是,*正交*相机会创建视图*棱镜*,因此无论放置在哪个位置,近距离的脸部都始终保持相同的大小 - 负向位置正常。 – 2012-08-13 11:54:21

+0

谢谢。如果你不介意,我想问最后一个问题。我仍然不完全理解效果如何工作,但我可能需要绘制不在等轴测视图中的3D对象/模型。我应该将相机旋转到等轴测视图还是旋转3d对象?每个效果都可以拥有自己的相机吗?你可以帮我分配谢谢 – 2012-08-13 13:53:38

0

我觉得你远平面裁剪是它,所以你应该做更大的投影矩阵远平面参数...

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