• 締切済み

OpenGLについて質問があります。

底から見上げているように立方体がみえるように実行したいんですけどここからどうしていいかわからなくてわかる方いたら教えてください。お願いします。 #include <GL/glut.h> GLdouble vertex[][3] = { { 0.0, 0.0, 0.0 }, /* A */ { 1.0, 0.0, 0.0 }, /* B */ { 1.0, 1.0, 0.0 }, /* C */ { 0.0, 1.0, 0.0 }, /* D */ { 0.0, 0.0, 1.0 }, /* E */ { 1.0, 0.0, 1.0 }, /* F */ { 1.0, 1.0, 1.0 }, /* G */ { 0.0, 1.0, 1.0 } /* H */ }; int edge[][2] = { { 0, 1 }, /* ア (A-B) */ { 1, 2 }, /* イ (B-C) */ { 2, 3 }, /* ウ (C-D) */ { 3, 0 }, /* エ (D-A) */ { 4, 5 }, /* オ (E-F) */ { 5, 6 }, /* カ (F-G) */ { 6, 7 }, /* キ (G-H) */ { 7, 4 }, /* ク (H-E) */ { 0, 4 }, /* ケ (A-E) */ { 1, 5 }, /* コ (B-F) */ { 2, 6 }, /* サ (C-G) */ { 3, 7 } /* シ (D-H) */ }; void display(void) { int i; glClear(GL_COLOR_BUFFER_BIT); /* 図形の描画 */ glColor3d(0.0, 0.0, 0.0); glBegin(GL_LINES); for (i = 0; i < 12; ++i) { glVertex3dv(vertex[edge[i][0]]); glVertex3dv(vertex[edge[i][1]]); } glEnd(); glFlush(); } void resize(int w, int h) { glViewport(0, 0, w, h); glLoadIdentity(); // glOrtho(-2.0, 2.0, -2.0, 2.0, -2.0, 2.0); gluPerspective(30.0, (double)w / (double)h, 1.0, 100.0); //glTranslated(0.0, 0.0, -5.0); gluLookAt(3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); } void init(void) { glClearColor(1.0, 1.0, 1.0, 1.0); } int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGBA); glutCreateWindow(argv[0]); glutDisplayFunc(display); glutReshapeFunc(resize); init(); glutMainLoop(); return 0; }

みんなの回答

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.2

独学でプログラミングするなら踏ん張るべきところですよ。 うまくいかないから質問を打ち切ったってのは失礼だと思いませんか? 私が言いたいのは無理して一気に難しいことをしても出来るわけがありません。なので1つづ片付けましょうってことです。 gluLookAt()のパラメータを調べて説明してみてください。これを理解すれば「底から見上げているように立方体がみえるように実行したいんですけどここからどうしていいかわからなくてわかる方いたら教えてください」が解決します。 調らべた上で分からないというなら、その調べたことを説明してみてください。 それでも答えだけしかいらないと言うのなら、残念ですが私これ以上はお付き合いできません。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.1

前の質問をなぜ打ち切られたのでしょうか? 「OpenGLで質問があります。 - C&C++ - 教えて!goo」 http://okwave.jp/qa/q6905302.html 「独学でプログラミングを勉強したくてやっているんです」って事ですので自分で作れるようになりたいんですよね? こちらの 「GLUTによる「手抜き」OpenGL入門」 http://www.wakayama-u.ac.jp/~tokoi/opengl/libglu … 10.隠面消去処理 を参考に色を塗ってください。 それが出来たら  9.アニメーション で動かします。 をやらないうちから諦めた理由を教えてもらえますか?

rtwrada
質問者

補足

自分でやっても全然うまくいかなかったので、ソースコードを教えていただけませんか?参考にしたいので。よろしくお願いします。

