球面上の点をレイキャストし、その点を適切な緯度と経度に変換しようとしています。私は、スタック交換にほぼ正確にやっているものに関連するこの質問に出くわした関数は常に範囲内のどこかに値を返して、ベクトル3から緯度経度
public static LatLon FromVector3(Vector3 position, float sphereRadius)
{
float lat = (float)Math.Acos(position.Y/sphereRadius); //theta
float lon = (float)Math.Atan(position.X/position.Z); //phi
return new LatLon(lat, lon);
}
ただし、この機能を使用しています
3D coordinates on a sphere to Latitude and Longitude
緯度は0〜3、経度は-1〜1です。
私が使用しているプログラムはUnityですが、なぜこれらの間違った値が得られるのか誰にも分かりませんか?私はraycastのヒットしたワールドベクタと球の半径をパラメータとして渡しています。球はワールド0,0,0の中央に配置されています。
アドバイスいただきありがとうございました!
更新されたコード
public static Vector2 GetLatLonFromVector3 (Vector3 position, float sphereRadius){
float lat = (float)Mathf.Acos(position.y/sphereRadius); //theta
float lon = (float)Mathf.Atan2(position.x, position.z); //phi
lat *= Mathf.Rad2Deg;
lon *= Mathf.Rad2Deg;
return new Vector2(lat, lon);
}
私は今に実行している問題は、値が正しく、彼らがしていることを象限によって反射されていないです。
Z成分が小さい場合は、 'Atan2(position.X、position.Z) 'を使用することをお勧めします。 – meowgoesthedog
私はAtan2に切り替えると、私はまったく異なる値を得ます。 –
'Atan'はあなたの" point "[X、Z]が入っている象限を考慮していないので、またそれは360度ではなく180度の角度しかカバーしません。 – meowgoesthedog