質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

1回答

377閲覧

数学:メルカトル図法で360動画上の点を球体上に置きたい - Unity3D

Tats.N

総合スコア62

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2017/10/11 03:18

こんにちは。いつもお世話になっております。
タイトルの通りメルカトル図法で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}

どなたかご教授願えませんか?よろしくおねがいします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Bongo

2017/10/11 07:57

2点お伺いしますが、まずmapValsの各座標はどこを原点としていますでしょうか(動画の左上隅か、左縁中央か、左下隅か、あるいは左右上下中央か...?)。もう一つ、元の動画は確実に「メルカトル図法」でしょうか。もしかして、「正距円筒図法」だったりしないでしょうか?球体用のテクスチャなどだと正距円筒図法のことが多いように思いますが...
Tats.N

2017/10/11 08:57

座標の原点は左上です。方式についてはよく分かりませんが、よくある360動画を球体に写してあるだけです。。
Bongo

2017/10/11 09:49

たびたびすみません。その動画を写している球体はどのようなものでしょうか(例えばUnityのSphereの法線を反転させた...とか、3DCGソフトで作った...とか)?もし3DCGソフト等で自作された場合、もし参考になさったWebサイトなどがあればご紹介願いますか?
guest

回答1

0

球体モデルの質問に関して補足します。本来であれば質問欄に記入すべきでしょうが、画像付きの方がよいかと思い回答欄に記入します。ご容赦ください。

動画を映している球体に、動画の代わりに下図のような画像を貼り付けた場合、どのように見えますでしょうか。
パターン
UV座標が均等な格子になっている場合(正距円筒図法の画像をマッピングするには、こちらが適しているでしょう)、下図のようになるかと思います。

UVマッピング
SphericalSpherical

球を包む円筒に水平にUV座標を投影した場合(たとえばRICOH360度カメラTHETAで撮った写真をUnityで使う | Psychic VRラボの殴り書きではこちらの展開法を採用しているようです)、下図のようになります。

UVマッピング
CylindricalCylindrical

これらの違いは緯度の計算(ご提示のコードのlat)に影響します。
前者であれば

C#

1float lat = ((-yVal / 2048) + 0.5f) * Mathf.PI;

といった形になるでしょうし、後者であれば

C#

1 2float lat = Mathf.Asin((2 * (-yVal / 2048)) + 1); // 実際には欲しいのは緯度のSinなので、わざわざAsinで緯度を求める必要はないかと思います。緯度のCosは三平方の定理で算出できるでしょう。

の形になるでしょう。

また、球にマッピングした際に、貼り付けた画像の青線(画像の左端)と赤線(左端から1/4)の位置がどうなるかも重要かと思います。こちらは経度の計算(ご提示のコードのlon)に影響し、先の画像のように青線がZ+方向、赤線がX+方向を向いていれば、最終的な赤球の方角のZ成分はCos(緯度) * Cos(経度)、X成分はCos(緯度) * Sin(経度)でいけると思いますが、UVが左右反転していたり、継ぎ目(青線)の位置が異なっている場合、経度にそれらの補正を加える必要があるでしょう。

投稿2017/10/11 21:27

編集2017/10/11 22:24
Bongo

総合スコア10807

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問