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

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

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

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

Unity3D

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

Unity

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

Q&A

解決済

3回答

4803閲覧

マウスの移動で視点操作

ReVenen

総合スコア39

C#

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

Unity3D

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

Unity

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

1グッド

1クリップ

投稿2020/03/12 02:02

前提・実現したいこと

Unity Version 2019 1.11f1 での開発です。

C#

1GetAxis("Mouse X") 2GetAxis("Mouse Y")

を使ってマウスの移動だけで視点を操作するプログラムを書いています。
その際にCameraにアタッチしたスクリプトが以下です。

C#

1float x_rotation; 2float y_rotation; 3 4void Update() 5{ 6 x_rotation = Input.GetAxis("Mouse X"); //x_rotationにマウスの水平方向の移動を 7 y_rotation = Input.GetAxis("Mouse Y"); //y_rotationにマウスの垂直方向の移動を 8 transform.rotation = Quaternion.Euler(transform.rotation.x - y_rotation * 5, transform.rotation.y + x_rotation * 5 , transform.rotation.z); 9}

発生している問題

上記コードの目的としては、視点操作なのですがカメラのRotationが(0, 0, 0)に戻ってしまいます。 気持ちとしてはマウスの操作がUpdateのたびに積み重なって値が増えていくと思っていたのですが。。。

試したこと

Debug.Log() を 使ってマウスを右に動かし続けて実験を行ったのですが、-(負)の値がないにも関わらず、操作のたびに視点が0に戻りました。
s.k👍を押しています

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

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

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

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

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

guest

回答3

0

こちらを参考にしてみて下さい。

なんで回転軸を親子関係で分けたのかというと、Z軸の回転によるずれを防ぐためです。ずれが起きたときの例は、いろいろ見渡した後に向き直ると水平線が傾いていた…みたいな場合でしょうか。

いっぺんにX軸とY軸の値を入れてしまうとZ軸回転が生じてしまうようです。

という大事なことが書かれています。

投稿2020/03/12 03:05

stdio

総合スコア3307

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

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

ReVenen

2020/03/12 05:36

ご回答ありがとうございます。 そうですね。自分は初めRotateを使って回転させていたのですが、水平線がずれる。ということでtransformの値を直接書き換える方向に転じました。 丁寧なご回答誠にありがとうございます。
guest

0

transform.rotationは、Quaternionで、transform.rotation.xは、x軸の回転の角度ではありませんよ。

x,yの現在の回転の角度をそれぞれ、rx,ryとして別にもうけて
rx,ryをx_rotation,y_rotetionで弄れるだけ、(角度の単位は考えて)

transform.rotation = Quaternion.Euler(rx,ry,0)でratationは代入のみ

すごいシンプルになるとおもいます。

投稿2020/03/19 03:57

tmp

総合スコア331

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

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

0

ベストアンサー

回転に関しては説明が難しいのですが、
Quaternion.Euler(transform.rotation.x - y_rotation * 5, transform.rotation.y + x_rotation * 5 , transform.rotation.z);としている部分について、Quaternion.Eulerはオイラー角をクオータニオン角に変換してくれる命令なのですが、transform.rotationで帰ってくる値はクオータニオン角なので、Quaternion.Euler(transform.rotation)とかしようとするとそもそも「出来ません!」といわれます。

なので、挙動がおかしくなっているのはQuaternion.Eulerの中にtransform.rotationの値が入っているのが原因だと思います。やるとすればtransform.rotation = Quaternion.Euler( - y_rotation * 5, x_rotation * 5 ,0) * transform.rotation;とすれば一応はカメラは動くのですが、これはこれで色々問題があります。
試してもらうとわかると思いますが、マウスをデスク上で回すとカメラの視界が反転していきます。

これを防ぐにはいろいろと工夫する必要があるのですが...
申し訳ないのですが説明は十分にできないため控えさせていただきます。
私は参考としてこちらのサイトを参考にカメラ制御のスクリプトを作りました。

いきなり難しいことが増えるとは思いますが、少しずつ頑張ってみてください。

投稿2020/03/12 03:07

Y0241-N

総合スコア1066

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

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

ReVenen

2020/03/12 05:34

ご回答ありがとうございます。丁寧な回答、誠に感謝いたします。 参考したというサイトの方へ行ってみて勉強させていただきます。
Y0241-N

2020/03/18 08:57

回答に納得がいったのであれば、ベストアンサーを選択してこの質問をクローズしてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問