画面に対し平行な面は平行なままだし、垂直な面は画面中央に収束しちゃうわけで、いまいち立体感がないんすよね。

テン・シー・シー-cube
こういうふうに画面から傾いた状態なら、それらしくなる。

 だったら立方体を傾けちゃえ~ということで回転させます。ただ、平行移動と違って、ち~と高校生レベルの数学をやらんといけません。

Y軸回転
 3次元での回転には軸が存在するわけですが、その軸が点になる位置から見れば、単なる平面上の回転となります。
 例えば、Y軸を軸にしてθ度回転させることを考えると、座標のY成分は回転後も変化しないのでX,Z平面上の回転を考えればいい事になり、この時点で2次元の回転移動の話になるわけっす。

テン・シー・シー-1
 前回のサンプルソースの平行移動前の立方体をX,Z平面でみると上のようになるわけです(p[2],p[3],p[6],p[7]はかぶっちゃうので省略してる)。

 で、これをθ度回転するにはどうすればいいか?

テン・シー・シー-2

 X軸やZ軸上の点なら簡単です。単にsinθや、cosθをかければいい。例えば x = 1, z = 0の点Pのθ度回転後の点P'は x = cosθ, z = sinθなわけです。

テン・シー・シー-3

 だけど、p[0]、p[1]、p[4]、p[5]はどれも軸上にはないわけっす。単純にsinθや、cosθをかければいいというわけにはいかんのよ。
 かけるとしたら現在位置がX軸上からα度回転した状態とみなし、そこからのθ度回転、α+θの回転として計算すればいいんですが、αどうやって求めるんだよって話です。

テン・シー・シー-4
こんな感じで(α+θ)の回転と考える

ま、求められないことはないんですが、α抜きで解決するためにベクトルを使います。

位置ベクトルp
 まず、原点からp[5]への位置ベクトルpを考え、これをX軸ベクトルとZ軸ベクトル成分に分解します。

テン・シー・シー-5
高校生で習ったの覚えてるかな~

ベクトルp = ベクトルez + ベクトルex

ベクトルの加算は同じ成分同士の加算。

ベクトルp = ベクトルez + ベクトルex
ベクトルez = (0, z)
ベクトルex = (x, 0)
ベクトルp = (0 + x, z + 0) = (x, z)

で、ベクトルpがθ度回転された場合、ベクトルez、ベクトルexもθ度回転するわけで

テン・シー・シー-6

ベクトルp' = ベクトルez' + ベクトルex'

となります。
 ここで、ベクトルez 、ベクトルexはそれぞれZ軸、X軸上だったので、回転後のベクトルez' + ベクトルex'には

sinθ、cosθ

が使えるわけなんですね~。

テン・シー・シー-7

テン・シー・シー-8

ということは

ベクトルp' = ベクトルez' + ベクトルex'

に当てはめると

ベクトルp' = (- z sinθ + x cosθ, z cosθ + x sinθ)

というわけで[x, z]をθ度回転させた[x', z']は

x' = - z sinθ + x cosθ
z' = z cosθ + x sinθ

という計算で求まるわけなんですね~。


ていうか、加法定理を使って

点pと原点との距離を1とした場合
cos (α + θ) = cosα cosθ - sinα sinθ
sin (α + θ) = sinα cosθ + cosα sinθ

ここで、

cosα = x, sinα = z

なので、

x' = x cosθ - z sinθ
z' = z cosθ + x sinθ

と解いた方がエレガントじゃねえすか?


とか、つっこんだ人もいると思うけど、まあ、加法定理の証明という事でひとつ。
 かって、スティーヴン・ホーキング博士が著書で、公式を一つ使う毎に部数は減っていくよと編集者にアドバイスされたとか書いてたので、加法定理使わずに、いちから解いてみますた。

 こ、公式覚えてないわけじゃ、ないんだからねっ!
 覚えなくても計算で求まるから覚えてないだけっっ。

 長くなっちゃったので、以下次回。
 余裕のある人は、前回のソースに上の式を頂点座標の変換用関数として組み込んでみて試してみてください。

テン・シー・シー-スクリューズ