いつも暖かいご返答ありがとうございます。<(_ _)>
また、質問させていただきます。
Yutuberゲーム道館さんの「OpenGL道場 第4回「2D変換」」を参考にさせていただいています。
OpenGLの行列変換で、いくら調べても納得がいかない点があったので、質問させていただきます。
glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D( 0, // GLdouble left windowWidth, // GLdouble right windowHeight, // GLdouble bottom 0); // GLdouble top glMatrixMode(GL_MODELVIEW); glLoadIdentity();
まずこちらのソースコードですが、
「glMatrixMode(GL_PROJECTION)」で行列を射影行列に設定する。
上の関数は正射影、投視射影を計算できるよう専用の行列をモデル(glutWireTeapot()使用)の行列に設定しているのでしょうか?
そして「glLoadIdentity()」で設定した行列を単位行列に設定する。
そして「gluOrtho2D()」で座標系を左上が(0,0)、左下が(0,1)、右上が(1,0)のように設定。
なぜglLoadIdent()を使用し単位行列を設定しなければいけないのでしょうか?
(コメントにした場合、モデルが消えてしまいました。)
gluOrtho2D()で座標系を設定するだけならgluOrtho2D()を書かなくてもよくない?と考え、コメントにしてみたらモデルが消えました!
なぜモデルが消えてしまったのでしょうか?
gluOrtho2D()は座標系設定以外にも他に何か意味があるのでしょうか?
ちなみに、こちらの手抜きOpenGLを拝見させていたでき、こちらで扱っている座標系とは、X,Y,Z 軸のことだと勝手に解釈させていただきました。<(_ )>
そして最後に「glMatrixMode(GL_MODELVIEW)」関数を使いわざわざモデルビュー行列に設定しているのでしょうか?
どなたかわかる方、どうか教えてください。<( _)>
全体のソースコードです。
OpenGL
1#include "glut.h" 2#include <stdio.h> 3 4int windowWidth = 800; 5int windowHeight = 800; 6 7 8void display(void) { 9 glClear(GL_COLOR_BUFFER_BIT);//GLbitfield mask:画面の色情報をクリア 10 11 glMatrixMode(GL_PROJECTION); 12 glLoadIdentity(); 13 gluOrtho2D( 14 0, // GLdouble left 15 windowWidth, // GLdouble right 16 windowHeight, // GLdouble bottom 17 0); // GLdouble top 18 19 glMatrixMode(GL_MODELVIEW); 20 glLoadIdentity(); 21 22 glTranslatef(windowWidth/2,windowHeight/2,0); 23 24 static float angle; 25 angle += 1; 26 glRotatef( 27 angle, // GLfloat angle:回転度 28 0,0,1); // GLfloat x, y, z:回転軸 29 30 glScalef(256, 256, 1); 31 glutWireTeapot(1); 32 glFlush(); 33 //glutSwapBuffers(); 34} 35 36void timer(int value) { 37 glutPostRedisplay();//この関数を呼び出せばOpenGLに再描画が必要であると訴えれる 38 39 glutTimerFunc( // 一定時間が経過するとコールバック関数を呼び出す 40 1000/60, // unsigned int millis 41 timer, // void (GLUTCALLBACK *func)(int value) 42 0); // int value 43} 44 45void Reshape(int width, int height) { 46 printf("reshape: width:%d heigh:%d\n", width, height); 47 48 glViewport( 49 0, 0,//GLint x, y 50 width, height);//width, height 51 52 windowHeight = height; 53 windowWidth = width; 54} 55 56int main(int argc, char* argv[]) { 57 glutInit(//ウィンドウを表示させるため、GLUTを初期化 58 &argc, 59 argv); 60 //glutInitDisplayMode(GL_DOUBLE);//unsigned int mode 61 glutInitWindowPosition(0,0); 62 glutInitWindowSize(windowWidth, windowHeight); 63 glutCreateWindow("Title"); 64 glutDisplayFunc(display);//void (GLUTCALLBACK *func)(void) 65 glutTimerFunc( // 一定時間が経過するとコールバック関数を呼び出す 66 1000/60, // unsigned int millis 67 timer, // void (GLUTCALLBACK *func)(int value) 68 0); // int value 69 glutReshapeFunc(Reshape);// ウィンドウのサイズが変わった際に呼び出される 70 glutMainLoop(); 71}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/10 03:49
2020/02/10 04:15
2020/02/10 15:07