最終更新: mikk_ni3_92 2008年11月22日(土) 15:59:32履歴
現在地 >> メニュー >> 発展編02 >> 発展編02::セレクションモード >> 発展編02::まとめコード1_2
関連:発展編02::まとめコード1_1
関連:発展編02::まとめコード1_1
#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("Pick up"); } 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+viewport[1],3.0,3.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"; unsigned int MinZ = UINT_MAX; unsigned int NameID = -1; bool status = false; int id = 0; unsigned int count = 0; for(unsigned int loop = 0; loop < hits;++loop) { std::cout << "階層の深さ: " <<buff[id]<<"\n"; //より手前のZ値を格納 if(MinZ > buff[id+1]){ status = true; MinZ = buff[id+1]; NameID = buff[id+3]; } 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) { if(status == true){ NameID = NameID*10+buff[id+count+3];//「2-4」などの階層型は「24」として格納 }std::cout <<"-"<< buff[id+count+3]; } std::cout << "\n----------------\n"; status =false; id += 3+count; } std::cout << "一番手前は ...\n" << "ID : " << NameID<<"\n" << "Z minimum : " << static_cast<double>(MinZ)/UINT_MAX << "\n\n"; } //-------- ここから各種関数 -------------// void Draw() { glInitNames(); glPushName(0); //1つめ glColor3f(1,0,0); glLoadName(RED_POLY); glRectf(-0.5,0.5,0.5,-0.5); //描画 //2つめ(階層化) 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);//描画 glPushMatrix(); glPushName(SPHERE);//IDは「2-4-4」 glColor3f(1,0,1); glTranslated(0,0,-0.3); glutSolidSphere(0.2,30,30);//描画 glPopName(); glPopMatrix(); glPopName(); glPopMatrix(); glPopMatrix(); //3つめ glColor3f(0,0,1); glPushMatrix(); glTranslated(0,0,-0.1); glLoadName(BLUE_POLY); glRectf(-1,0.4,1,-0.4); //描画 glPopMatrix(); }