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

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

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

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

Unity

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

Q&A

0回答

1104閲覧

Unityの3D空間でカメラの回転方向を一貫させたいです

dragontown

総合スコア16

C#

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

Unity

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

0グッド

0クリップ

投稿2020/07/05 12:13

編集2020/07/05 12:19

発生している問題など

3D空間でカメラの向きを回転させたくて、 https://mslgt.hatenablog.com/entry/2017/02/18/020630 このサイトのコードを参考にしたスクリプトを使っています。 画面をスワイプして回転させていくと途中までは問題ないのですが、 90°くらい進んだ辺りでいったん離して再度それまでと同じ方向に行こうとすると、 なぜか逆向きに進んでしまいます。 全体でスワイプと同じ方向に回転するようにしたいです。

該当のソースコード

C#

1using UnityEngine; 2 3public class MainCtrl : MonoBehaviour { 4 public Camera MainCamera; 5 private Vector3 lastMousePosition; 6 private Vector3 newAngle = new Vector3(0, 0, 0); 7 8 private void Update () { 9 if (Input.GetMouseButtonDown(0)) 10 { 11 // マウスクリック開始(マウスダウン)時にカメラの角度を保持(Z軸には回転させないため). 12 newAngle = MainCamera.transform.localEulerAngles; 13 lastMousePosition = Input.mousePosition; 14 } 15 else if (Input.GetMouseButton(0)) 16 { 17 // マウスの移動量分カメラを回転させる. 18 newAngle.y -= (Input.mousePosition.x - lastMousePosition.x) * 0.1f; 19 newAngle.x -= (Input.mousePosition.y - lastMousePosition.y) * 0.1f; 20 MainCamera.gameObject.transform.localEulerAngles = newAngle; 21 22 lastMousePosition = Input.mousePosition; 23 } 24 25 } 26}

試したこと

この回転させるところで newAngle.y -= (Input.mousePosition.x - lastMousePosition.x) * 0.1f; newAngle.x -= (Input.mousePosition.y - lastMousePosition.y) * 0.1f; 開始時の座標で条件付けしてプラスマイナスを逆にしたりすればいいのかなと 思うのですがうまくできません よろしくお願いします。

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

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

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

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

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

bboydaisuke

2020/07/05 12:36

> 90°くらい進んだ辺り これは何軸に対してですか?X軸に対してつまり上下にカメラを動かした時の話かなと思うのですが、Y軸に対しても同じ問題がおきますか? X軸に対しての話なら、普通は上下に向ける角度には制限をつけないと、そうなります。
dragontown

2020/07/05 13:19

ありがとうございます。 x軸に対してだけです。 上下に制限を加えるコードを調べて if (newAngle.x <= -90.0f) { newAngle.x = -90.0f; } if (newAngle.x >= 90.0f) { newAngle.x = 90.0f; } これをつけてみたのですが、90くらいで初めの位置に戻ってしまって 回転を続けられなくなるような感じになります。
bboydaisuke

2020/07/05 15:06

オイラー角とかQuaternionを使って回転させているページじゃなくて、Transform.Rotate を使って回転させているページを参考にした方がよいと思います。 やりたい事は「上にずっとカメラを移動させていくと、ブリッジからのバク転のようにカメラが一回転する」といったことですか? あとは、Unity 標準のカメラ制御機能である Cinemachine を使うのもよいでしょう。 https://www.youtube.com/watch?v=4wZjfEf3pUw
dragontown

2020/07/06 10:39

>上にずっとカメラを移動させていくと、ブリッジからのバク転のようにカメラが一回転する はい。こういう動きにしたいです。 Y軸回転はこうなってますよね。 なぜY軸もX軸も同じ処理なのにこういう違いが出るのでしょうか
ikadzuchi

2020/07/11 09:14

> なぜY軸もX軸も同じ処理なのにこういう違いが https://docs.unity3d.com/ja/current/ScriptReference/Transform-localEulerAngles.html によればUnityのオイラー角はZ,X,Yの順に回転を適用したものを表すそうです。 回転は適用する順により結果が異なるものです。 また、同ページによればオイラー角はそのまま保存されるのでなく内部的にクオータニオンとして保存されているので途中で逆転したりといった現象が起こるのでしょう。 オイラー角のまま計算して出た値をlocalEulerAnglesに代入するようにすれば少しはマシなのかなという気もしますが、まあきっとbboydaisukeさんの言うようにTransform.RotateやCinemachineがよいのでしょう。
dragontown

2020/07/12 01:36

ありがとうございます。 適用順があるんですね Transform.RotateやCinemachineをもう少し調べてみようと思います
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問