🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Q&A

解決済

1回答

991閲覧

Scene UnderstandingサンプルコードにおいてScene Rootの位置・回転が取得できない

inkyaman

総合スコア1

C#

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

0グッド

0クリップ

投稿2020/12/16 11:43

編集2020/12/27 13:43

前提・実現したいこと

####Scene understanding機能について
Scene UnderstandingはHoloLens2という透過型HMD(ヘッドマウントディスプレイ)で取得した環境メッシュデータを分析し、壁や床といったオブジェクトの位置やメッシュデータを提供する機能です。
現在自分はHoloLens2のScene Understandingの機能を使ったアプリケーションを、以下のサンプルプロジェクトを書き換えて作成しています。
https://github.com/sceneunderstanding-microsoft/unitysample

また、Scene Understandingの概要・動作については以下のページを参考にしています。
https://qiita.com/Futo_Horio/items/2759f9ca2b892709ab66

####Scene UnderstandingのUnityエディタ上でのデモ
HoloLens2とありますが、上記サンプルプロジェクトのサンプルシーンをunity上で開き、SceneunderstandingManagerオブジェクトにアタッチされたSceneUnderstandingDataProvider.csにおけるRun On Deviceをインスペクター上でオフにすることで、予め用意されたシーンを利用してunityエディタ上でどのようなオブジェクトが表示されるのかというデモを見ることができます。今回の質問は、このUnity上の実行デモにおける動作に問題が生じていることに関してのものなので、HoloLens2とは関係なしに、Unityにお詳しい方がいましたらご回答いただけたら幸いです。

####実現したいこと
表示される壁や床といった各オブジェクトは、SceneRootと呼ばれるオブジェクトの子オブジェクトとして設置されます(初期状態ではエディタ上のRootという名前のオブジェクトが該当する)。自分は作成するアプリケーションの関係上、ワールド座標空間におけるカメラと、SceneRootを原点とするローカル座標空間のオブジェクトの位置関係を取得する必要があったため、まずSceneRootのワールド座標の位置および傾きを取得しようと試みようとしたところ、次のような問題が生じました。

発生している問題・エラーメッセージ

unityエディタ上でのデモの実行中、SceneRootのインスペクターを見ると、

Transform
Position x:0 y:0 z:0
Rotation x:-51.415 y:40:55 z:-75.0010

と表示されるので、これを基準に子オブジェクトを配置しているのですが、オブジェクト設置直前(SceneUnderstandingDisplayManager.cs内の298行目DisplaySceneObjectクラス内)に挿入した
Debug.Log(SceneRoot.transform.position)およびDebug.Log(SceneRoot.transform.rotation)によると、コンソール上では

(0.0,0.0,0.0)←position
(0.0,0.0,0.0,1.0)←rotation

と表示されていました。初期移動がないことはともかく、初期回転なしという、SceneRootのインスペクター上のRotationの値とは異なる値を取得していました。

試したこと

SceneRootを親としたCubeオブジェクトを作成したところ、実行の際はSceneRootのインスペクターのRotationが示すように、ちゃんと傾いて表示されたのですが、positionやrotationの値はともに
(0.0,0.0,0.0)←position
(0.0,0.0,0.0,1.0)←rotation
となっていました。

補足情報(FW/ツールのバージョンなど)

Unity 2019.4.11f1 Personal

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

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

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

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

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

guest

回答1

0

ベストアンサー

インスペクターのPositionはtransform.localPositionと同じであり、インスペクターのRotationはtransform.localEulerAnglesと同じです。
なのでインスペクターの表示と比較するのであればこの2つを用いるべきでしょう。

また、transformをスクリプトから制御するタイミングは1フレーム内にいくらでもあるので、インスペクターの更新が行われるのとDebug.Logを挿入したタイミングの間で位置更新が行われている可能性があります。

投稿2020/12/29 05:42

Ram.Type-0

総合スコア424

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

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

inkyaman

2021/01/02 12:30

ご回答ありがとうございます。その後アドバイスしていただいた通りlocalEulerAnglesの方は試してみたのですが、こちらも結局(0.0,0.0,0.0)と表示されてしまいました。 後者の話では、Debug.Logを挿入したタイミングの後に位置更新があり、それを基にインスペクターの更新が行われているということでしょうか。もう少し適切なDebug.Logの挿入タイミングも考えてみようと思います。 貴重なご意見をいただいたにもかかわらず、解決に至らなかったこと申し訳ありません。
inkyaman

2021/02/05 11:48

Ram.Type-0さんのご指摘の通り、少なくともUnityエディタ上ではオブジェクトを全て表示し終わったのち、SceneRootを回転させカメラと整合性を合わせる処理が挟まれていることが判明しました。 ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問