質問: glRotated//回転 glTranslatef//移動 glScaled//拡大 を使わずに、頂点の位置を変え、world行列をつくりたいのですが、まったくどうすればいいか思い浮かびません。(4*4の行列にならないかもしれない。すいません。) 追記....ポリゴン1個つくったからこれでしばらく練習するかな ``` 試しにglClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClearColor(0.0,0.0,0.0,1.0); //(0.8,0.8,1.0,1.0)は白 //(0.0.0.0,0.0,1.0);は黒 glPushMatrix(); glLoadIdentity(); gluLookAt(0.5,0.6,0.7,//0.4,0.8,0.7 0.0, 0.0, 0.0, 0.0, 1.0,0.0 ); glScalef(0.1,0.1,0.1); glBegin(GL_TRIANGLES); /*元の三角形*/ float a[9] ={0.0, 0.5,0.0, -0.5, -0.5,0.0, 0.5,-0.5,0.0}; /*x軸回転90度回転*/ float b[9]={ 1.0,0.0,0.0, 0,cos(M_PI/2),-sin(M_PI/2), 0, sin(M_PI/2),cos(M_PI/2) }; float c[9]; c[0]=a[0]*b[0]+a[1]*b[3]+a[2]*b[6]; //ok c[1]=a[0]*b[1]+a[1]*b[4]+a[2]*b[7]; //ok c[2]=a[0]*b[2]+a[1]*b[5]+a[2]*b[8];//ok c[3]=a[3]*b[0]+a[4]*b[3]+a[5]*b[6]; //ok c[4]=a[3]*b[1]+a[4]*b[4]+a[5]*b[7]; //ok c[5]=a[3]*b[2]+a[4]*b[5]+a[5]*b[8];//ok c[6]=a[6]*b[0]+a[7]*b[3]+a[8]*b[6]; c[7]=a[6]*b[1]+a[7]*b[4]+a[8]*b[7]; c[8]=a[6]*b[2]+a[7]*b[5]+a[8]*b[8]; glVertex3f(a[0], a[1],a[2]); glVertex3f(a[3], a[4],a[5]); glVertex3f(a[6], a[7],a[8]); //glVertex3f( c[0], c[1],c[2]); //glVertex3f(c[3], c[4],c[5]); //glVertex3f(c[6], c[7],c[8]); glEnd(); glPopMatrix(); ``` で何がしたいのかっていうと、求めたいのはy軸周りの内積だった。 ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/74c31c319e4031072e47ccc58e6332b8.png) たぶんx軸で90°回転した。 ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/8caf9980ba88adf064ff2f6a31cfcad2.png) 書けばわかると思ったがそんなことなさそうだった。これはできなそう。責任はとらない。 しばらく考えたけれど回転必要ないんだよね。 ●縮小 z軸の縮小、数式は単純化されているとき、 妙だったので消す,あらゆる間違いについて責任はとらない。 その通りにみえるので、感動してあげた。 あと、紙でしかやったこないけど、行列の4行目は移動に関してなのですか?
回答: 質問というより,「謎の日記のような何か」に見えます... 一体何が問題なのでしょう? > > glRotated//回転 > > glTranslatef//移動 > > glScaled//拡大 > > > これらの関数は,「(OpenGLが持っている)現在の行列に,これらに相当する変換行列を乗じる」という行列の更新を行っているだけです. `行列更新結果 = 現在の行列 * glRotated等の変換行列`という形で右から乗じます. これらの関数を何らかの理由で使いたくない/使えないのであれば,単に,同様な処理を実装すれば良いだけです. * 自前で全ての演算を行った最終結果の座標を,glVertex系の関数に渡せばよいでしょう. 利点は,演算の実装が底なしに自由なので行列表記を用いずとも良い,というあたりでしょうか. * あるいは,「(OpenGLが持っている)現在の行列」を直接書き換える手段もあるので,(glRotated等を用いずに)自前で計算した変換行列をOpenGLに与えるのでも良いでしょう. こちらの方法の場合は,4*4の変換行列の形を作る必要があります. 「変換行列の計算自体がわからない」ということであれば,わからない箇所を明確にして質問してください. (とはいえ,これ系の計算は,このような場所で質問するよりも,ググって調べた方が早い気がしますが) > > 行列の4行目 > > > とかいう話は,おそらくは同次座標に関連する話かと想像します. 「同次座標」で検索すると良いかもしれません.