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

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

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

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

Q&A

解決済

4回答

9446閲覧

UNITYで時間経過と共にオブジェクトを360度回転させる方法

CCIT

総合スコア14

Unity

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

0グッド

2クリップ

投稿2017/06/01 17:08

unityで徐々にオブジェクトをY軸方向右回りに360度回転
もしくは、徐々にオブジェクトをY軸方向左回りに360度回転
させる方法を教えてください

例えば書きコード
※Zonbieはゾンビ3Dモデルのオブジェクトにアタッチされている イメージです

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Zombie : MonoBehaviour {

private Quaternion from; private Quaternion to; private float t; private void Start() { from = Quaternion.Euler(0, 0, 0); to = Quaternion.Euler(0, -180, 0); } void Update () { if(t < 1.0f) { t += Time.deltaTime; transform.rotation = Quaternion.Slerp(from, to, t); } }

}

上記コードではゾンビ3Dモデルは時間経過と共に徐々に180度回転してくれるのですが
Quatenionは180-180の範囲までしか有効ではないようなので

このコードでは3Dモデルを360度回転させる事ができません

時間経過と共に3Dモデルを徐々に360度回転させ
360度回転した時点で3Dモデルの回転を止めたいのです

【質問】
3Dモデルを時間経過と共に徐々に360度回転(右回りor左回り)
させるにはどのようなコードを記述すればよいのでしょうか?
ご存知の方がいらっしゃったら教えてください、よろしくお願いします。

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

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

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

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

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

guest

回答4

0

(回転を表現する)Quaternion自体は
回転角と回転軸を(ちょっと変形して)格納した値なので、
180度以上だろうが好きな角度、好きな回転軸にグルングルン回せます。
180度以上に対応してないと感じてしまうのは
Quaternionに幾つか生えている便利メソッドのうちの一つであるSlerp()の使い方の問題です。
Slerp()はざっくり言えば2つの角度を最短ルートで結んで、割合を与えて角度を算出するメソッドです。
(ちゃんと言えば球面線形補間)

ターゲットの方をゆっくり向く砲台とかには向いていますが、
一定方向に一定角速度で回るには向いていません。

Slerp()があまり目的にあっていないとしてどうするかですが、

  • 時刻から逆算してQuaternionの値を計算する。
  • 前時刻のQuaternionに変化分の回転Quaternionを掛ける。

前者は回答が既についているので、後者の説明です。

var dq = Quaternion.AngleAxis(deg, Vector3(0, 1, 0));

これでy軸周りにdegの回転を表します。

あとはUpdate()内で

transform.rotation = dq * transform.rotation;

とすればめでたく回転できます。

もしくは単純に

transform.Rotate(new Vector(0,1,0),deg);

なおUnity手元にないので未検証です。

投稿2017/06/02 00:48

編集2017/06/02 00:57
ozwk

総合スコア13521

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

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

CCIT

2017/06/06 05:03

回答ありがとうございます。 おかげさまで、望む処理を行えました
guest

0

Unityのバージョン書いてないので、最新と仮定。

どの方向にカメラがあって、カメラから見て見た目上右左は変わるので
そこについては言及しませんが、以下で回るかと。

C#

1// 経過時間ごとに回す角度 2// 数値を変えてどうなるか自分で確認してください 3float angle = 360.0f; 4// トランスフォームシタイ対象に対して回転処理 5transform.RotateAround( 6 Vector3.zero,// 回す基準 7 Vector3.up, // 回す軸 Vector3に定数あるのでそれ利用。凝った方向の場合は自分でベクトル計算 8 angle * Time.deltaTime / 1.0f// 今回、回す角度 9);

n度で止めたい場合は、第三引数の角度を毎回足し合わせて…。もちろん、同時に他で動き等が変わると数値が変わるので管理はご自身でお考え。
後は頑張ってください。
ちなみに以下公式にTrasformに用意されてることが書かれてます。
https://docs.unity3d.com/jp/540/ScriptReference/Transform.RotateAround.html

投稿2017/06/02 00:18

kanimaru

総合スコア1013

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

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

CCIT

2017/06/06 05:03

回答ありがとうございます。 おかげさまで、望む処理を行えました
guest

0

ベストアンサー

クォータニオンは球面上のある方向から別の方向へ向かって最短距離の方向へ回転させることを表現する際に便利な方法です。しかしそのような意味合いから180度を超える回転を表現するのに不向きです。

また、ご質問のコードでは球面上のある点から正反対の点へのSlerp(球面線形補完)で回転させようとしているので回転の軌道(言い換えれば回転軸)を正確に指定できているとは言えないと思います。なぜなら球面上の正反対への点への最短距離の軌道は無限にあり一意に決まらないからです。

「回転軸を指定してその回転軸の周りにR度回転させる」という方法を採ると素直な表現ができますが、UnityのリファレンスをみたところRotateAroundというのがあるので、それを使うのが一案だと思います。

ちなみにQuaternion.Eulerなどだと「この指定でいったいどっちの方向に向くの?」というのが非常に把握しずらい面がありますが、以下の例のように「回転軸の方向」をベクトルで直接指定する方がむしろイメージしやすいように思います。

C#

1public class Zombie : MonoBehaviour { 2 private float t; 3 private Vector3 center; 4 private Vector3 axis; 5 6 private void Start() { 7 t = 0f; 8 center = Vector3.zero; // ワールド座標の原点の周りに回転 9 axis = Vector3.up; // Y軸の周りに回転 10 } 11 12 void Update () { 13 if (t < 1f) { 14 float prevT = t; 15 t = Math.min(1f, t + Time.deltaTime); // 360度を超えないように 16 float dt = t - prevT; 17 transform.RotateAround(center, axis, 360 * dt); 18 } 19 } 20}

なおUnity環境がないためコードは未確認です。

投稿2017/06/02 00:13

KSwordOfHaste

総合スコア18394

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

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

CCIT

2017/06/06 05:03

なるほど、1回転だけさせる場合は このソースコードが分かりやすいです Y軸に一定角度ずつ回転させて、1回転した所で処理を終えるということですね 非常に参考になりました。回答ありがとうございます。
guest

0

DoTweenがオススメです。
http://dotween.demigiant.com/documentation.php

投稿2017/06/02 01:49

seri

総合スコア422

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

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

CCIT

2017/06/06 05:03

ありがとうございます。 後ほど、確認してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問