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

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

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

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Unity

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

Q&A

解決済

1回答

1367閲覧

ARアプリでのオブジェクト配置

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Unity

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

0グッド

2クリップ

投稿2017/12/18 05:30

UnityでARアプリをつくっています。

GoogleMapから表示したい建物の中心座標を使っています。

アプリを起動すると、端末開始地点の緯度経度標高とオブジェクトとの位置情報との差を計算して、x軸を経度の変化量、z軸を緯度の変化量として(x,y,z)=(経度、高度、緯度)として配置しています。

アプリ起動時に端末が北0度を正確にさしていた場合は、オブジェクトの見え方は大体GoogleMap通りになります。Z軸の正方向を北0度、x軸の正方向を東90度としてアプリを作っています。

しかし、端末が北東50度をさしている状態(北0度以外)でアプリを起動するとUnity内ではz軸が北東50度を北0度としてSceneが実行されてしまうので、オブジェクトの位置がずれてしまいます。
Unity内での座標は変わりませんが、アプリを起動した方角が違うためScene全体が傾いているわけです。

私の実施した案としては、CompassでTrueHeadingを所得しその度数だけオブジェクトを回転行列を用いて座標を移動させるようにしました。

しかし、見え方は実際に建物がある場所と見比べて大きくずれてしまいます。あらかじめオブジェクトを配置しておけば上手くいくと思いますが、このアプリでは開始地点は定めていないため起動時に開始地点からの緯度経度の変化量を計算して、それに応じて配置を変更します。

Start()関数で配置して以降はオブジェクトの配置は変えません。

要するに、現実世界の建物のFBXをUnity内でも表示したい。東京タワーへきたら東京タワーが、スカイツリーならスカイツリーです。

自分の現在地から西へ300mのところに東京タワーがあったならば、Unity内のARCameraがそちらをむいたとき300Unit(m)先に東京タワーのオブジェクトが見えるようにしたいです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

まず、何故初期値を今向いている方向にする必要があるのでしょう?

アプリ起動時、今向いている方位は考慮せず(=「真北を向いている」という前提にして)現在地の緯度経度標高を取得、オブジェクトとの位置情報の差を計算して地図上オブジェクトを配置。

オブジェクト配置後、コンパスで向いている方角を取得。
それに合わせてプレイヤー(カメラ?)の向きを変える。(真西を向いているならY軸−90度回転など)

プレイスタート

これでいいのでは?

投稿2017/12/18 11:00

sakura_hana

総合スコア11427

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

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

退会済みユーザー

退会済みユーザー

2017/12/20 12:36

どの方角をみていようが、Unityのz軸のさす方向を真北とみなすことはできます。 ですが、真北0度をむいて起動した際にあるオブジェクトが真東に配置されたとします。ですが、真東をむいて起動したならばそのオブジェクトは真南に配置されます。 緯度経度の変化量できめているので、xとzの軸が入れ替わってしまうわけです。90度ならば簡単に 変換することができますが、30度や15度などで回転行列をいれると大きくずれてしまうのです。
sakura_hana

2017/12/20 12:52 編集

だから、配置時点ではプレイヤーの回転を考慮しなければいいのでは? 例えば 現在地点から真東300m先にあるオブジェクトは常に(300,0,0)に配置 その後プレイヤーが東を向いているならプレイヤーを90度回転=真東にあるオブジェクトの方を向く これだけだと思いますが? (そもそも「現在地とオブジェクトの緯度経度の差」はどんな方向を向いていても一律だと思いますが……)
退会済みユーザー

退会済みユーザー

2017/12/20 14:17

僕の書き方が悪いので伝わらないのかもしれませんが、東京タワーが真北300mにあるとして真北と向いてアプリを起動させた場合はアプリのシーン内でz軸は真北を指しています。なので(0,0,300)にオブジェクトを置けば大丈夫ですこの点をp1とします。ですが、次に真南をむいてアプリを起動するとz軸は真南を真北とするため(0,0,300)に配置しこの点をp2とします。p1とp2は価こそ同じですが、ゲームを起動した際のz軸のさす方向が違うのでp1とp2は対称点となります。よってp2を(0,0,-300)に配置することで本来のタワーの位置に修正することが可能です。 投降後いろいろ考えましたが、そもそもゲームの軸がずれてしまうので結論は不可能であると考えております。 回答ありがとうございます。
sakura_hana

