正射影の中心に描かれた単位球 (半径 1) があります。
球は自由に回転できます。
ユーザーがクリックした球上のポイントを特定するにはどうすればよいですか?
与えられた:
左上隅を (0,0) とすると、右に移動すると x の値が増加し、下に移動すると y の値が増加します。
ユーザーのクリック ポイントを地球の座標空間に変換します。
userPoint.x -= monitor.width/2
userPoint.y -= monitor.height/2
userPoint.x /= circleRadius
userPoint.y /= circleRadius
交点の z 座標を見つけます。
//solve for z
//x^2 + y^2 + z^2 = 1
//we know x and y, from userPoint
//z^2 = 1 - x^2 - y^2
x = userPoint.x
y = userPoint.y
if (x^2 + y^2 > 1){
//user clicked outside of sphere. flip out
return -1;
}
//The negative sqrt is closer to the screen than the positive one, so we prefer that.
z = -sqrt(1 - x^2 - y^2);
(x,y,z) の交点がわかったので、緯度と経度を見つけることができます。
ユーザーに向いている地球の中心を0E 0Nとすると、
longitude = 90 + toDegrees(atan2(z, x));
lattitude = toDegrees(atan2(y, sqrt(x^2 + z^2)))
0E 子午線が視聴者に直接向かないように球体を回転させた場合は、経度から回転角度を差し引きます。
考えられるアプローチの 1 つは、行と列で構成される三角形から球を生成することです。それらは目に見えないこともあります。そして、それらの三角形をマウス ピック レイでヒット テストします。
この画像の緯度/経度グリッドを参照してください。グリッド セルごとに、2 つの三角形が必要です。