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

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

ただいまの
回答率

90.34%

  • C#

    7685questions

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

  • Android

    6720questions

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

  • Unity

    4397questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

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

解決済

回答 1

投稿

  • 評価
  • クリップ 2
  • VIEW 467

freq75hz

score 5

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)先に東京タワーのオブジェクトが見えるようにしたいです。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

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

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

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

プレイスタート

これでいいのでは?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/20 21:36

    どの方角をみていようが、Unityのz軸のさす方向を真北とみなすことはできます。
    ですが、真北0度をむいて起動した際にあるオブジェクトが真東に配置されたとします。ですが、真東をむいて起動したならばそのオブジェクトは真南に配置されます。

    緯度経度の変化量できめているので、xとzの軸が入れ替わってしまうわけです。90度ならば簡単に
    変換することができますが、30度や15度などで回転行列をいれると大きくずれてしまうのです。

    キャンセル

  • 2017/12/20 21:48 編集

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

    キャンセル

  • 2017/12/20 23:17

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

    投降後いろいろ考えましたが、そもそもゲームの軸がずれてしまうので結論は不可能であると考えております。

    回答ありがとうございます。

    キャンセル

  • 2017/12/20 23: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 12:18

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

    キャンセル

  • 2017/12/22 13:34

    私の回答している挙動は実装してみてもらえましたか?

    キャンセル

  • 2017/12/22 15:32

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

    キャンセル

  • 2017/12/22 15:34

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

    キャンセル

  • 2017/12/22 16:03

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

    キャンセル

  • 2017/12/22 17:16

    ARカメラというと普通「カメラ=自分(キャラクター)」の、いわゆるFPS(一人称視点)だと思うんですが、このアプリではカメラとキャラクターは別物なんでしょうか?(ポケモンGOのマップ上を歩いている時みたいな感じですかね?)

    「オブジェクト配置後、コンパスで向いている方角を取得。それに合わせてカメラの向きを変える。」
    この手順は具体的にどのようなコードで実装しましたか?
    (恐らくこの部分が間違っているように思います)

    キャンセル

  • 2017/12/24 04:51

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

    キャンセル

  • 2017/12/24 13:48

    画面右上の座標系は「ワールド座標系」と呼ばれるものです。
    その他に「ローカル座標系」というのもあり、これは親子関係にあるオブジェクトの場合、「親の原点を基準とした相対的な座標」になります。
    https://gametukurikata.com/basic/worldlocal
    注意しないといけないのは、インスペクタ上に表示されている値は、子オブジェクトの場合ローカル座標系です。

    同じ回転をするにも、スクリプトの書き方(使うメソッド)によりワールド基準かローカル基準か変わります。
    なので「カメラを90度回転させたとしても、右上の座標系のx軸方向に動いてしまう」なら「書き方が悪い(別のやり方をすればきちんとカメラを回転できる、Sceneを回転する必要は無い)」です。
    (なので「具体的にどのようなコードで実装しましたか?」と質問しました)

    キャンセル

  • 2017/12/25 00:53

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

    キャンセル

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

  • ただいまの回答率 90.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • C#

    7685questions

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

  • Android

    6720questions

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

  • Unity

    4397questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。