質問: 最近、OpenGLで、3Dの物体を動かすプログラムを書き始めた者です。 シリンダーなどを置く時に、物体の向きが考えているようになりません。 例えば、中心座標にシリンダーを置いて、x軸周りに30度、y軸周りに30度、z軸周りに30度の方向を向くように、シリンダーの向きを変えたいと思って、 glRotatef(30, 1.0, 0.0, 0.0); glRotatef(30, 0.0, 1.0, 0.0); glRotatef(30, 0.0, 0.0, 1.0); と書いてみたのですが、思ったようにはならず、調べてみると、最初のglRotatefで、x軸周りに回転させた時点で、座標系ごと回転しているということなんですよね? そして、次のy軸周りの回転は、その前に回転させた座標系のy軸周りに回転し、さらに、その次のz軸周りの回転は、前2回の回転がかかっている、座標軸のz軸周りに回転するという認識でいいでしょうか? おそらくそれで、思った方向にシリンダーが向かないのだなということはわかったのですが、 動かない座標(絶対座標?)に対して、上記の角度に物体を向かせるには、どのようにすればよいでしょうか? 座標系が回転したことを考慮して、次の回転角を計算する必要があるのでしょうか? それは、ものすごく、大変そうなので、なんとか、回避したいのですが、できますでしょうか? お知恵をお借りできればと思います。よろしくお願いしたします。
回答: umyu様、ありがとうございます。 クォータニオンについては、glRotatefのことを調べているときに出てきたのですが、まだ勉強不足で、意味がわからないため、ちょっと避けておりました。やっぱり、そのあたりをしっかり理解しないと難しいみたいですね。頑張ってみます。 KSwordOfHaste様、ありがとうございます。 意図しているのは、まさにそういうことでして、わかりにくい文章を理解してくださって助かります。それで、アドバイスをもとに私も考えてみたのですが、おっしゃる通り、角度は、一つ決めた時点で、他の2つに制約が出て、更にもう一つ決めると、最後の一つは、自動的に決まるのですよね。 そのあたりの、基本的な部分が、まだ私の中で整理されておらず、お恥ずかしい限りです。 絶対座標系に対して、こういう向きに置きたいというのは、どうしても必要なことなので、2つの角度の指定でやれるように考えてみます。 私のわかりやすさで言えば、x-y平面上の角度(z軸周りの回転)を決めてから、x-z、もしくは、y-z平面上で角度を指定するのというのが、今のところ、直感的に理解できそうな気がしますので、そのようにして、まずはやってみます。 アドバイスを下さったお二人に感謝いたします。 また、何かありましたら、お世話になるかもしれませんが、よろしくお願いいたします。