1

マウスの X、Y に応じて、3D 球体の緯度と経度を取得したいと考えています。三角法を使用する必要があることを理解しました。問題は、球がパースペクティブに入れられていることです。少なくとも、それが私の計算による問題だと思います。

radius *= (width / 2.0f);
    float y = (mouseY - (height / 2.0f)) / radius;
    latitude = (float) -Math.toDegrees(Math.asin(y));

および経度:

    float x = (float) ((mouseX - (width / 2.0f)) / (radius));
    longitude = (float) (90 - Math.toDegrees(Math.acos(x)));

簡単にするために、最初は半径 = 1 です (画面の中心から端まで)。また、回転は無視します。

問題:
私の問題は、正しい値が得られないことです。中心から遠ざかるほど。誤差が大きくなります。
前述のように、これは私が遠近法 (錐台) を使用しているという事実に関係していると思います。しかし、私はそれを解決する方法を理解できず、何がこの問題を実際に引き起こしているのか.

参考までに、私の視点は最大 45 度に設定されており、幅と高さの比率は 0.6 です。そのため、次の式を使用します: tan(2*atan(1,x)/0.6) = x、球 x (~-4.17) を画面 (z 上の) に変換します。

私の投影:

        gl.glViewport(0, 0, width, height); 
    gl.glMatrixMode(GL10.GL_PROJECTION); 
    gl.glLoadIdentity();

   GLU.gluPerspective(gl, 45f, (float) width / (float) height, 0.1f,
            100.0f);

    gl.glMatrixMode(GL10.GL_MODELVIEW);

    gl.glLoadIdentity();
4

1 に答える 1

2

あなたがする必要があるのは、カメラの原点から始まり、マウスカーソルの位置で目の平面を通過する光線を見つけることです。これは、パースペクティブプロジェクション変換の逆をマウスカーソルのビューポート座標に適用して、マウスの位置を表すワールドスペースポイントを取得することで実行できます。

この光線と球の交点が存在する場合は、単純な三角法を使用して緯度と経度の値を計算するために使用できるサーフェスポイントになります。

于 2011-05-15T00:56:58.833 に答える