Monotouch と OpenTK を使用して、1 つの 3D ポイントの画面座標を取得しようとしています。ワールド ビュー プロジェクション マトリックスを設定しました。OpenGL はそれを理解して 3D モデルを完全に投影しますが、同じマトリックスを使用して 2D から 3D に 1 点だけを投影するにはどうすればよいですか?
私は簡単に使用できると思いました:
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