• ベストアンサー

GLで座標を変えて回転させたい

openGLで glRotatef(angle, 0.0, 0.0, 1.0); でz軸について回転させたのですが、 オブジェクトの点の座標は変わっていませんでした。 オブジェクトの座標自体を変更してZ軸について回転させたいのですが,できますでしょうか. 分かりにくい質問かもしれませんが,お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

多数の点からなるオブジェクトの座標変換(アフィン変換)を、わざわざ外部で計算する手間を省くのがopenGL等の役割でしょう。。。 もしかして、openGLをアフィン変換関数として用い、変換後の座標を取得したいと言うことでしょうか? もしそうならば、openGLのglRotate関数が行っている作業をソースコードから抜き出して、外部で処理させればいいでしょう。 ソースコードを参照しなくても、glRotate内部で行っている行列演算については、下記にて詳しく述べられています。 http://wisdom.sakura.ne.jp/system/opengl/gl11.html

hirubanasa
質問者

お礼

ご回答ありがとうございます。 変換後の座標取得がしたかったもので^^; URLありがとうございました。 御陰様でできました。

その他の回答 (1)

回答No.2

glRotate(angle,0.0, 0.0, 1.0)は、元の座標自体を変更するということはありません。 オブジェクトの元の座標をもとにして、回転させた位置にオブジェクトを表示させているだけですから。 また、openGLの関数で、座標自体を書き換えてしまう関数はないと思います。 OpenGLはヴューアのためのAPIです。 ということは、座標自体をいじくりたいならば、自分で変換行列を作成して、その積を取るしかないと思います。 透視投影はOpenGLで出来ますので、変換行列自体は、簡単な3×3の行列計算でできます。 あと、余談ですが、 OpenGLでオブジェクトを回転させるために、座標自体を変更する必要はないと思います。 なぜなら、そういう面倒くさいことをしなくていいように、glRotate関数などが、ライブラリとして入っているわけですから。

hirubanasa
質問者

お礼

ご回答ありがとうございます。 回転後の座標が欲しかったため質問させていただきました。 行列を使ってできました。 ありがとうございました。

