3D

【Java・3D】2×2×2のルービックキューブを作ろう!【Part3/5】

前回

【Java・3D】2×2×2のルービックキューブを作ろう!【Part2/5】 前回 https://itech-program.com/?p=1995 ルービックキューブ(2×2×2)を作成...

回転軸の謎を知ろう

さてこれからキューブを回転させていきたいわけなんですが、実はこの回転軸には強い癖があり、初見のプログラマを悩ませることになります。

ローカル回転軸とワールド回転軸

まず、ローカル回転軸とワールド回転軸の違いを知る必要があります。

上記の図のように、ワールド回転軸は大元の回転軸で、ローカル回転軸はオブジェクト自体が持つ回転軸となります。

しかし、このローカル回転軸には強い癖があり、しっかり特徴を抑える必要があります。

ローカル回転軸は回転する

ローカル回転軸は、回転角度を変えると、一緒に回転する特徴があります。

ただ、X・Y・Z軸それぞれ回転する条件が異なるので、3つの場合わけで特徴を抑えましょう。

X軸

X軸はY軸が回転しようが、Z軸が回転しようが、その影響を全く受けないので、X軸回転に関しては特別な事柄は一切ありません。

Y軸

Y軸はX軸が回転すると影響を受け、一緒に回転します。ただ、Z軸の回転には影響しません。

Z軸

Z軸はX軸・Y軸が回転すると影響を受け、その分一緒に回転します。

回転の計算式

単にX・Y・Z軸に90度を加算するだけでは、回転軸が回転している影響で上手くいきません。

なのでX・Y・Z軸回転をするための計算式を求めていきます。

ang(X・Y・Z)・・・元のX・Y・Zいづれかの回転角度

rev(reverseの略)・・・逆回転する場合は-1が、そうでなければ1が代入されます。

X軸

\(angX += 90 \times rev\)

Y軸

\(angX += |\sin angX^{ \circ }| \times |\sin angY^{ \circ }| \times 90\)

\(angY += (-\sin angX^{ \circ } \times |\sin angY^{ \circ }| + \cos angX^{ \circ }) \times 90 \times rev\)

\(angZ += (-\sin angY^{ \circ } \times |\sin angX^{ \circ }| + \sin angX^{ \circ } \times (-\cos angY^{ \circ }) \times rev) \times 90\)

Z軸

\(angX += -\sin angY^{\circ} \times \cos angX{\circ} \times 90 \times rev\)

\(angY += (-\sin angY^{\circ} \times |\cos angX^{\circ}| + \sin angX^{\circ} \times rev) \times 90\)

\(angZ += (|\sin angY^{\circ}| + \cos angY^{\circ}) \times \cos angX^{\circ} \times 90 \times rev\)

これで回転軸の謎は解決です。

ただ、この計算式は結果から導き出した結果論的な数式なので、深い意味はないです。

キューブを回転させる

まずはX軸の回転をします。

X軸の回転は特別なことはないので、そのまま90度を加算していきます。

(Main.java)

 

次回はY・Z軸の回転、そして回転アニメーションも行なっていきます。

次回

【Java・3D】2×2×2のルービックキューブを作ろう!【Part4/5】前回 https://itech-program.com/?p=2007 計算用関数を作成 三角関数「sin・cos」 「M...
ABOUT ME
IT系だんし
プログラミングが大好きな人。 趣味でゲームやツール製作をしながら、プログラミング記事を書き続けています。

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です