マウスの 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();