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

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

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

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

Oculus Quest

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

Unity

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

Q&A

解決済

2回答

2137閲覧

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

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

0グッド

0クリップ

投稿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/ツールのバージョンなど) ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

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

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

イメージ説明

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

とりあえず以下のようなスクリプトで、カメラの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

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の動画を見るに、これから回転値取れそうですね。まぁ現状で上手くいっているならあまり深く考える必要はないと思います。 とりあえず分からないことは何でもかんでもまず調べましょう。単語だけでもヒットしますし、大体のことは先人が解決してくれています。
guest

0

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

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

総合スコア1066

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

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

fumi_64

2022/11/17 05:25

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問