私の質問
誰かが良い記事/チュートリアル/何かをリンクしたり、マウス座標からレイを正しくキャストして3Dでオブジェクトを選択する方法を説明したりできますか?
私はすでにレイと交差点の作品を持っています。今はマウスのクリックからレイを作成するだけです。
実際に機能するはずだとわかっているものが欲しいのですが、それが最初に正しいかどうかわからないものではなく、ここで専門家に尋ねる理由です.
現在の状態
原点と方向をカメラと同じに設定すると、実際に機能して交差を検出するレイクラスがあります。そのため、カメラを動かすと、実際に正しいものが選択されます。
カメラの動きではなく、実際にマウスで 3D ピッキングを行いたいと思います。
私は本当に苦手なので、これに関する他の多くの質問、2つのチュートリアル、特にさまざまな数学に関するものを読みました。
しかし、それはあまり役に立ちませんでした。なぜなら、そこの人々は、実際には廃止されているように見えるいくつかの「アンプロジェクト」機能をよく使用し、使用方法がわからず、アクセスできないからです。
現在、光線の原点をカメラの位置に設定し、このチュートリアルの計算から光線の方向を取得しようとしています。
そして、それは少し機能します。つまり、カメラがオブジェクトを指しているときに選択が機能し、時にはy軸全体に沿っても機能します。何が起こっているのかわかりません。
誰かが私のコードを今すぐ見たい場合:
public Ray2(Camera cam, float mouseX, float mouseY) {
origin = cam.getEye();
float height = 600;
float width = 600;
float aspect = (float) width / (float) height;
float x = (2.0f * mouseX) / width - 1.0f;
float y = 1.0f - (2.0f * mouseX) / height;
float z = 1.0f;
Vector ray_nds = vecmath.vector(x, y, z);
Vector4f clip = new Vector4f(ray_nds.x(), ray_nds.y(), -1.0f, 1.0f);
Matrix proj = vecmath.perspectiveMatrix(60f, aspect, 0.1f, 100f);
proj = proj.invertRigid();
float tempX = proj.get(0, 0) * clip.x + proj.get(1, 0) * clip.y
+ proj.get(2, 0) * clip.z + proj.get(3, 0) * clip.w;
float tempY = proj.get(0, 1) * clip.x + proj.get(1, 1) * clip.y
+ proj.get(2, 1) * clip.z + proj.get(3, 1) * clip.w;
float tempZ = proj.get(0, 2) * clip.x + proj.get(1, 2) * clip.y
+ proj.get(2, 2) * clip.z + proj.get(3, 2) * clip.w;
float tempW = proj.get(0, 3) * clip.x + proj.get(1, 3) * clip.y
+ proj.get(2, 3) * clip.z + proj.get(3, 3) * clip.w;
Vector4f ray_eye = new Vector4f(tempX, tempY, tempZ, tempW);
ray_eye = new Vector4f(ray_eye.x, ray_eye.y, -1.0f, 0.0f);
Matrix view = cam.getTransformation();
view = view.invertRigid();
tempX = view.get(0, 0) * ray_eye.x + view.get(1, 0) * ray_eye.y
+ view.get(2, 0) * ray_eye.z + view.get(3, 0) * ray_eye.w;
tempY = view.get(0, 1) * ray_eye.x + view.get(1, 1) * ray_eye.y
+ view.get(2, 1) * ray_eye.z + view.get(3, 1) * ray_eye.w;
tempZ = view.get(0, 2) * ray_eye.x + view.get(1, 2) * ray_eye.y
+ view.get(2, 2) * ray_eye.z + view.get(3, 2) * ray_eye.w;
tempW = view.get(0, 3) * ray_eye.x + view.get(1, 3) * ray_eye.y
+ view.get(2, 3) * ray_eye.z + view.get(3, 3) * ray_eye.w;
Vector ray_wor = vecmath.vector(tempX, tempY, tempZ);
// don't forget to normalise the vector at some point
ray_wor = ray_wor.normalize();
direction = ray_wor;
}