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

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

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

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

Q&A

解決済

3回答

15018閲覧

【Unity】オブジェクトの軸を変更して回転させたい

Gurumer

総合スコア33

Unity

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

0グッド

1クリップ

投稿2019/06/25 09:01

編集2019/06/27 07:41

前提・実現したいこと

画像の赤い点を軸として、大砲のようにオブジェクトを回転させたい。
イメージ説明

ソースコード

C#

1public class TaihoRotate : MonoBehaviour 2{ 3 // Start is called before the first frame update 4 void Start() 5 { 6 7 } 8 9 // Update is called once per frame 10 void Update() 11 { 12 transform.RotateAround(new Vector3(0,0,1), new Vector3(0,0,2),5); 13 } 14} 15

試したこと

transformRotateRotateAroundなどを使いコードを記述してみたのですが
全くあらぬ方向に回ってしまい、中々思い通りにいきません。
Rotate系を使うのはやめたほうが良いのでしょうか?
使える関数など教えて頂けると幸いです。。

補足情報(FW/ツールのバージョンなど)

Unity 2019.1.0f2

追加画像1)
イメージ説明

追加画像2)
イメージ説明

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

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

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

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

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

guest

回答3

0

transform.RotateAroundが使えます

ワールド座標の point を中心とした軸( axis )で angle 度回転させるメソッドです

https://docs.unity3d.com/ja/current/ScriptReference/Transform.RotateAround.html

投稿2019/06/25 13:02

naby

総合スコア126

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

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

0

すごい簡単にやるなら空のゲームオブジェクト作ってpivotを変更してやる方法が使えます。

http://portaltan.hatenablog.com/entry/2016/04/15/134129

投稿2019/06/26 00:15

hogefugapiyo

総合スコア3302

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

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

0

ベストアンサー

Quaternion.AngleAxis メソッドを使ってイメージ通りに回転できないでしょうか?

参考:【Unity】 Quaternionの使い方
https://www.f-sp.com/entry/2017/08/30/171353

C#

1//--------------------------------------- 2// Y軸周りを秒速45度で回転させるサンプル 3//--------------------------------------- 4 5// Y軸周りを回転するQuaternionを作成 6Quaternion rotY = Quaternion.AngleAxis(45.0f * Time.deltaTime, Vector3.up); 7 8// 現在の回転値と合成 9Quaternion newRotation = rotY * transform.rotation; 10 11// 新しい回転値を設定 12transform.rotation = newRotation;

投稿2019/06/25 09:14

編集2019/06/26 07:59
nskydiving

総合スコア6500

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

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

Gurumer

2019/06/26 00:02

返信遅れました。 AngleAxisメソッドを使ってみたのですが、 このメソッドをアタッチするのは大砲の方ではなく 車輪の方でしょうか? 大砲の方にアタッチをすると、大砲自身が時計のように回転してしまいます...
nskydiving

2019/06/26 00:36

アタッチするのは大砲で、AngleAxisメソッドの第2引数「axis」には車輪の軸を指定していけると思うのですが・・・ 以下の参考URLを参考にしてみてください。 【Unity】 Quaternionの使い方 https://www.f-sp.com/entry/2017/08/30/171353
Gurumer

2019/06/26 06:36

「車輪の軸を指定する」というのは、 // xyz軸を軸にして1度、回転させているQuaternionを作成 Quaternion move_q = Quaternion.AngleAxis(5.0f,GameObject.Find("syarin").transform.position); // 自身のQuaternionを取得 Quaternion q = this.transform.rotation; // 合成して、自身に設定 this.transform.rotation = q * move_q; こんな感じでしょうか。。
nskydiving

2019/06/26 06:53

transform.position はオブジェクトの位置を表すベクトルです。 車輪の軸ベクトルとは違いますので、車輪の座標系を確認してみてください。
Gurumer

2019/06/26 08:07 編集

// xyz軸を軸にして1度、回転させているQuaternionを作成 Quaternion move_q = Quaternion.AngleAxis(10.0f,new Vector3(0,0,1)); // 車輪のQuaternionを取得 Quaternion q = GameObject.Find("syarin").transform.rotation; // 合成して、自身に設定 this.transform.rotation = q * move_q; こんな感じですかね。。 これで動かしてみたんですが、 少しだけ傾いただけで止まってしまいます...
nskydiving

2019/06/26 07:28

回転角度が「10.0f」固定なので、それ以上回転しないのでしょうね。 時間経過で動かしたいなら「10.0f * Time.deltaTime」のようにすれば徐々に回転すると思います。
Gurumer

2019/06/26 07:42

何度も何度もすみません。 10.0fの角度を実際に90.0fにしてPlayしてみると、 何故か軸を車輪にしているにも関わらず、 大砲の筒の中心を軸として回ってしまいます。。 GameObject.Find("syarin").transform.rotation; というのは、あっていますかね...? エラーも出ていないのでしっかりと取得していると思うのですが...
nskydiving

2019/06/26 07:53

> // 自身のQuaternionを取得 > Quaternion q = GameObject.Find("syarin").transform.rotation; 自身=大砲のような気がしますが、違いますか? コメントとコードがちぐはぐになっているような気がします。
Gurumer

2019/06/26 08:02

サイト内のコードをそのまま持ってきて使っていたので、 コメントもそのままの状態で書いてしまいました。 すみません。 今上のコードが入っているオブジェクトは、 大砲の筒の方に入れています。 その為コードの記述にある"this"は「大砲の筒」を示しています。
nskydiving

2019/06/26 08:11

であれば、回転する大砲のクォータニオンを取得しないとダメですね。 回答欄にコードを貼り付けました。 「Vector3.up」のところだけ、車輪の軸ベクトルに変えれば動くと思います。
Gurumer

2019/06/26 08:36 編集

Quaternion rotZ = Quaternion.AngleAxis(kakudo * Time.deltaTime, GameObject.Find("syarin").transform.position); Quaternion newRotation = rotZ * transform.rotation; transform.rotation = newRotation; こんな感じでしょうか? これで動かしてみたのですが、 大砲が(補足情報追加画像1参照)青矢印を軸として赤矢印ように動いてしまいます。
nskydiving

2019/06/26 09:37

「GameObject.Find("syarin").transform.position」は原点「Vector3(0,0,0)」から車輪の位置までのベクトルです。 そうではなく、車輪の軸ベクトルを指定してください。 たぶん「GameObject.Find("syarin").transform.forward」かなと思いますが・・・違うかもしれません。(スクショからでは車輪の座標や軸が確認できないので、ご自分で確認してください。)
Gurumer

2019/06/27 07:53

forwardに変更してみたのですが、まだ車輪を軸に回わりませんでした。 少し前と変わらず、大砲の中心を軸に回っています。 車輪のinspectorの画像(追加画像2参照)を追加させていただきました。
Gurumer

2019/06/27 08:01

あと、補足なのですが、"GameObject.Find("syarin").transform.forward" をlogに出してみた所、(0.0, 0.0, 1.0)と表示されました。
Gurumer

2019/06/27 22:30

すみません。forwardを使ってみたら思い通りに動きました!!ありがとうございます。 またここまで私の質問に付き合って頂きありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問