私のプロジェクトと不自由な機能の何が問題になっていますか?
質問
私はC#のゲームにOpentkを使用していますが、世界とスクリーンの座標を変換するプロジェクトとUnproject関数は付属していません。まあ、それはそうですが、彼らは廃止されており、私は彼らを動作させることができませんでした。私はそれらに基づいて自分で実装することを試しました OpenGL仕様 (左手メニュー、Gluproject、Gluunproject、およびview in ff(chromeではなく、view)を参照してください)。それらの式を見てください、私はそれらを一致させようとしています。私の機能はまったく機能していません。プロジェクトリターンがすべて画面の中心近くにあるポイントはすべて、世界中の世界ポイントを移動しているにもかかわらず、非常に近くにあります。
OpentkのMath libには、マトリックスにベクトルを掛けるための機能が含まれていないため、結果のベクトルの各エントリごとにベクトルDOT製品をマトリックス行で行いました(それは正しいですよね?)
public static Vector3d Project(Vector4d point, Matrix4d projection, Matrix4d modelview, int[] view)
{
Matrix4d temp = Matrix4d.Mult(projection, modelview);
// multiply matrix by vector
Vector4d v_prime = new Vector4d(
Vector4d.Dot(temp.Row0, point),
Vector4d.Dot(temp.Row1, point),
Vector4d.Dot(temp.Row2, point),
Vector4d.Dot(temp.Row3, point)
);
v_prime = Vector4d.Divide(v_prime, v_prime.W);
return new Vector3d(
view[0] + view[2] * (v_prime.X + 1) / 2,
view[1] + view[3] * (v_prime.Y + 1) / 2,
(v_prime.Z + 1) / 2
);
}
public static Vector3d UnProject(Vector3d window, Matrix4d modelview, Matrix4d projection, int[] view)
{
Matrix4d inv = Matrix4d.Mult(projection, modelview);
inv.Invert();
double vx = (2 * (window.X - view[0])) / view[2] - 1;
double vy = (2 * (window.Y - view[1])) / view[3] - 1;
double vz = (2 * window.Z) - 1;
Vector4d vect = new Vector4d(vx, vy, vz, 1);
// now multiply matrix times vector, which is really row (dot) vector for each value
// correct, the bottom row of the inv matrix is unused
return new Vector3d(
Vector4d.Dot(inv.Row0, vect),
Vector4d.Dot(inv.Row1, vect),
Vector4d.Dot(inv.Row2, vect)
);
}
解決 2
私はそれを理解しました - 私のマトリックスを転置する必要がありました。理由はわかりませんが、Opentk関数は私のモデルマトリックスをネイティブコールとは異なる方法で戻しました。
他のヒント
私は完全に確信していませんが、少なくともあなたのマトリックス乗算の順序 Project
機能が間違っている可能性があります。を見てみましょう http://www.opengl.org/wiki/gluproject_and_gluunproject_code Cコードの場合、一時的なベクトル(v_prime
コードで)は、最初にModelViewマトリックスを乗算して計算され、結果に投影マトリックスを掛けます。
別の良いソースを探す gluProject
/gluUnProject
実装はです http://www.mesa3d.org/.