উত্তর:
http://blog.nobel-joergensen.com/2010/10/22/spherical-coordinates-in-unity/
public static void SphericalToCartesian(float radius, float polar, float elevation, out Vector3 outCart){
float a = radius * Mathf.Cos(elevation);
outCart.x = a * Mathf.Cos(polar);
outCart.y = radius * Mathf.Sin(elevation);
outCart.z = a * Mathf.Sin(polar);
}
public static void CartesianToSpherical(Vector3 cartCoords, out float outRadius, out float outPolar, out float outElevation){
if (cartCoords.x == 0)
cartCoords.x = Mathf.Epsilon;
outRadius = Mathf.Sqrt((cartCoords.x * cartCoords.x)
+ (cartCoords.y * cartCoords.y)
+ (cartCoords.z * cartCoords.z));
outPolar = Mathf.Atan(cartCoords.z / cartCoords.x);
if (cartCoords.x < 0)
outPolar += Mathf.PI;
outElevation = Mathf.Asin(cartCoords.y / outRadius);
}
r
: রেডিয়াল দূরত্বθ
: বাঁকφ
: আজিমুথউইকিপিডিয়া মাধ্যমে
public Vector3 getCartesianFor(float radius, float inclination, float azimuth)
{
return new Vector3(radius*Sin(inclination)*Cos(azimuth), radius*Sin(inclination)*Sin(azimuth), radius*Cos(inclination));
}
যদি polar
আপনি ভেক্টরটির মাত্রাটি বোঝান এবং elevation
ভেক্টর এবং এক্সওয়াই প্লেনের (যেমন নাম থেকেই বোঝা যায়) মধ্যবর্তী কোণ হিসাবে সংজ্ঞায়িত করা হয় তবে ফাংশনটি হ'ল:
public Vector3 getCartesianFor(float elevation, float asimuth, float polar)
{
return new Vector3(polar*Cos(elevation)*Cos(asimuth),
polar*Cos(elevation)*Sin(asimuth),
polar*Sin(inclination));
}
মনে রাখবেন যে এটি এমএলএম এর উত্তরের সাথে খুব মিল, এটি আপনার elevation
কোণকে কীভাবে সংজ্ঞায়িত করে তার উপর নির্ভর করে । আমি আপনার ফাংশন টেম্পলেট স্বাক্ষরেরও শ্রদ্ধা করেছি, তবে আমি কয়েকটি পরিবর্তন প্রস্তাব করছি:
asimuth
একটি টাইপো, সঠিক বানানটি হবে azimuth
polar
সাধারণত 2 ডি সমন্বয় ব্যবস্থা (আর, θ) বোঝায় । ভেক্টরের বিশালতা সাধারণত হিসাবে উল্লেখ করা হয়radius
radius
প্রথম প্যারামিটার হিসাবে থাকবে ।