関連するQ&A

  • 球座標の回転角の取り方について

    極座標系の一種に、「球の半径 r 、 z 軸からの回転角(0からπ)、x 軸からの回転角(0から2π)」の3つを用いて座標を記述する、球座標というものがありますが、なぜ z 軸からの回転角なのでしょうか? 表現としては x - y 平面からの回転角(-π/2からπ/2)でもいいように思います。 (ほかに、もっといい例があるかもしれませんが一応) 個人的考えてみた結果、「z 軸からの」という表現になっている理由として (1)多次元への拡張を考慮したから(球座標系はもう使えませんが) (2)「x軸からの」という言い回しとの対応を図りたかったから (3)回転角の範囲が-π/2からπ/2、となって扱いにくいから(よく考えてないのでわかりませんが、場合によっては便利な場合もあるかもしれません) の3点が関係しているのかなと思いました。 定義だからそうなんだと言われればそれまでですが、皆さんはどのように考えますか? また、球座標に関して、z 軸からの回転角以外などの設定の仕方もあるのでしょうか?(先ほどの例のように) 信用はできないかもしれませんが、Wikipediaにはz軸設定でしか載っていませんでしたので。 回答よろしくお願いします。

  • オイラー角回転後座標系の回転について

    オイラー角で回転させた座標系を作成。 その座標系を更に回転させた場合の、 オイラー角を求めたいのですが、上手く行きません。 そこで質問させて下さい。 【やりたい事】 (1)まずは、右手系座標系AをZYXオイラー角(φ,θ,ψ)で回転した座標系A'を作成する。   1.最初にZ軸周りにφ回転   2.Y'軸(Y軸をZ軸周りにφ回転したもの)周りにθ回転   3.X''軸(X軸をY'軸周りにθ回転したもの)周りにψ回転 (2)次に回転後座標系A'を回転前座標系AのX軸周りにβ回転したモノを座標系A''とする。   座標系A’’のZYXオイラー角を求めたい。   (AをA''に一致する様に回転した時のZYXオイラー角を求めたいです。) 上記の様な角度は算出できるのでしょうか? 説明が分かりづらく申し訳御座いませんが、 ご回答何卒よろしくお願い致します。

  • 3次元での回転による座標変換

    3次元での回転による座標変換に関して質問があります. X軸,Y軸,Z軸の直交座標系があるとします. この座標系において,ある位置ベクトル(a1,b1,c1)がX軸,Y軸,Z軸と成す角度は,θx,θy,θzは,ベクトルの内積から算出可能だと思います. θx=a1/sqrt(a1^2+b1^2+c1^2) θy=b1/sqrt(a1^2+b1^2+c1^2) θz=c1/sqrt(a1^2+b1^2+c1^2) X,Y,Zの直交座標系を回転させて,この位置ベクトルの向きを基準としたX'軸,Y'軸,Z'軸による新しい直交座標系を設定するには,どのようにすればよいでしょうか? θx,θy,θzと各軸での回転角度は違うものという認識でいいのでしょうか? 元の座標系において,各軸回りに順番に回転させればいいかと思うのですが,どうもイメージがつかみきれません. よろしくお願い致します.

  • 回転した座標系を基準とし、再回転したときの回転行列について

    x軸、y軸、z軸が互いに直角に交わる座標系を考えます。(これを座標系Aとします) 座標系Aを、原点を中心とし、各軸ごとにθxa,θya,θzaだけ回転させた座標系を座標系Bとします。 さらに、座標系Bを基準とし、各軸ごとにθxb,θyb,θzbだけ回転させた座標系を座標系Cとします。 このとき、座標系Aから見た座標系Cの回転角は、どのように計算すればよろしいでしょうか? 座標系Aを基準とした回転角で座標系Bを計算し、さらに座標系Aを基準とした回転角で座標系Cを計算し……という問題であれば、単純に回転行列を掛けていけばいいと思うのですが、 「1つ前の座標を基準とした回転角を与えられたとき、全体でどれだけ回転したか?」 を表現する方法がわからなかったので、ご教示いただければ幸いです。 何卒よろしくお願いいたします。

  • 3次元座標での点の回転について

    3次元座標上に複数の点があり、それらを同時にx,y,z軸周りにφ,θ,Ψ度回転させたとき、 各点の移動前と移動後の座標から、この回転角度φ,θ,Ψを求めたいのですが、 どのような計算で求めることができるでしょうか?

  • openGLの回転の仕組みが分からなくて、困っています

    openGL初心者です。描画関数で以下のような書き方でx軸、y軸、z軸それぞれに角度を与えてオブジェクトを描画しているのですが、意図した角度に回転してくれません。 一応自分の認識では、openGLでは以下のような書き方をすると、まずオブジェクトの描画がされて、次にz軸の回転→y軸の回転→x軸の回転と、処理の順番とは逆に計算が行われると知ったのですが、まずその認識は正しいでしょうか? そこで、実際にx、y、z軸にそれぞれ角度を与えてオブジェクトを回転させてみるのですが、どうも意図した回転にならないのです。 例えばz軸に90度の値を与えて、オブジェクトを横に倒したとします。 まず、その状態でローカル座標系のx軸とy軸がz軸を中心に90度回っていると思っています。 その後、y軸に90度の値を与えても、ローカル座標系のy軸を中心に回らず、まるでワールド座標系のy軸を中心に90度回りまわっているように見えます。また、x軸も同様にワールド座標系のx軸を中心に90度回ります。 そこで、ワールド座標系で回るのかと思い、今度は、ニュートラルの状態から、y軸を90度回します。ローカル座標ではx軸、z軸がy軸を中心に90度回ると思います。次にx軸に対して、角度を与えてやると今度はローカル座標系のx軸を中心にまわるのです。 何故このような回転をするのかイメージできません。。どなたか回答いただけませんでしょうか? それと本当にやりたいことは、オブジェクトがどのような姿勢で回転していても(ローカル座標系がどうであれ)ワールド座標系のx、y、z軸を中心に回転させたいのですが、宜しければその辺も合わせて教えて頂けたら幸いです。 (数学の知識も乏しいので、数式がちゃんとあるのなら、その名前を教えていただければ直幸いです。) 乱文失礼します。 public void display(GLAutoDrawable drawable) { gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); gl.glMatrixMode(GL.GL_MODELVIEW); gl.glLoadIdentity(); gluLookAt((double) 0.0f, (double) 0.0f, (double) 5.5f, (double) 0.0f, (double) 0.0f, (double) 0.0f, (double) 0.0f, (double) 1.0f, (double) 0.0f); gl.glEnableClientState(GL.GL_VERTEX_ARRAY); gl.glEnableClientState(GL.GL_COLOR_ARRAY); gl.glRotatef(AngleX, 1, 0, 0); gl.glRotatef(AngleY, 0, 1, 0); gl.glRotatef(AngleZ, 0, 0, 1); // オブジェクト描画 draw(gl); gl.glDisableClientState(GL.GL_COLOR_ARRAY); gl.glDisableClientState(GL.GL_VERTEX_ARRAY); }

  • 座標変換による回転角の求め方

    直交座標系で定義されている任意のベクトル(x1、y1、z1)に対し、そのベクトル方向に直交座標系のz軸が向くようにするための各軸回りの回転角(θx、θy、θz)の求め方(式)を教えてください。

  • 3次元座標を原点中心に回転したい

    任意のゼロでないベクトル(a,b,c)を原点中心に回転し、z軸に合致させるとする。同じ回転移動を3次元座標上の任意の点(x,y,z)に対して行った時の移動後座標が知りたいのです。 計算と結果を教えて下さい。

  • 座標系の回転の問題です

    大学物理入門の問題です 【問題】 空間に固定された座標系Sと、回転している別の座標系S'を考える。座標系S'は、Sに対して角速度ω=Ωi+Ωjで回転しているものとする。ただしこれらの座標系の原点は一致するとする。また、時刻t=0においてこれらの2つの座標系は一致するとする。時刻tにおいて、座標系S'のx'軸、y'軸、z'軸方向の単位ベクトルをそれぞれi'(t)、j'(t)、k'(t)とする。 時刻tにおけるベクトルi'(t)、j'(t)、k'(t)を求めよ 問題は以上です 文中のωはベクトル、i、j、kはそれぞれ座標系Sのx軸、y軸、z軸方向の単位ベクトルです できれば、ベクトルi'(t)、j'(t)、k'(t)がどのような回転をするのか、図を用いて説明していただけると嬉しいです どなたか知恵をお貸しください よろしくお願いします

  • 回転後の座標について 5軸加工機

    今年中に、OKKの縦型マシニング機械(三菱Neomatic)に日研のNCインデックス(角度と回転ができる仕様)を載せる予定です。 使いやすくするため、テーブル回転後の座標を、変数で計算ができるプログラムを作っているのですが、うまくいかず頭をかかえてる毎日であります。 そこで、皆様の力をお願いしたく質問させていただきます。 私の希望としては、 #101=回転させたいG54からのX座標(+OR-) #102=回転させたいG54からのY座標(+OR-) #103=回転させたいG54からのZ座標(+OR-) #104=回転C(+OR-) #105=角度A(+OR-) 上記、G54座標中心からずれた数値(#101から#103)から、回転&角度(#104、#105)の数値を変更するだけで、ひねった後の座標を計算し、その答えをG55の座標系に入れるプログラムを作っているのですが、いくつか問題がある為うまくいきません。 ◎G54のワーク座標がテーブル回転中心ではない。 ◎G54のワーク座標の中心位置から、さらにずらした位置を回転させたい。 ◎X,Y,Z及び、回転軸C、角度軸A 共にプラス数値とマイナス数値があり計算が困難。 ◎回転軸C、角度軸A 共に90度以上回る。 この様な原因があり、電卓で計算した数値と変数で計算させた数値が違い、困った次第であります。 機械の特徴としては、 ◎機械座標はマイナス数値 ◎テーブル回転中心座標は#501=X #502=Y #503=Z に登録済み。 ★☆まとめ☆★ #5221=G54X座標 #5222=G54Y座標 #5223=G54X座標 を使い #101=回転させたいG54からのX座標(+OR-) #102=回転させたいG54からのY座標(+OR-) #103=回転させたいG54からのZ座標(+OR-) #104=回転C(+OR-) #105=角度A(+OR-) で移動させた数値の答えを #5221=G54X座標 #5222=G54Y座標 #5223=G54Z座標 に登録したい。 文章が下手で申し訳ありませんが、どなたか変数を使い回転後の座標が計算できるプログラムをお教え下さい。 不明な点等ございましたらお教え下さい。 大変困っているので宜しくお願いします。 まとめの部分を下記の様に修正いたします。 ★☆まとめ☆★ #5221=G54X座標 #5222=G54Y座標 #5223=G54X座標 を使い #101=回転させたいG54からのX座標(+OR-) #102=回転させたいG54からのY座標(+OR-) #103=回転させたいG54からのZ座標(+OR-) #104=回転C(+OR-) #105=角度A(+OR-) で移動させた数値の答えを #5241=G55X座標 #5242=G55Y座標 #5243=G55Z座標 に登録したい。

専門家に質問してみよう