2010-10-25 73 views
1

我正在編寫自己的3D引擎,我有這個矩陣來做透視效果。 (這是一個標準矩陣,所以沒有什麼有趣的)從3D平滑過渡到2D

public static Matrix3D PrespectiveFromHV(double fieldOfViewY, double aspectRatio, double zNearPlane, double zFarPlane, double mod) 
    { 
     double height = 1.0/Math.Tan(fieldOfViewY/2.0); 
     double width = height/aspectRatio; 
     double d = zNearPlane - zFarPlane; 

     var rm = Math.Round(mod, 1); 

     var m = new Matrix3D(
       width, 0, 0, 0, 
       0, height, 0, 0, 
       0, 0, (zFarPlane/d) * rm, (zNearPlane * zFarPlane/d) * rm, 
       0, 0, (-1 * rm), (1 - rm) 
      ); 

     return m; 
    } 

我可以讓我的場景看起來像2D,就像忽略矩陣。

但是想要做的是,使從3D到2D和背部平滑過渡...

任何一個有什麼想法?爲了使平滑過渡成爲可能,我需要在這個矩陣中改變什麼?

+0

爲什麼你米atrix稱爲Matrix3D?它是一個四乘四矩陣,所以你應該打電話給Matrix4x4相當清楚是什麼。或甚至更好,得到它的模板,所以我可以說矩陣 thecoshman 2010-10-25 23:23:07

+0

好吧。 Tnx我想到後來... – 2010-10-26 00:54:01

回答

1

我會使用插值m和所述的indentity矩陣I之間,像這樣:

讓阿爾法從1到0的α* M +(1-α)* I

編輯:

可以請你詳細說明

我可以讓我的場景看起來像 只是忽略矩陣。

這個想法是在2D(忽略矩陣)和3D(使用矩陣)之間進行插值。如果你解釋你如何忽略矩陣,插值應該是直截了當的。

+0

不..不工作..你的「算法」工作正常時,阿爾法是1 ...但其他值我得到相當搞砸的圖片... – 2010-10-25 20:31:05

+0

插值是方式去這裏。您基本上想要改變應用「根據深度縮放」的內容,直到您不再縮放事物爲止。 – thecoshman 2010-10-25 23:26:17

+1

你需要一個正交投影,而不是身份。 – 2010-10-25 23:58:42

0

嗯..忽略「何衛青」矩陣我做兩件事情......首先我忽略矩陣callculation何衛青矩陣

var matrix =
Matrix3DHelper.RotateByDegrees(renderParams.AngleX, renderParams.AngleY, renderParams.AngleZ) *
perspectiveMaterix;

我只是不使用perspectiveMatrix ...

和第二步..我progectin指向屏幕時忽略「W」參數

private Point3D GetTransformedPoint(Point3D p, Matrix3D m)
{
double w = (((m.M41 * p.X) + (m.M42 * p.Y)) + (m.M43 * p.Z)) + m.M44;
double x = ((((m.M11 * p.X) + (m.M12 * p.Y)) + (m.M13 * p.Z)) + m.M14)/(w);
double y = ((((m.M21 * p.X) + (m.M22 * p.Y)) + (m.M23 * p.Z)) + m.M24)/(w);
double z = (((m.M31 * p.X) + (m.M32 * p.Y)) + (m.M33 * p.Z)) + m.M34;
return new Point3D(x, y, z, w);
}

+0

通過igoring'w'param我的意思是我設置'w'爲1作爲常量... – 2010-10-28 22:20:35