• ベストアンサー

CGプログラミングで前のポリゴンに隠れているポリゴンをレンダリングしない方法はありますか?

CGのレンダリングの質問です。 カメラが座標(-10,0,0)から(0,0,0)を見ています。 そのときに3角形AとBがあり、それぞれの頂点が: A(0,0,0)(0,0,10)(0,10,0) B(2,0,0)(2,0,3)(2,3,0) となってBがAに隠れています。 簡単なOPENGLのプログラムでは: glBegin(GL_TRIANGLES); // draws triangle glVertex3f(0.0f, 0.0f, 0.0f); glVertex3f(0.0f, 0.0f, 10.0f); glVertex3f(0.0f, 10.0f, 0.0f); glEnd(); glBegin(GL_TRIANGLES); // draws triangle glVertex3f(1.0f, 0.0f, 0.0f); glVertex3f(1.0f, 0.0f, 5.0f); glVertex3f(1.0f, 5.0f, 0.0f); glEnd(); gluLookAt(-10.0,0.0,0.0, //Where should the camera locate 0.0,0.0,0.0,//Where to look at 0.0,0.0,1.0); //Which is up in CG ... となるのですが。 今回のようにポリゴンが2つで済む時にはすべてをレンダリングしてもなんともないのですが、私のプログラムでは複雑に配置されたポリゴンがたくさんある3D地図なので、どうしても後ろのポリゴンを書かなくてもよいように判定をしたいのです。 どなたかどのポリゴンが視覚に入るか判定できるアルゴリズムのようなものをご存知でしたらご教授いただけるでしょうか?

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

  • ベストアンサー
  • titokani
  • ベストアンサー率19% (341/1726)
回答No.4

もうすこし考えてみました。 ・すべてのポリゴンについて、2Dに変換して、ついでにZとバウンディングボックスも計算する ・ポリゴンをZでソート ・手前のポリゴンから2Dの当り判定。このとき、完全に隠れるポリゴンはリストから削除 ・残ったポリゴンをZバッファを使って描画 という感じでどうでしょうか?

その他の回答 (3)

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.3

OpenGLもDirectXもつかわずに3Dプログラミングをしているのでしょうか? しかし、ポリゴンとポリゴンが交差(突き刺さっている感じ)する立体を 描きたいと思ったら、結局Zバッファの類は実装しないといけないような。 だったら、最初からZバッファ+Zソートあたりで作ってしまったほうが 早いかなと思います。 ポリゴンの重なり判定の高速化という話なら、バウンディングボックスとかを 使うことによって計算量は減らせるでしょうが、う~ん、どうでしょうね。

  • BearCave
  • ベストアンサー率20% (189/909)
回答No.2

OpenGLを使っているのなら、その処理はOpenGLがやってくれるはずですが。三角形Aは、Bに完全に隠れていればレンダリングされず、描画スピードにも影響されないと思いますよ。実際に大きな3D地図で実験してみれば一目瞭然だと思います。カメラの前にポリゴンを置いて、その奥にある巨大な3Dモデルを遮れば、フレームレートは飛躍的に上がります。

maruyl
質問者

お礼

OpenGLを使っているわけでないのです。ロボットの目が3D地図の中を移動するようなことをやっているので、ロボットの目の視界に3D地図中のどのポリゴンが見えるかな、といった判定ができるアルゴリズムを探しています。 そのOpenGLのコードのくだりはそういう風に説明した方が分かりやすいかな、と思っただけでした。(たぶん回答してくれるのはCGをやっている人かなと予想したのですが…) 説明が悪くてすみませんでした。とにかくご回答ありがとうございました!

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.1

全てのポリゴンを総当りでチェックすると、結構な計算量ですよ。 素直にZバッファでやったほうが効率がいいかも。GPUのアクセラレーションも期待できそうだし。 真面目にやるなら ・2Dに投影して重なり判定。 ・重なっていた場合、3Dでの交差判定 という感じでしょうか。

maruyl
質問者

補足

2Dに投影して重なり判定をしているのですが、ご指摘の通り相当の計算量になるのです。そこで投影する前になにかポリゴンの集合にフィルターをかけることができないかな、という質問なのです…ポリゴンの法線ベクトルとカメラ視界との角度を利用したりしてみているのですが、なかなかすっぱりとは減ってくれません。 なにか心当たりがあればよろしくお願いします。

