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

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

新規登録して質問してみよう
ただいま回答率
86.02%
VR

VRは、「Virtual Reality」の略。「人工現実感」や「仮想現実」などの意味を持ちます。VRゴーグルなどを装着してコンピュータでつくられた三次元空間を視覚などの感覚を通じ疑似体験できるようにした技術です。

Oculus Quest

Oculus Questは、Facebookの小会社であるOculus VRが開発したVRヘッドセットです。独立型でPCやスマートフォンは不要。6DoFのトラッキングに優れている点が特徴です。すでに販売終了となっていますが、2020年10月には後継のOculus Quest 2が販売されています。

Unity

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

Q&A

解決済

【Unity】カメラの回転に合わせて回転した分だけオブジェクトを回転させたいです。

fumi_64
fumi_64

総合スコア1

VR

VRは、「Virtual Reality」の略。「人工現実感」や「仮想現実」などの意味を持ちます。VRゴーグルなどを装着してコンピュータでつくられた三次元空間を視覚などの感覚を通じ疑似体験できるようにした技術です。

Oculus Quest

Oculus Questは、Facebookの小会社であるOculus VRが開発したVRヘッドセットです。独立型でPCやスマートフォンは不要。6DoFのトラッキングに優れている点が特徴です。すでに販売終了となっていますが、2020年10月には後継のOculus Quest 2が販売されています。

Unity

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

2回答

0グッド

0クリップ

331閲覧

投稿2022/11/15 06:39

編集2022/11/15 21:23

前提

UnityとOculus Quest を使っています
Unity のバージョンは2021.3.12f1です。

実現したいこと

ユーザーの回転に合わせて、ユーザーが回転した分だけオブジェクトをその場ではなく、ユーザーの周りを回転させたいです。
現在なんとかカメラの向きを取得してオブジェクトに反映させることはできたのですが、このままではオブジェクトはその場で回転してしまっています。
イメージで行くと自分が地球でオブジェクトが月なのですが、一定の速度で回転させるのではなく自分が回転した分だけ回転させたいのでRotate aroundではうまくいきそうにありません。
後々自分が回転した回転量の半分だけ周りを回転させたりしたいのでQuaternionを使いたいのですが、今のプログラムとどう組み合わせていいものか使い方が全く分かりません、、、

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

上に書いたことですが、その場ではなく自分の周りを自分が回転した量に合わせて回転させたいです。

現在のプログラムを張りますのでここからどうしたらいいか助けてください。。。

該当のソースコード

