使用Monotouch和OpenTK我試圖獲得一個3D點的屏幕座標。我建立了我的世界視圖投影矩陣,而OpenGL能夠理解它並完美地投影我的3D模型,但是如何使用相同的矩陣來投影從2D到3D的一個點?將3D點投影到2D屏幕座標OpenTK
我以爲我可以簡單地使用:
Vector3.Transform(ref input3Dpos, ref matWorldViewProjection, out projected2Dpos);
然後在projected2DPos投影屏幕座標。但由此產生的Vector4似乎並不能代表正確的投影屏幕座標。我不知道如何從那裏計算。
我發現我需要除以Vector4.w,但我仍然得到錯誤的值。現在使用這種方法:
private static bool GluProject(OpenTK.Vector3 objPos, OpenTK.Matrix4 matWorldViewProjection, int[] viewport, out OpenTK.Vector3 screenPos)
{
OpenTK.Vector4 _in;
_in.X = objPos.X;
_in.Y = objPos.Y;
_in.Z = objPos.Z;
_in.W = 1f;
Vector4 _out = OpenTK.Vector4.Transform(_in, matWorldViewProjection);
if (_out.W <= 0.0)
{
screenPos = OpenTK.Vector3.Zero;
return false;
}
_out.X /= _out.W;
_out.Y /= _out.W;
_out.Z /= _out.W;
/* Map x, y and z to range 0-1 */
_out.X = _out.X * 0.5f + 0.5f;
_out.Y = -_out.Y * 0.5f + 0.5f;
_out.Z = _out.Z * 0.5f + 0.5f;
/* Map x,y to viewport */
_out.X = _out.X * viewport[2] + viewport[0];
_out.Y = _out.Y * viewport[3] + viewport[1];
screenPos.X = _out.X;
screenPos.Y = _out.Y;
screenPos.Z = _out.Z;
return true;
}
我看不到任何雖然錯誤...:S
我才意識到我是在世界矩陣信息給予兩次,一次是作爲入點(objPos),並再次爲部分給定矩陣。這造成了奇怪的結果。它僅在輸入組合視圖和投影矩陣後才起作用。 :) – sinsro