2012-08-12 79 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);