最終更新: mikk_ni3_92 2008年11月21日(金) 18:26:11履歴
現在地 >> メニュー >> 発展編02 >> 発展編02::セレクションモード >> 発展編02::まとめコード1_1
関連:発展編02::まとめコード1_2
関連:発展編02::まとめコード1_2
#include <iostream> #include <vector> #include <climits> #include <GL/glut.h> //-------- 各種外部変数 ---------// enum{RED_POLY=1,GREEN_POLY,BLUE_POLY,SPHERE}; //名前(ID) const int SelBuffSize = 64; //セレクションバッファのサイズ //------------ プロトタイプ宣言 -------------------// void display(); void reshape(int w, int h); void mouse(int button, int state,int x, int y); void Draw(); void ProcSelBuff(int x,int y); void ReadSelectionBuff(GLuint hits,std::vector<unsigned int> &buff); //---------- OpenGLの初期設定 ------------// void GLUT_INIT() { glutInitDisplayMode(GLUT_RGBA| GLUT_DOUBLE | GLUT_DEPTH); glutInitWindowSize(640,480); glutCreateWindow("Selection Mode"); } void GLUT_CALL_FUNC() { glutDisplayFunc(display); glutReshapeFunc(reshape); glutMouseFunc(mouse); } void MY_INIT() { glClearColor(1.0, 1.0, 1.0, 1.0); glEnable(GL_DEPTH_TEST); } //--------- メイン関数 -----------// int main(int argc, char **argv) { glutInit(&argc,argv); GLUT_INIT(); GLUT_CALL_FUNC(); MY_INIT(); glutMainLoop(); return 0; } //------------ ここから各種コールバック ----------------// void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); gluLookAt(1.0, 2.0, 4.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); Draw(); glutSwapBuffers(); } void reshape(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 ); } void mouse(int button, int state,int x, int y) { if( button == GLUT_LEFT_BUTTON && state == GLUT_DOWN){ ProcSelBuff(x,y); } } void ProcSelBuff(int x, int y) { //セレクションバッファの用意 std::vector<unsigned int> Selectbuff(SelBuffSize); glSelectBuffer(SelBuffSize, &Selectbuff[0]);//OpenGLにバッファサイズと格納場所を通知 //セレクトモードでの設定用にビューポート取得 static int viewport[4]; glGetIntegerv(GL_VIEWPORT, viewport); //レンダリングモードを切り替える(→セレクションバッファに書き込む) glRenderMode(GL_SELECT); //-------- 一時的に視体積を設定し、描画する--------// //視体積の設定 glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); //gluPickMatrix(x,viewport[3]-y,5.0,5.0, viewport); gluPerspective( 30.0,(double)viewport[2]/(double)viewport[3] , 1.0, 100.0 ); //描画(セレクションバッファに書き込む) glMatrixMode( GL_MODELVIEW ); display(); glMatrixMode(GL_PROJECTION); glPopMatrix(); //もとに戻す glMatrixMode( GL_MODELVIEW ); static int hits; hits = glRenderMode(GL_RENDER); ReadSelectionBuff(hits, Selectbuff); } void ReadSelectionBuff(GLuint hits,std::vector<unsigned int> &buff) { if(hits <= 0){ std::cout << "0 hit...\n"; return; } std::cout << hits << " hits !!\n"; std::cout << "----------------\n"; int id=0; unsigned int count = 0; for(unsigned int loop = 0; loop < hits;++loop) { std::cout << "階層の深さ: " <<buff[id]<<"\n"; std::cout << "minimum Z: "<<static_cast<double>(buff[id+1])/UINT_MAX<<"\n"; //[0,1]にスケール変換 std::cout << "maximum Z: "<<static_cast<double>(buff[id+2])/UINT_MAX<<"\n"; std::cout << "ID:"<<buff[id+3]; for(count = 1; count < buff[id];++count) { std::cout <<"-"<< buff[id+count+3]; } std::cout << "\n"; id += 3+count; std::cout << "----------------\n"; } } //-------- ここから各種関数 -------------// void Draw() { glInitNames(); glPushName(0); glColor3f(1,0,0); glLoadName(RED_POLY); glRectf(-0.5,0.5,0.5,-0.5); //1つめ glColor3f(0,1,0); glPushMatrix(); glTranslated(0,0,-0.5); glLoadName(GREEN_POLY); glRectf(0,1,1,-0.4); //2つめ glPushMatrix(); glPushName(SPHERE); //階層化。ID は 「2-4」 glTranslated(0,1,0); glColor3f(1,1,0); glutSolidSphere(0.2,30,30); glPopName(); glPopMatrix(); glPopMatrix(); glColor3f(0,0,1); glPushMatrix(); glTranslated(0,0,-0.1); glLoadName(BLUE_POLY); glRectf(-1,0.4,1,-0.4); //3つめ glPopMatrix(); }