• 締切済み

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++ です。

みんなの回答

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

OpenGL I: Quick Start http://msdn2.microsoft.com/en-us/library/ms970745.aspx OpenGL VII: Scratching the Surface of Texture Mapping http://msdn2.microsoft.com/en-us/library/ms970772.aspx などが参考になりそうです 上記は MFCベースのサンプルになります Jpegファイルを読み込むライブラリーなどからBITMAPハンドルを取得できれば テクスチャマッピングが可能なように思います Jpegの読み込みには GDI+などを使ってみてはいかがでしょう

usatan2
質問者

お礼

回答ありがとうございます。 紹介いただいたページ見ましたが、難しくて、すぐには理解できませんが、参考にさせていただきます。 ありがとうございます。

関連する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

  • 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について質問があります。

    底から見上げているように立方体がみえるように実行したいんですけどここからどうしていいかわからなくてわかる方いたら教えてください。お願いします。 #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の超初心者です. 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; } ==========================================

  • お願いします。

    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のグラフ問題

    下のソースを改造して 各wに対しdeltafuncを満たすhの値だけ線(点)をひくグラフを表示させたいのですが。 deltafunc=700.-50000*(exp(-(w-500)*(w-500)/bfac/bfac)/sqrt(3.1415)/bfac);のグラフ どうしてもうまくいきません(真っ黒になってしまいます)詳しい方アドバイスをいただけないでしょうか。 void show_picture(void) { glClear(GL_COLOR_BUFFER_BIT); for(iafac=0;iafac<0;iafac++)afac=0.001+0.05*iafac; for(h=height-1; h>=0; h--){ for(w=0; w<wide; w++){ r=0; bfac=1000*afac; deltafunc=700.-50000*(exp(-(w-500)*(w-500)/bfac/bfac)/sqrt(3.1415)/bfac); if((h==deltafunc)||w==500||w==0||w==1000||h==1||h==760) r=0; g=r; b=r; glColor3ub((GLubyte) r,(GLubyte) g,(GLubyte) b); glBegin(GL_POINTS); glVertex2d(w-wide/2,-h+height/2); glEnd(); } } glutSwapBuffers(); glFlush(); }

  • cygwinでopenGL

    cygwinでopenGLが出来ません>< まず、私がやった設定を書いてみます。 学校で使用している教科書に指定されているように、 実行用DLLファイル[opengl32.dll][glu32.dll][glut32.dll]の3つを\WINDOWS\system32に入れました。(glut32.dll以外は元々ありました) ヘッダファイル[gl.h][glu.h][glut.h]の3つを\cygwin\usr\include\w32api\GLに入れました。(glut.h以外は元々あり、[glext.h]というのもありました) 開発ライブラリとして[opengl32.lib][glu32.lib][glut32.lib]を入れるように書いてあり、入れる場所はおそらく\cygwin\lib\w32apiだと思うんですけど、[libopengl32.a][libglu32.a][libglut32.a]なるものが既に存在しました。これは同じ物とみなしてよろしいのでしょうか? 次に、[gcc ●●.c -DWIN32 -lglut32 -lglu32 -lopengl32]とコンパイルしてみた所、エラーが大量に出ました。コンパイル方法が間違っているのでしょうか? 以前にJAVAを学習するときに、環境変数を変えたんですけれど、それが影響しているのでしょうか? 質問多くて、しかもややこしくてすみません。

  • OpenGLがコンパイルできません。

    OpenGLをコンパイルしようとしてCygwinで 「gcc -o sample (プログラムの名前).c -I/usr/local/include -lglut32 -lglu32 -lopengl32」 と入力すると 「In file included from /usr/include/GL/glut.h:132, from (プログラムの名前).c:1: /usr/include/w32api/GL/glu.h:230: error ハクヒ。・ィ・鬘シ before '*' taken」 と表示されてコンパイルできません。「ハクヒ。・ィ・鬘シ」の部分は文字化けだと思います。このエラーメッセージから何が問題か分かる方がいらっしゃいましたら回答していただけると嬉しいです。CygwinはNetinstallからすべてのものをインストールしたので足りないものはないと思います。よろしくお願いします。

  • 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地図なので、どうしても後ろのポリゴンを書かなくてもよいように判定をしたいのです。 どなたかどのポリゴンが視覚に入るか判定できるアルゴリズムのようなものをご存知でしたらご教授いただけるでしょうか?

専門家に質問してみよう