2017/12/20 14:41 編集

「ゲームを起動した際のZ軸の指す方向が違う」という理屈が意味不明です。 それは「あなたがZ軸の指す方向を変えてしまっている(プレイヤーの向きにしてしまっている)から違っている」のであって、「ワールド座標+Z軸の指す向き=北」と決めれば常に固定されます。 Unityにおいて、ワールド座標の(0,0,300)はどんな状況でも(0,0,300)です。 同じくワールド座標の+Z方向も常に変わりません。 プレイヤーが真北を向いている時、プレイヤーはワールド座標(0,0,1)の方向を向いています。 プレイヤーが真南を向いている時、プレイヤーはワールド座標(0,0,-1)の方向を向いています。 ワールド座標(0,0,-1)方向=-Z軸方向ですから、ワールド座標(0,0,300)のオブジェクトは見えなくなります。 まず一度、騙されたと思って私の回答している挙動を実装してみれば一発でわかると思うのですが……
退会済みユーザー

退会済みユーザー

2017/12/22 03:18

ARCameraがゲーム開始時に端末のロテーションを認識してしまうのがいけないのでしょうか?
sakura_hana

2017/12/22 04:34

私の回答している挙動は実装してみてもらえましたか?
退会済みユーザー

退会済みユーザー

2017/12/22 06:32

はい。(0 0 300)にキューブをおいて、(0 0 -300)にキャラクターをおきました。 真南を向いて起動しましたが、キャラクターでなくキューブが見えました
sakura_hana

2017/12/22 06:34

「キューブを見た」という視点(カメラ)はどこにあって、Rotationの値はどうなっていますか?
退会済みユーザー

退会済みユーザー

2017/12/22 07:03

カメラは(0 0 0)です。 Rotationは90や30といった値でかえってきません。 小数点で0.5や-1.0などです。
sakura_hana

2017/12/22 08:16

ARカメラというと普通「カメラ=自分(キャラクター)」の、いわゆるFPS(一人称視点)だと思うんですが、このアプリではカメラとキャラクターは別物なんでしょうか?(ポケモンGOのマップ上を歩いている時みたいな感じですかね?) 「オブジェクト配置後、コンパスで向いている方角を取得。それに合わせてカメラの向きを変える。」 この手順は具体的にどのようなコードで実装しましたか? (恐らくこの部分が間違っているように思います)
退会済みユーザー

退会済みユーザー

2017/12/23 19:51

Unityの全オブジェクトの動きは画面右上の座標系に依存していることに気が付きました。なのでカメラを 90度回転させたとしても、右上の座標系のx軸方向に動いてしまうようなのでScene全体を回転させるしかないと思ったのですが、どうやらそのような方法はないようです。
sakura_hana

2017/12/24 04:48

画面右上の座標系は「ワールド座標系」と呼ばれるものです。 その他に「ローカル座標系」というのもあり、これは親子関係にあるオブジェクトの場合、「親の原点を基準とした相対的な座標」になります。 https://gametukurikata.com/basic/worldlocal 注意しないといけないのは、インスペクタ上に表示されている値は、子オブジェクトの場合ローカル座標系です。 同じ回転をするにも、スクリプトの書き方(使うメソッド)によりワールド基準かローカル基準か変わります。 なので「カメラを90度回転させたとしても、右上の座標系のx軸方向に動いてしまう」なら「書き方が悪い(別のやり方をすればきちんとカメラを回転できる、Sceneを回転する必要は無い)」です。 (なので「具体的にどのようなコードで実装しましたか?」と質問しました)
退会済みユーザー

退会済みユーザー

2017/12/24 15:53

解決しました。 ローカル座標とワールド座標の使い分けが理解できていませんでした。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問