ソースコード using System.Collections; using System.Collections.Generic; using UnityEngine; public class theta_return : MonoBehaviour { public GameObject hmd_camera; public static float direction_return(Quaternion q) { Vector3 vct_post = q * Vector3.forward; return Mathf.Atan2(vct_post.x, vct_post.z) * Mathf.Rad2Deg; //角度を補正して返す } // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { Transform my_trans = transform; Transform camera_trans = hmd_camera.transform; Quaternion camera_q = camera_trans.rotation; float camera_dir = direction_return(camera_q); Quaternion q = Quaternion.AngleAxis(camera_dir, Vector3.up); my_trans.rotation = q; } } ### 試したこと Rotate aroundを調べて試したのですが自分の周りを一定の速度で回るプログラムから、コレとどう組み合わせていいのかわかりませんでした。 最終的には自分の回転速度の半分で回転させたり1/3の速度で回転させたり(オブジェクトの初期位置を左手90度の方向にして旅人算のように視点を追いつかせたりしたい)のでQuaternion を使いたいのですが今自分が作ったものと組み合わせ方がわかりません unityもc#も初心者なので調べてもなかなか解決しないので質問させていただきました。 ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。

以下のような質問にはグッドを送りましょう

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

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

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

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

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

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

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

適切な質問に修正を依頼しましょう。

回答2

1

ベストアンサー

ユーザーが回転した分だけオブジェクトをその場ではなく、ユーザーの周りを回転させたい

ユーザー(カメラ)の周りをオブジェクトが回転するようにさせるには、
下図のようなヒエラルキーにして「カメラと同じ座標にある空オブジェクト」を回転させてやれば
よいと思います。

イメージ説明

回転量の半分だけ周りを回転させたりしたい

とりあえず以下のようなスクリプトで、カメラのY軸回転の半分ほど「カメラと同じ座標にある空オブジェクト」を回転させる挙動が実現できました。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5// カメラの半分ほど回転をさせるスクリプト 6// 「カメラと同じ座標にある空オブジェクト」にアタッチする 7public class NewBehaviourScript : MonoBehaviour 8{ 9 public Transform _camera; // 回転の元になるカメラをインスペクタでセットする 10 Vector3 oldCameraForward; 11 12 void Start() 13 { 14 oldCameraForward = _camera.forward; 15 } 16 17 void Update() 18 { 19 // 1フレーム前のカメラ向きから現在フレームのカメラ向きにするための回転を得る 20 var updateRotation = new Quaternion(); 21 updateRotation.SetFromToRotation(oldCameraForward, _camera.forward); 22 23 // 回転を半分にする 24 var halfUpdateRotation = Quaternion.Lerp(Quaternion.identity, updateRotation, 0.5f); 25 26 // 自身をカメラの半分回転させる 27 transform.rotation = transform.rotation * halfUpdateRotation; 28 29 // 1フレーム前のカメラ向きを保存しておく 30 oldCameraForward = _camera.forward; 31 } 32}

投稿2022/11/16 14:00

ku__ra__ge

総合スコア4524

fumi_64😍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

回答へのコメント

fumi_64

2022/11/17 04:47 編集

ご回答ありがとうございます。 今試させていただいたのですが、buildしてOculus Questをはめて視点を動かしても反応がありませんでした。 ヒエラルキーとスクリプトもそのままでOVRcameraRigもインスペクターでセットしました。 空のオブジェクトにアタッチして、実際に周りを動かすオブジェクトには何もしてないからなのでしょうか,,,? あとこれは申し訳ないのでただの相談なのですが、自分が張り付けているスクリプトは友人や先輩 (みんなunityやc#はわからない)に相談しながらできたもので、今もカメラが向いた方向にその場で向いてくれるものにはなっているのですが、何とか救うことはできませんか、、、 他人が作ったスクリプトをいじるのは気が向かないとは思いますが。。。
fumi_64

2022/11/17 05:45 編集

具体的には今オブジェクトがその場で回転しているので、回転の中心をカメラの位置に指定してy軸基準で回転させたいです。Quaternion.AngleAxisを使っているのですが、中心点の指定方法がわかりません。。
Y0241-N

2022/11/17 06:49

横から失礼しますが、調べて貰ったら分かると思いますが`Quaternion.AngleAxis`は第二因数で指定した軸を基点に第一因数で与えた回転値分回転する処理なので、`Quaternion.AngleAxis`にカメラ座標を渡してfumi_64さんが思っているようなカメラY軸を中心に回転はできません。 また、回転と考えられていますが、自身の軸を中心としていないので、座標移動計算が必要になります。
fumi_64

2022/11/17 08:33

Y0241-Nさんたびたびありがとうございます! ku__ra__geさんのスクリプトが動かない理由はわからなかったのですがいろいろ試行錯誤しているうちに、 あれ、クラゲさんの空オブジェクト作ってアタッチしてっていう考え方そのまま使えるんじゃないかと思い、 空オブジェクトに自分が作ったスクリプトをつけて、キューブを子オブジェクトにしたら、 自分が向いた方向にキューブが周りを回転してくれるようになりました!!! でもQuaternion q = Quaternion.AngleAxis(camera_dir, Vector3.up);のところが 2 * camera_dirにしたらおんなじ回転量回る(正面についてくる)という謎がまた生まれたんですけどね。。。
ku__ra__ge

2022/11/17 10:55

試してないのでわからないのですがOVRcameraRigって物理HMDを回転させたら連動して回転しますっけ? 回転しないならCenterEyeAnchorなどちゃんと回転するオブジェクトをインスペクタから設定するといいかもしれないです。
fumi_64

2022/11/18 03:18

すいません、CenterEyeAnchorが何かいまいちわかっておらず、CenterEyeAnchorというオブジェクトをインスペクターから回転する物体に付けたらいいってことですか?
Y0241-N

2022/11/18 07:43 編集

度々横やり入れますが、まず結論としては(_cameraにCenterEyeAnchorをセットするつもりなら)その認識で一応OKです。 VRは門外漢ですが補足すると、要は自分が回転した時に連動して回転させたい訳なので、どのオブジェクトを参照(スクリプト内の_camera変数に渡す)したら自身の回転値が取れるか。を考える必要がありますよね? ku__ra__geさんが言っているのは、この回転値はOVRcameraRigから取れないと思うので、CenterEyeAnchorなどであれば回転値を正しく取れると思うので、_camera変数にセットしてはどうかという話です。 なので一応認識的には合ってます。 そしてCenterEyeAnchorは [https://qiita.com/Horukasu/items/5cc5b93c1d3340d26a53] この記事を見れば同じ名前のオブジェクトがあります。記事内に添付されているTwitterの動画を見るに、これから回転値取れそうですね。まぁ現状で上手くいっているならあまり深く考える必要はないと思います。 とりあえず分からないことは何でもかんでもまず調べましょう。単語だけでもヒットしますし、大体のことは先人が解決してくれています。

1

厳密には要件を満たしていませんが、キャラの回転値分回転する(座標移動)のではなく、キャラが回転している時に合わせて自身も回転する(座標移動)のであれば、そこまで難しくはないので、とりあえず貼っておきます。

C#

1public class CircularMotion_Around_theTarget : MonoBehaviour 2{ 3 //回転係数 4 public float rotateFactor = 1; 5 6 //このメソッドをキャラの回転処理の部分から参照する形で追加する 7 public void RotaAroundTarget(Transform targetT) 8 { 9 float angle = 1 * rotateFactor; 10 transform.RotateAround(targetT.position, Vector3.up, angle); 11 } 12}

投稿2022/11/16 06:20

Y0241-N

総合スコア1010

fumi_64👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

回答へのコメント

fumi_64

2022/11/17 05:25

ご回答ありがとうございます。 試させていただきます!

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

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

VR

VRは、「Virtual Reality」の略。「人工現実感」や「仮想現実」などの意味を持ちます。VRゴーグルなどを装着してコンピュータでつくられた三次元空間を視覚などの感覚を通じ疑似体験できるようにした技術です。

Oculus Quest

Oculus Questは、Facebookの小会社であるOculus VRが開発したVRヘッドセットです。独立型でPCやスマートフォンは不要。6DoFのトラッキングに優れている点が特徴です。すでに販売終了となっていますが、2020年10月には後継のOculus Quest 2が販売されています。

Unity

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