こんにちは。いつもお世話になっております。
タイトルの通りメルカトル図法で360動画上の点を球体上に置きたいのですが、何がまちがっているのか思っている場所に反映されず困っています。配置したい場所の2D上の座標はすでにあり、配列として用意してあります。球体自体の直径はradius = this.transform.localScale.x;
でとってあり、合っていると思います。
直径の出し方が間違っている?
そもそも、画像上の直径の計算がよくわかっていません。
画像のサイズが4096 * 2048なので(画像の縦サイズx2)/PIをすれば正しい直径が出るかとも思いましたがやはり上手くいかず。。UVで正方形にされるからかな?と思い3072なども試してみましたがうまくいきませんでした。
計算自体が間違っている?
数学の能力がほぼ皆無なので当てずっぽうで数字を入れてみましたが、どうも今の計算では当てはまりそうな数字がないような気もします。結果がX方向に反転してしまっているような感じです。calcXをマイナスにすればちょっと思っているものに近くなるような。。?
現在の結果
人物の顔にある白い丸が正しい場所で、赤い球をその白丸にマッチさせたいのです。
https://youtu.be/t0I7Hlb-tbk
現在のコード
C#
1 2 float imageRadius = 4098/ Mathf.PI; //2048? 3072? 4098? 3 float radius; 4 public GameObject testSphere; 5 6 void Start () { 7 radius = this.transform.localScale.x; 8 } 9 10 void Update () { 11 12 int currentFrame = (int)this.GetComponent<VideoPlayer>().frame; 13 14 testSphere.transform.position = MercatorProjection(mapVals[currentFrame,0],mapVals[currentFrame,1]); 15 } 16 17 Vector3 MercatorProjection(float xVal, float yVal) 18 { 19 float lon = xVal / imageRadius; 20 float lat = 2 * Mathf.Atan(Mathf.Exp(yVal / imageRadius)) - Mathf.PI / 2; 21 22 float calcX = radius * Mathf.Cos(lat) * Mathf.Cos(lon); 23 float calcY = radius * Mathf.Cos(lat) * Mathf.Sin(lon); 24 float calcZ = radius * Mathf.Sin(lat); 25 26 Vector3 result = new Vector3(calcX,calcY,calcZ); 27 return result; 28 } 29 30 31 32 float[,] mapVals = new float[,] { 33 {1969.21f, 928.625f}, 34 {1969.6f, 928.533f}, 35 {1968.92f, 928.825f}, 36 {1968.68f, 929f}, 37 {1968.47f, 929.067f}, 38 {1968.41f, 929.025f}, 39 {1968.48f, 928.992f}, 40 {1968.53f, 928.992f}, 41 {1968.47f, 928.983f}, 42 ..... 43}
どなたかご教授願えませんか?よろしくおねがいします。