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

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

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

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

Unity

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

Q&A

解決済

1回答

1256閲覧

球体の3Dオブジェクトをドラッグで回転させたい

Raliemon

総合スコア12

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2018/09/17 09:20

編集2018/09/17 12:40

前提・実現したいこと

Unityでios向けにアプリを開発をしています。
球体の3Dオブジェクトをドラッグで任意の方向に回転させたい。


・画面左から右にドラッグしたら、カメラから見て球体が右方向へ回転
・画面右下から左上にドラッグしたら、カメラから見て球体が斜め左上に回転

発生している問題

現状のスクリプトでは
X方向にドラッグした場合はy軸・y方向に動かした場合X軸を指定して回転させているので、
カメラから見て垂直方向にY軸、水平方向にX軸がある場合のみしか意図した動きにならない。

動的に球体の角度を把握して、
都度回転する方向を変化させないといけないと思うのですが、やり方がわからない。

該当のソースコード

C#

1[SerializeField] 2Vector2 RotationSpeed; 3 4//deltaはドラッグの方向を取得しています。 5void OnRotate(Vector2 delta) 6{ 7 Vector2 currentAngles = transform.transform.localEulerAngles; 8 currentAngles.x += delta.y * RotationSpeed.x; 9 currentAngles.y -= delta.x * RotationSpeed.y; 10 transform.transform.localEulerAngles = currentAngles; 11} 12

よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Rotateのオーバーロードに軸と角度を指定して回転させるバージョンがありますので、それを利用できそうです。
回転量はドラッグの移動距離...つまりdelta.magnitudeに比例させ、回転軸はドラッグ方向と垂直な向きにするのがいいでしょう。

C#

1using UnityEngine; 2 3public class SphereRotator : MonoBehaviour { 4 void Update() 5 { 6 if (Input.GetMouseButton(0)) 7 { 8 OnRotate(new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y"))); 9 } 10 } 11 12 // 単純化のために、スピード調整用係数はVector2からfloatに変更 13 // もし「縦ドラッグと横ドラッグで回転の効きを変えたい」といった場合には 14 // さらにコードに手を加えることになるでしょう 15 [SerializeField] 16 float RotationSpeed; 17 18 //deltaはドラッグの方向を取得しています。 19 void OnRotate(Vector2 delta) 20 { 21 // 回転量はドラッグ方向ベクトルの長さに比例する 22 float deltaAngle = delta.magnitude * RotationSpeed; 23 24 // 回転量がほぼ0なら、回転軸を求められないので何もしない 25 if (Mathf.Approximately(deltaAngle, 0.0f)) 26 { 27 return; 28 } 29 30 // ドラッグ方向をワールド座標系に直す 31 // 横ドラッグならカメラのright方向、縦ドラッグならup方向ということなので 32 // deltaのx、yをright、upに掛けて、2つを合成すればいいはず... 33 Transform cameraTransform = Camera.main.transform; 34 Vector3 deltaWorld = cameraTransform.right * delta.x + cameraTransform.up * delta.y; 35 36 // 回転軸はドラッグ方向とカメラforwardの外積の向き 37 Vector3 axisWorld = Vector3.Cross(deltaWorld, cameraTransform.forward).normalized; 38 39 // Rotateで回転する 40 // 回転軸はワールド座標系に基づくので、回転もワールド座標系を使う 41 transform.Rotate(axisWorld, deltaAngle, Space.World); 42 } 43}

投稿2018/09/17 21:16

Bongo

総合スコア10807

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

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

Raliemon

2018/09/17 23:30

Bongoさん 早速のご回答ありがとうございます。 こちら意図した通りの動作になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問