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

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

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

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

Q&A

解決済

2回答

3395閲覧

「回転」のアニメーションについて

b7n

総合スコア30

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

0グッド

0クリップ

投稿2016/12/06 15:44

編集2016/12/07 11:34

3D空間に画像を配置するプログラムを作っています。
ユーザーは、X軸、Y軸、Z軸の中から、好きな軸を好きな順序で選び、角度を指定して、選んだ軸と角度を組み合わせて画像をワールドの軸で回転することができます。

ここに、アニメーション要素を追加したいのですが、この柔軟な指定方式のためか、ある軸Aを一定の角度で傾けている状態で、そのほかの軸Bを回転させると、連動して軸Aまで動いてしまうという問題が発生します。

例えば、ユーザーがX軸を中心に270°、Y軸を中心に0°回転しているとしましょう。ここで、Y軸を360°回転させようと思います。しかし、現在の方法では、このように回転してしまいます。
実験図

理由は順を追って調べたところ、以下のようになることがわかりました。
詳細図

Y軸だけ変化させたはずが、X軸やZ軸までもが変化しているように見えますね。ここをY軸のみを変化させたいです。

柔軟な指定を意識しつつ、このような変化をアニメーションにすることはできませんか?


<追記>

ソースは外部リンクですが、ここに載せておきます。
GitHub

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

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

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

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

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

ozwk

2016/12/07 00:07

> ユーザーがX軸を中心に270°、Y軸を中心に0°回転しているとしましょう。ここで、Y軸を360°回転させようと思います。 この軸はローカルですか?ワールドですか?
b7n

2016/12/07 06:39

全てワールドの軸で回転させています。
guest

回答2

0

ある物体を順番に、
ワールドZ軸に+90度
ワールドX軸に+90度
ワールドZ軸に-90度
ワールドY軸に+90度
と回転させると最終状態は初期状態と比べてどういう姿勢になっているでしょうか?

平行移動だったら、
X+5 → Y+5
と移動させたら(+5,+5)だから
回転も同じように
(+90,+90,0)だ!

などど考えてしまいがちですが、
実際は初期姿勢と同じになります。
回転操作は単純に足したらいかんのです。
順番で変わってしまうのです。
(そしてそうなると(+90,+90,0)という姿勢の表現は曖昧になる)


さて、X+270度からY+(wt)度というのをやりたかったら、
時刻tの姿勢は
初期姿勢をX+270度して、そこから更にY+(w
t)度したものになります。
要するに回転操作を二回やります。
(回転行列とかクォータニオン計算して一発でもいいんですが)

投稿2016/12/07 03:54

編集2016/12/07 03:58
ozwk

総合スコア13512

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

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

b7n

2016/12/07 11:42

>ある物体を順番に、 ワールドZ軸に・・・・と回転させると・・・ 最終状態は初期状態と比べて変わりませんでした。 >X+270度からY+(w*t)度というのをやりたかったら、 どのような回転条件(「この軸を中心に○度回転」というものの配列)にも対応することができますか? また、その場合、回転操作をどのようにすればよいのでしょうか。
ozwk

2016/12/07 12:01

要するに 順番に回転させるなら、その通りの順番で回転操作をしましょう。
guest

0

ベストアンサー

回転の計算式はどのようなものを?

人間にわかりやすく単純にするにはクォータニオンで任意軸回転で計算するのが楽チンですよ。

投稿2016/12/06 16:55

mugicya

総合スコア1046

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

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

b7n

2016/12/06 17:53

回答ありがとうございます。 クォータニオンとは初耳です。これを使えばOpenGLのglRotateが一文で書けそうですね。とても貴重な情報ありがとうございます。 このクォータニオンですが、どのように使えば今回の状況に当てはまるのか、いまいちイメージが浮かびません。大まかなイメージを教えていただけないでしょうか。 回転の計算式ですが、 ``` before.rotate(1-per); after.rotate(per); ``` それぞれの回転に割合をかけています。ベクトルの場合はうまくいくのですが回転は一筋縄にはいかないようです。 ソースは外部リンクですが、ここに載せておきます。 https://github.com/Team-Fruit/SignPicture/blob/2c7c1f4516c0cbf38227a02647d469de6fd68812/src/main/java/com/kamesuta/mc/signpic/image/meta/RotationData.java
mugicya

2016/12/07 05:11

クォータニオンというのは、簡単に説明すると おでんの具に対して、任意の方向から串を刺し、その串を中心に回転させるような。 そんな計算法です。
b7n

2016/12/08 13:32

クォータニオンが使用できるライブラリ、javax.vecmath.Quat4fのQuat4f#interpolateを利用することで、スムーズに回転させることができました。 クォータニオンというナイスな発想、ありがとうございます。 ソースコードは結果このようになりました。 http://archive.is/09PHH
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問