関連するQ&A

  • お願いします。

    IT関係の会社に内定をもらったのですが課題を出されました。 正直プログラミングなんて一度もやった事がなくて困っています。 三角形の面を定義する配列trianlglepを作成して、立方体を三つの頂点ごとの三角形で色分けするのをわかる方がいたら教えてください。お願いします。 #include <GL/glut.h> GLdouble vertex[][3] = { { 0.0, 0.0, 0.0 }, /* A */ { 1.0, 0.0, 0.0 }, /* B */ { 1.0, 1.0, 0.0 }, /* C */ { 0.0, 1.0, 0.0 }, /* D */ { 0.0, 0.0, 1.0 }, /* E */ { 1.0, 0.0, 1.0 }, /* F */ { 1.0, 1.0, 1.0 }, /* G */ { 0.0, 1.0, 1.0 } /* H */ }; int edge[][2] = { { 0, 1 }, /* ア (A-B) */ { 1, 2 }, /* イ (B-C) */ { 2, 3 }, /* ウ (C-D) */ { 3, 0 }, /* エ (D-A) */ { 4, 5 }, /* オ (E-F) */ { 5, 6 }, /* カ (F-G) */ { 6, 7 }, /* キ (G-H) */ { 7, 4 }, /* ク (H-E) */ { 0, 4 }, /* ケ (A-E) */ { 1, 5 }, /* コ (B-F) */ { 2, 6 }, /* サ (C-G) */ { 3, 7 } /* シ (D-H) */ }; int plane[][4] = { { 0, 1,2,3 }, /* 面0 (A-B-C-D) */ { 1, 5,6,2 }, /* 面1 (B-F=G-C) */ { 2, 6,7,3 }, /* 面2 (C-G-H-D) */ { 0,3,7,4 }, /* 面3 (A-D-H-E) */ { 1, 0,4,5 }, /* 面4 (B-A-E-F) */ { 4, 7,6,5 }, /* 面5 (E-H-G-F) */ }; void display(void) { int i; glClear(GL_COLOR_BUFFER_BIT); /* 図形の描画 */ //glColor3d(0.0, 0.0, 0.0); //glBegin(GL_LINES); glBegin(GL_QUADS); for (i = 0; i < 6; ++i) { switch (i) { case 0 : glColor3d(1.0, 0.0, 0.0); break; case 1 : glColor3d(0.0, 1.0, 0.0); break; case 2 : glColor3d(0.0, 0.0, 1.0); break; case 3 : glColor3d(1.0,1.0,0.0); break; case 4 : glColor3d(0.0, 1.0, 1.0); break; case 5 : glColor3d(1.0, 0.0, 1.0); break; case 6 : glColor3d(1.0, 0.5, 0.0); break; case 7 : glColor3d(0.0, 1.0, 0.5); break; case 8 : glColor3d(0.5, 0.0, 1.0); break; case 9 : glColor3d(1.0, 0.5, 0.5); break; case 10 : glColor3d(0.5, 1.0, 0.5); break; case 11 : glColor3d(0.5, 0.5, 1.0); break; default: glColor3d(0.0, 0.0, 0.0); break; } glVertex3dv(vertex[plane[i][0]]); glVertex3dv(vertex[plane[i][1]]); glVertex3dv(vertex[plane[i][2]]); glVertex3dv(vertex[plane[i][3]]); } glEnd(); glFlush(); } void resize(int w, int h) { glViewport(0, 0, w, h); glLoadIdentity(); // glOrtho(-2.0, 2.0, -2.0, 2.0, -2.0, 2.0); gluPerspective(30.0, (double)w / (double)h, 1.0, 100.0); //glTranslated(0.0, 0.0, -5.0); gluLookAt(3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);//課題はここを弄るだけ } void init(void) { glClearColor(1.0, 1.0, 1.0, 1.0); } int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGBA); glutCreateWindow(argv[0]); glutDisplayFunc(display); glutReshapeFunc(resize); init(); glutMainLoop(); return 0; }

  • 内定をもらった会社から課題を出されてしまいました。

    三角形の面を定義する配列trianlglepを作成して、立方体を三つの頂点ごとの三角形で色分けするやり方がわかる方がいたら回答お願いします。 プログラミング未経験者なのでよろしくお願いします。 #include <GL/glut.h> GLdouble vertex[][3] = { { 0.0, 0.0, 0.0 }, /* A */ { 1.0, 0.0, 0.0 }, /* B */ { 1.0, 1.0, 0.0 }, /* C */ { 0.0, 1.0, 0.0 }, /* D */ { 0.0, 0.0, 1.0 }, /* E */ { 1.0, 0.0, 1.0 }, /* F */ { 1.0, 1.0, 1.0 }, /* G */ { 0.0, 1.0, 1.0 } /* H */ }; int edge[][2] = { { 0, 1 }, /* ア (A-B) */ { 1, 2 }, /* イ (B-C) */ { 2, 3 }, /* ウ (C-D) */ { 3, 0 }, /* エ (D-A) */ { 4, 5 }, /* オ (E-F) */ { 5, 6 }, /* カ (F-G) */ { 6, 7 }, /* キ (G-H) */ { 7, 4 }, /* ク (H-E) */ { 0, 4 }, /* ケ (A-E) */ { 1, 5 }, /* コ (B-F) */ { 2, 6 }, /* サ (C-G) */ { 3, 7 } /* シ (D-H) */ }; int plane[][4] = { { 0, 1,2,3 }, /* 面0 (A-B-C-D) */ { 1, 5,6,2 }, /* 面1 (B-F=G-C) */ { 2, 6,7,3 }, /* 面2 (C-G-H-D) */ { 0,3,7,4 }, /* 面3 (A-D-H-E) */ { 1, 0,4,5 }, /* 面4 (B-A-E-F) */ { 4, 7,6,5 }, /* 面5 (E-H-G-F) */ }; void display(void) { int i; glClear(GL_COLOR_BUFFER_BIT); /* 図形の描画 */ //glColor3d(0.0, 0.0, 0.0); //glBegin(GL_LINES); glBegin(GL_QUADS); for (i = 0; i < 6; ++i) { switch (i) { case 0 : glColor3d(1.0, 0.0, 0.0); break; case 1 : glColor3d(0.0, 1.0, 0.0); break; case 2 : glColor3d(0.0, 0.0, 1.0); break; case 3 : glColor3d(1.0,1.0,0.0); break; case 4 : glColor3d(0.0, 1.0, 1.0); break; case 5 : glColor3d(1.0, 0.0, 1.0); break; case 6 : glColor3d(1.0, 0.5, 0.0); break; case 7 : glColor3d(0.0, 1.0, 0.5); break; case 8 : glColor3d(0.5, 0.0, 1.0); break; case 9 : glColor3d(1.0, 0.5, 0.5); break; case 10 : glColor3d(0.5, 1.0, 0.5); break; case 11 : glColor3d(0.5, 0.5, 1.0); break; default: glColor3d(0.0, 0.0, 0.0); break; } glVertex3dv(vertex[plane[i][0]]); glVertex3dv(vertex[plane[i][1]]); glVertex3dv(vertex[plane[i][2]]); glVertex3dv(vertex[plane[i][3]]); } glEnd(); glFlush(); } void resize(int w, int h) { glViewport(0, 0, w, h); glLoadIdentity(); // glOrtho(-2.0, 2.0, -2.0, 2.0, -2.0, 2.0); gluPerspective(30.0, (double)w / (double)h, 1.0, 100.0); //glTranslated(0.0, 0.0, -5.0); gluLookAt(3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);//課題はここを弄るだけ } void init(void) { glClearColor(1.0, 1.0, 1.0, 1.0); } int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGBA); glutCreateWindow(argv[0]); glutDisplayFunc(display); glutReshapeFunc(resize); init(); glutMainLoop(); return 0; }

  • opengl

    C++,openGLの質問です. 画像の上で2点を指定し,その2点を用いて画像上に四角形を表示したいのですがどういったpログラムを書けばいいでしょうか?イメージは図のような感じです.(1)と(2)が画像上で指定した点で高さが255の長方形になるようにしたいです. http://www.wakayama-u.ac.jp/~tokoi/opengl/libglut.html#5 のサイトを参考に作ってみたのですが,いまいちわかりません. 以下,自分で作ってみたところです. わかりにくいと思いますが,アドバイスいただけたら嬉しいです. painted_pointはint型のベクターでクリックされた点の位置を保存しています. 最終的には,3点以上の折れ線上に長方形がつながってくっつくのことを予定しています. for(int i = 0; i<painted_point.size(); i++){ GLdouble vertex[][3] = { { painted_point.at(i).x, painted_point.at(i)., 0 }, { painted_point.at(i).x, painted_point.at(i)., 255 } } }; int edge[][2] = { {1 , 2} for(int i=0; i<painted_point.size(); i++){ edge[][2] ={{ i*2 , i*2 + 2}, { i*2+1 , i*2 + 3}, } {painted_point.size()-1,painted_point.size()} }; /* 図形の描画 */ glColor3d(0.0, 0.0, 0.0); glBegin(GL_LINES); for (i = 0; i < 12; ++i) { glVertex3dv(vertex[edge[i][0]]); glVertex3dv(vertex[edge[i][1]]); } glEnd(); }

  • openGLについて

    最近プログラムを学んでいる初心者の者です。 私は床井研究室の”GLUTによる「手抜き」OpenGL入門”というサイトを使い学んでいるのですが、最初の段階でつまずいてしまいました。 最初のウィンドウを開く段階で #include <GL/glut.h> void display(void) { } int main(int argc, char *argv[]) { glutInit(&argc, argv); glutCreateWindow(argv[0]); glutDisplayFunc(display); glutMainLoop(); return 0; } とすると書いてあるのですが、 最初の#includeのところがペーストしてもエラーが出ます。 あと他のサイトを見ると#includeが複数書かれているようです。 何か解決する方法はありますでしょうか。 ちなみに 私が使っているのはwindows7です。 どうかお願いします。

  • プログラミングのopenglで困っています.

    OpenGlの超初心者です. openglで,円を一つ作ってあるsampleプログラムを拾ってきたのですが, 円をもう一つ,別の座標で作りたいのですが,以下のプログラムをどのように編集すればいいですか? 誰か助けてください. ========================================== #include <GLUT/glut.h> #include "glut.h" #include <math.h> //--初期化処理------------------------------------------------------------------ void myinit(void){ glClearColor(1.0f, 1.0f, 1.0f, 1.0f);//背景色の設定(R,G,B,ALPHA) 0.0-1.0の範囲で } //--描画内容-------------------------------------------------------------------- void display(void){ float x1,y1,x2,y2; float th1,th2; float th1_rad, th2_rad; float hankei = 0.1; glClear(GL_COLOR_BUFFER_BIT);//画面全体を背景色で塗りつぶす glMatrixMode(GL_MODELVIEW); glLoadIdentity(); //単位行列を行列スタックに読み込む glColor3f(0.0f, 0.0f, 0.0f);//頂点カラーの指定( R, G, B すべてが1.0fなら白) for (th1 = 0.0; th1 <= 360.0; th1 = th1 + 10.0){ th2 = th1 + 10.0; th1_rad = th1 / 180.0 * 3.1415926; // 「度」を「ラジアン」に直す th2_rad = th2 / 180.0 * 3.1415926; x1 = hankei * cos(th1_rad); y1 = hankei * sin(th1_rad); x2 = hankei * cos(th2_rad); y2 = hankei * sin(th2_rad); glBegin(GL_LINES);//glBegin(GL_LINES)とglEnd()の間に glVertex2f( x1, y1 ); //描画したい直線の頂点を並べる glVertex2f( x2, y2 ); glEnd(); //ここまでで,ひとつのオブジェクトの宣言がおわる } glFlush();//OpenGLで実際に描画を行う } //--再描画---------------------------------------------------------------------- void myReshape(GLsizei w, GLsizei h){ glViewport(0,0,w,h); //ウィンドウ全体をビューポートにする glMatrixMode(GL_PROJECTION); glLoadIdentity();//単位行列を行列スタックに読み込む glOrtho(-1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f); } //--メイン関数------------------------------------------------------------------ int main(int argc, char **argv){ glutInitWindowPosition(100, 100); //(図形が描画される)ウィンドウ位置の設定 glutInitWindowSize(600, 600); //(図形が描画される)ウィンドウサイズの設定 glutInit(&argc, argv);//環境の初期化 glutInitDisplayMode(GLUT_RGBA|GLUT_SINGLE); //表示モードの設定 glutCreateWindow("kadai"); //ウィンドウを開く glutDisplayFunc(display); //図形表示関数の指定 myinit(); glutReshapeFunc(myReshape); //座標軸・ビューポート設定関数の指定 glutMainLoop();//無限ループ return 0; } ==========================================

  • BCCDeveloperでのOpenGLのコンパイルについて

    環境は BorlandC++Compiler Version 5.5 Developer Version1.2.21 GLUT Version 3.7 OS WindowsXP PC NEC LL730/7 です。 GLUTをインストールし、次のプログラムをコンパイルしたのですが、コンパイルエラーは出なかったのですが、実行時に 「プロシージャ エントリ ポイント _glutCreateWindow@4がダイナミック リンク ライブラリ GLUT32.DLL から見つかりませんでした。」 と言うエラーメッセージが出ました。 原因がわかる方がいれば教えてください。 #include <GL/glut.h> void display(void) { } int main(int argc, char *argv[]) { glutInit(&argc, argv); glutCreateWindow(argv[0]); glutDisplayFunc(display); glutMainLoop(); return 0; }

  • OpenGLの惑星プログラム

    /* p4-MovingPlanet.c * Animation for a solar system ( see p3-planet.c ) using by glutTimerFunc(). */ #include <stdlib.h> #include <GL/glut.h> #include <math.h> int year = 0, day = 0; int samplingTime = 50; void myKeyboard(unsigned char key, int x, int y) { if ( key == 27) exit (0); } void myDisplay(void) { glClear(GL_COLOR_BUFFER_BIT); glColor3d(1.0, 1.0, 1.0); glPushMatrix(); glutWireSphere(1.0, 20, 16); // sun glRotated((double)year, 0.0, 1.0, 0.0); glTranslated(3.0, 0.0, 0.0); glRotated((double)day, 0.0, 1.0, 0.0); glutWireSphere(0.2, 10, 8); // planet glPopMatrix(); glutSwapBuffers(); } void myInit(char *progname) { int width = 500, height = 500; glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize(width, height); glutInitWindowPosition(0, 0); glutCreateWindow(progname); glClearColor(0.0, 0.0, 0.0, 0.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(90.0, (double)width / (double)height, 0.1, 20.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0.0, 1.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); } void myTimer(int value) { if (value==1) { glutTimerFunc(samplingTime,myTimer,1); year = (year+1) % 360; day = (day+5) % 360; glutPostRedisplay(); } } int main(int argc, char** argv) { glutInit(&argc, argv); myInit(argv[0]); glutKeyboardFunc(myKeyboard); glutTimerFunc(samplingTime, myTimer, 1); glutDisplayFunc(myDisplay); glutMainLoop(); return 0; } このプログラムを改良して太陽系(水星~天王星)のプログラムを作成したいです。何を加えればいいんですか?教えてください><よろしくお願いします!!!

  • OpenGLでのプログラミングについて質問です

    http://www.wakayama-u.ac.jp/~tokoi/opengl/libglut.html#7.2 上記URLのソースについて幾つか質問です。 1.以下の用に記述すると、何故以前のラバーバンドを消去することになるのでしょうか? if (rubberband) { /* 以前のラバーバンドを消す */ glVertex2iv(point[pointnum - 1]); glVertex2iv(savepoint); } 2.以下の部分の、staticはどういう役割をしているのでしょうか? void motion(int x, int y) { static GLint savepoint[2]; /* 以前のラバーバンドの端点 */ 3.メインは、以下のように記述されているのですが、OpenGLは通常のCプログラミングと違い、上から下に順次処理されて行っているだけでなく、見えない部分でも何か処理をやっているようなのですが、どういう順序でこのmainは処理されているのでしょうか? int main(int argc, char *argv[]) { glutInitWindowPosition(100, 100); glutInitWindowSize(320, 240); glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGBA); glutCreateWindow(argv[0]); glutDisplayFunc(display); glutReshapeFunc(resize); glutMouseFunc(mouse); glutMotionFunc(motion); init(); glutMainLoop(); return 0; } あと、 http://www.wakayama-u.ac.jp/~tokoi/opengl/libglut.html#6.1 に書かれている、 glOrtho(-w / 200.0, w / 200.0, -h / 200.0, h / 200.0, -1.0, 1.0); という関数の意味がよく分かりません。 どなたか、どれか一つだけでも良いので解答をお願いします。

  • Windows8+OpenGLで未処理の例外エラー

    Windows8 Pro のマシンで OpenGL を使うため、glut をインストールし、 簡単なサンプルをコンパイルして実行したところ、 「ユーザーコールバック中に未処理の例外エラーが発生しました」 というエラーを吐いて止まってしまいました。 統合環境は Visual C++2010 Express を利用しています。 サンプルプログラムは、以下の通りです。 #include <GL/glut.h> void display(void) { glClearColor(1.0, 1.0, 1.0, 1.0); glClear(GL_COLOR_BUFFER_BIT); glFlush(); } int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGBA); glutInitWindowSize(640,480); glutCreateWindow(”window”); glutDisplayFunc(display); glutMainLoop(); return 0; } glut は様々なサイトで紹介されている方法通りに、 公式ページにて必要なファイル (32bit版) をダウンロードし、 glut.h を C:\Program Files (x86)\Microsoft Visual Stdio 10.0\VC\include\GL\ に、 glut32.lib を C:\Progma Files (x86)\Microsoft Visual Stdio 10.0\VC\lib\ に glut32.dll を C:\Windows\SysWOW64\ にコピーしました。 glut の代わりに freeglut も試してみたのですが、同様のエラーで止まってしまいました。 使用しているマシンは Surface Pro で ディスプレイアダプターは、 Intel(R) HD Graphics 4000 です。 ネットでいろいろ調べて Windows8 にインストールしている事例もちらほら見かけたので、 Windows8 でも動くとは思うんですが、どうにもうまくいきません。 dll が Windows8 に対応していないのか、Surface だから駄目なのか、検討がつきません。 原因をご存知の方がいましたら、どうか詳しく教えていただけないでしょうか? よろしくお願いします。

  • 内定をもらった会社から課題がだされてしまいました。

    正直まったくもってソースコードをいじった事がありません。なのでわかる方いたらぜひ回答お願いします。 ロボットアームが自動的に動くようにしたいんですけどそのソースコードがわからなくてわかるかたいたら教えてください。 #include <stdlib.h> #include <math.h> #include <GL/glut.h> /* * 直方体を描く */ static void myBox(double x, double y, double z) { GLdouble vertex[][3] = { { -x, -y, -z }, { x, -y, -z }, { x, y, -z }, { -x, y, -z }, { -x, -y, z }, { x, -y, z }, { x, y, z }, { -x, y, z } }; const static int face[][4] = { { 0, 1, 2, 3 }, { 1, 5, 6, 2 }, { 5, 4, 7, 6 }, { 4, 0, 3, 7 }, { 4, 5, 1, 0 }, { 3, 2, 6, 7 } }; const static GLdouble normal[][3] = { { 0.0, 0.0,-1.0 }, { 1.0, 0.0, 0.0 }, { 0.0, 0.0, 1.0 }, {-1.0, 0.0, 0.0 }, { 0.0,-1.0, 0.0 }, { 0.0, 1.0, 0.0 } }; const static GLfloat red[] = { 0.8, 0.2, 0.2, 1.0 }; int i, j; /* 材質を設定する */ glMaterialfv(GL_FRONT, GL_DIFFUSE, red); glBegin(GL_QUADS); for (j = 0; j < 6; ++j) { glNormal3dv(normal[j]); for (i = 4; --i >= 0;) { glVertex3dv(vertex[face[j][i]]); } } glEnd(); } /* * 円柱を描く */ static void myCylinder(double radius, double height, int sides) { const static GLfloat yellow[] = { 0.8, 0.8, 0.2, 1.0 }; double step = 6.28318530717958647692 / (double)sides; int i = 0; /* 材質を設定する */ glMaterialfv(GL_FRONT, GL_DIFFUSE, yellow); /* 上面 */ glNormal3d(0.0, 1.0, 0.0); glBegin(GL_TRIANGLE_FAN); while (i < sides) { double t = step * (double)i++; glVertex3d(radius * sin(t), height, radius * cos(t)); } glEnd(); /* 底面 */ glNormal3d(0.0, -1.0, 0.0); glBegin(GL_TRIANGLE_FAN); while (--i >= 0) { double t = step * (double)i; glVertex3d(radius * sin(t), -height, radius * cos(t)); } glEnd(); /* 側面 */ glBegin(GL_QUAD_STRIP); while (i <= sides) { double t = step * (double)i++; double x = sin(t); double z = cos(t); glNormal3d(x, 0.0, z); glVertex3f(radius * x, height, radius * z); glVertex3f(radius * x, -height, radius * z); } glEnd(); } /* * 地面を描く */ static void myGround(double height) { const static GLfloat ground[][4] = { { 0.6, 0.6, 0.6, 1.0 }, { 0.3, 0.3, 0.3, 1.0 } }; int i, j; glBegin(GL_QUADS); glNormal3d(0.0, 1.0, 0.0); for (j = -5; j < 5; ++j) { for (i = -5; i < 5; ++i) { glMaterialfv(GL_FRONT, GL_DIFFUSE, ground[(i + j) & 1]); glVertex3d((GLdouble)i, height, (GLdouble)j); glVertex3d((GLdouble)i, height, (GLdouble)(j + 1)); glVertex3d((GLdouble)(i + 1), height, (GLdouble)(j + 1)); glVertex3d((GLdouble)(i + 1), height, (GLdouble)j); } } glEnd(); } /* * 画面表示 */ static void display(void) { const static GLfloat blue[] = { 0.2, 0.2, 0.8, 1.0 }; /* 球の色 */ const static GLfloat lightpos[] = { 3.0, 4.0, 5.0, 1.0 }; /* 光源の位置 */ /* 画面クリア */ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /* モデルビュー変換行列の初期化 */ glLoadIdentity(); /* 光源の位置を設定 */ glLightfv(GL_LIGHT0, GL_POSITION, lightpos); /* 視点の移動(シーンの方を奥に移す)*/ glTranslated(0.0, 0.0, -10.0); /* シーンの描画 */ myGround(-2.0); /* 地面    */ glTranslated(0.0, -1.8, 0.0); myCylinder(1.0, 0.2, 16); /* 土台    */ glTranslated(0.0, 1.0, 0.0); myBox(0.3, 1.0, 0.3); /* 1番目の腕 */ glTranslated(0.0, 1.0, 0.0); glRotated(90.0, 1.0, 0.0, 0.0); myCylinder(0.4, 0.4, 16); /* 関節    */ glTranslated(0.0, 0.0, -1.0); myBox(0.3, 0.3, 1.0); /* 2番目の腕 */ glTranslated(0.0, 0.0, -1.0); glMaterialfv(GL_FRONT, GL_DIFFUSE, blue); glutSolidCube(0.9); /* ハンド   */ glFlush(); } static void resize(int w, int h) { /* ウィンドウ全体をビューポートにする */ glViewport(0, 0, w, h); /* 透視変換行列の指定 */ glMatrixMode(GL_PROJECTION); /* 透視変換行列の初期化 */ glLoadIdentity(); gluPerspective(30.0, (double)w / (double)h, 1.0, 100.0); /* モデルビュー変換行列の指定 */ glMatrixMode(GL_MODELVIEW); } static void keyboard(unsigned char key, int x, int y) { /* ESC か q をタイプしたら終了 */ if (key == '\033' || key == 'q') {

専門家に質問してみよう