関連するQ&A

  • OPENGLで

    OPENGLで、立体の三角錐を書いたのですが、 底抜けの三角錐になってしまいました。 プログラムは、 GLdouble p0[]={0.0,0.0,0.0}; GLdouble p1[]={1.0,0.0,0.0}; GLdouble p2[]={0.0,1.0,0.0}; GLdouble p3[]={0.0,0.0,1.0}; glBegin(GL_POLYGON); // ストリップ設定 glColor3d(1.0, 0.0, 0.0); // 赤 glVertex3dv(p0); glVertex3dv(p2); glVertex3dv(p1); glColor3d(0.0, 1.0, 0.0); // 青 glVertex3dv(p0); glVertex3dv(p1); glVertex3dv(p3); glColor3d(0.0, 0.0, 1.0); // 緑 glVertex3dv(p0); glVertex3dv(p3); glVertex3dv(p2); glColor3d(1.0, 1.0, 1.0); // 白 glVertex3dv(p1); glVertex3dv(p2); glVertex3dv(p3); glEnd(); glPopMatrix(); です。白の部分の底がかけていないです。。。 アドバイスくださいm(_ _)m

  • 多角形ポリゴン同士の衝突判定をしたいのですが。。。

    3次元上に2つの多角形ポリゴンをCGで描きました。この2つの物体の衝突判定を 行いたいのですが、数学では、このような問題はどのように解くのでしょうか? もう少し詳しく述べると、多角形は三角形の集合で描かれています。 2つの多角形をA、Bとすれば、Aをなす三角形とBをなす三角形が 重なる、もしくは、交わらなければAとBは衝突していないことになると思うのですが、どうでしょうか? 2つの三角形が衝突していないということを表す式、考え方がありましたら 教えてください。また、それ以外にベストと思われる式、考え方がありましたら 教えてください。

  • プログラミングの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; } ==========================================

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

    正直まったくもってソースコードをいじった事がありません。なのでわかる方いたらぜひ回答お願いします。 ロボットアームが自動的に動くようにしたいんですけどそのソースコードがわからなくてわかるかたいたら教えてください。 #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') {

  • 見たことのないエラー

    gccを使い、ブロック崩しのプログラムを作っています。 Linuxの環境だと、コンパイルもうまくいくのですが、 cygwinでコンパイルしようとするとundefined reference toというエラーがたくさん出てきます。 助けてください。 ソースは以下の通りです。 #include <GL/glut.h> #include <stdlib.h> #include <stdio.h> double xx; double ballx,bally; int xv,yv; double bwidth, bheight; double bposx, bposy; double pposx, pposy; double pwidth,pheight; double by,bx; int i,j; int delblock[5][9]= {{0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}}; void timer(int value) { ballx=ballx+xv;// X方向 if((ballx>100)||(ballx<-100)) xv*=-1;//反転、枠にぶつかった時 xv = xv * (-1) bally=bally+yv;// Y方向 if(bally>100) yv*=-1;// 反転、枠にぶつかった時 if(bally<-130) yv*=-1;//exit(0); if((xx<ballx) && ((xx+pwidth)>ballx) && (bally>pposy) && (bally<(pposy+pheight))){ yv*=-1;//反転、打ち返した時 } for(j=0; j<5; j++){ for(i=0; i<9; i++){ if(delblock[j][i]==0){ if((ballx>=bposx+bx) && (ballx<=bposx+bwidth+bx) && (bally>=bposy+bheight+by)){ if(bally<=bposy+bheight+by){yv*=-1;delblock[j][i]=1;} } else if((ballx>=bposx+bx) && (ballx<=bposx+bwidth+bx) && (bally<=bposy+by)){ if(bally>=bposy+by){yv*=-1;delblock[j][i]=1;} } else if((bally>=bposy+by) && (bally<=bposy+bheight+by) && (ballx<=bposx+bx)){ if(ballx>=bposx+bx){xv*=-1;delblock[j][i]=1;} } else if((bally>=bposy+by) && (bally<=bposy+bheight+by) && (ballx>=bposx+bwidth+bx)){ if(ballx<=bposx+bwidth+bx){xv*=-1;delblock[j][i]=1;} } } bx=bx+21; } bx=0; by=by+11; } by=0; glutPostRedisplay(); glutTimerFunc(10 , timer , 0); } void display(void) { glClear(GL_COLOR_BUFFER_BIT); ////ボール//// glColor3d(1.0, 1.0, 1.0); glPointSize(10); glBegin(GL_POINTS); glVertex2f(ballx/100.0 , bally/100.0); glEnd(); ////打ち返す台//// glColor3d(0.2, 0.2, 0.8); glBegin(GL_POLYGON); glVertex2d((pposx+xx)/100, pposy/100); glVertex2d((pposx+xx)/100, (pposy+pheight)/100); glVertex2d((pposx+pwidth+xx)/100, (pposy+pheight)/100); glVertex2d((pposx+pwidth+xx)/100, pposy/100); glEnd(); ////ブロックを増やす//// /*for(i=0; i<9; i++){ glBegin(GL_POLYGON); glVertex2d((bposx+tx)/100, bposy/100); glVertex2d((bposx+tx)/100, (bposy+bheight)/100); glVertex2d((bposx+bwidth+tx)/100, (bposy+bheight)/100); glVertex2d((bposx+bwidth+tx)/100, bposy/100); glEnd(); tx=tx+21.0; }*/ //////////////////////// ////ブロックを増やす2//// for(j=0; j<5; j++){ for(i=0; i<9; i++){ if(delblock[j][i]==0){ glBegin(GL_POLYGON); glVertex2d((bposx+bx)/100, (bposy+by)/100); glVertex2d((bposx+bx)/100, (bposy+bheight+by)/100); glVertex2d((bposx+bwidth+bx)/100, (bposy+bheight+by)/100); glVertex2d((bposx+bwidth+bx)/100, (bposy+by)/100); glEnd(); } bx=bx+21; } bx=0; by=by+11; } by=0; //////////////////////// glutSwapBuffers(); glFlush(); } void key(unsigned char key , int x , int y) { if((key=='z')&&(xx>=-98)){ xx=xx-4; } if((key=='x')&&(xx<=78)){ xx=xx+4; } } int main(int argc, char *argv[]) { xx=0.0; ballx=30.0; bally=-50.0; xv=1; yv=1; bwidth=20.0; bheight=10.0; bposx=-95.0; bposy=-0.0; pwidth=20; pheight=5; pposx=0; pposy=-95; bx=0; by=0; glutInitWindowPosition(100, 100); glutInitWindowSize(640, 480); glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glutCreateWindow(argv[0]); glutDisplayFunc(display); glutKeyboardFunc(key); glutTimerFunc(10 , timer , 0); glutMainLoop(); return 0; }

  • 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; }

  • OpenGLで写真を表示したい

    OpenGLで書いた四角の中に写真を表示したいのですが、どうやって良いのか良くわかりません。 具体的には、 glNewList(i*2,GL_COMPILE); glBegin(GL_LINE_LOOP); glColor3fv(col[i]); glVertex2i(xpos[i]-radiusx[i],ypos[i]-radiusy[i]); glVertex2i(xpos[i]+radiusx[i],ypos[i]-radiusy[i]); glVertex2i(xpos[i]+radiusx[i],ypos[i]+radiusy[i]); glVertex2i(xpos[i]-radiusx[i],ypos[i]+radiusy[i]); glEnd(); glEndList(); で描画した四角形の中に radiusx[i]*2 , radiusy[i]*2 の大きさに縮小した i番目のJpeg写真(640x480)を書きたいのです。 現在、以下のファイルをインクルードしています。 #include <windows.h> #include <gl\gl.h> #include <gl\glu.h> #include <gl\glaux.h> #include <stdio.h> 追加すべきインクルードファイル、DLLなどお教えください。 なお、開発環境はフリーの Visual Windows for BC++ です。

  • Openglでテクスチャを透明にする方法について

    Microsoft Visual C++ 2008 Express Edition を使ってtgaファイルをテクスチャとして取り込んで表示するプログラムを作っております. Openglのスポットライト機能を使ってテクスチャを照らしたいと考えています. しかし,どこかのプログラミングがおかしいのか,テクスチャの張り付けに指定された座標4点付近にライトが当たったときでないとテクスチャが光りません. 方法がわからなかったので,テクスチャを大きな球体の内部に配置し,球体の内部からスポットライトでテクスチャ方向を照らすようにしました. 添付した図の左下にスポットライトが白っぽく見えているのは,この大きな球体の内部を照らした光となっています. このように球体内部がスポットライトで照ったので,後はテクスチャさえ透明にすることができれば,間接的にテクスチャをスポットライトで照らしているような感じで見えるのではないかと考えています. しかし肝心のテクスチャを透明にする方法が全くわかりません.(´・ω・) アルファ値というのを使ったり,ブレンド?を使ったりしたらできるのでは,と思ったのですが,どこにどうプログラムしたらいいのかの具体的な説明がなかったので,わかりませんでした(´・ω・) テクスチャを透かして,奥の大きな球体内部を照らすことができれば,その明るさで半透明の手前のテクスチャもうっすら光るのではないかと考えています. わかる方,教えてください. 本当に困ってます;w; 今のプログラム内部のテクスチャの部分は以下に書きます. よろしくお願いします><; void initTexture(void) { FILE *fp; int x, z; /* texture file open */ if((fp=fopen("ougonzan.tga", "rb"))==NULL){ fprintf(stderr, "texture file cannot open\n"); return; } fseek(fp, 18, SEEK_SET); for(x=0; x<TEX_HEIGHT; x++){ for(z=0; z<TEX_WIDTH; z++){ image[x][z][2]=fgetc(fp);/* B */ image[x][z][1]=fgetc(fp);/* G */ image[x][z][0]=fgetc(fp);/* R */ image[x][z][3]=fgetc(fp);/* alpha */ } } fclose(fp); } void displayTexPolygon(void) { glEnable(GL_TEXTURE_2D); glBegin(GL_TRIANGLE_FAN); glTexCoord2f(0.0, 0.0); glVertex3f(-16.0,-12.0, 5.0); //左下 glTexCoord2f(0.0, 1.0); glVertex3f(-16.0, 12.0, 5.0); //左上 glTexCoord2f(1.0, 1.0); glVertex3f( 16.0, 12.0, 5.0); //右上 glTexCoord2f(1.0, 0.0); glVertex3f( 16.0,-12.0, 5.0); //右下 glEnd(); glDisable(GL_TEXTURE_2D); } void display(void) { static const float floor_Color[] = { 1.0, 1.0, 1.0, 1.0 }; static GLfloat red[] = { 0.8, 0.2, 0.2, 1.0 }; static GLfloat yellow[] = { 0.8, 0.8, 0.2, 0.0 }; static GLfloat white[] = { 1.0, 1.0, 1.0, 0.0 }; static float spin=0.0; glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glLoadIdentity(); //gluLookAt( 視点の位置x,y,z, 視界の中心位置の参照点座標x,y,z, 視界の上方向のベクトルx,y,z); gluLookAt( 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0); // 内側から //集中型スポットライト //glLightfv(光源番号, パラメータ, パラメータの値); glLightfv(GL_LIGHT0, GL_POSITION, SpotLight.pos); //光源の位置[pos] glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, SpotLight.spotDir); glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, SpotLight.spotCutoff); glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, SpotLight.spotExp); //巨大な球体 glPushMatrix(); glTranslated(0.0, 0.0, 7); glMaterialfv(GL_FRONT, GL_DIFFUSE, white); glutSolidSphere(60, 10000, 10000); glPopMatrix(); glPushMatrix(); glPopMatrix(); glPushMatrix(); glClearColor(0.0, 0.0, 1.0, 0.5); glTranslatef(0.0, 0.0, 45.0); //テクスチャの位置設定 // glRotatef(spin, 0.0, 1.0, 0.0); //テクスチャの回転 glColor4f(1.0, 0.0, 0.0, 0.0); //テクスチャの色設定 displayTexPolygon(); } spin+=1.0; glPopMatrix(); glFlush(); glutSwapBuffers(); }

  • お願いします。

    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; }