0

投影を解除する方法の基本的な概念を理解しています:

let mut z = 0.0;
gl::ReadPixels(x as i32, y as i32, 1, 1, gl::DEPTH_COMPONENT, gl::FLOAT, &z);

// window position to screen position
let screen_position = self.to_screen_position(x, y);
// screen position to world position
let world_position = self.projection_matrix().invert() *
        Vector4::new(screen_position.x, screen_position.y, z, 1.0);

しかし、これは W 座標を適切に取りません - ワールド空間からスクリーン空間に物をレンダリングするとW != 1、遠近法変換 ( https://www.opengl.org/sdk/docs/man2/ xhtml/gluPerspective.xml )。スクリーン スペースからワールド スペースに ( を仮定してW=1) 変換すると、オブジェクトの位置が正しくありません。

私が理解しているようにW、他のすべての座標のスケーリング係数です。これが事実である場合、それはスクリーン ベクトル(0, 0, -1, 1)を意味(0, 0, -2, 2)し、同じウィンドウ座標にマップされることを意味しませんか? また、投影を解除しても、それ以上の作業を行わなければ、必ずしも一意の結果が得られるとは限りませんか?

ありがとう!

4

1 に答える 1