2005年7月25日月曜日

第七回タイトル 「形状の挿入」

前回で表現方法が増えたかと思います。
しかし、形状を作成するのが困難と言う問題があります。さすがに三角形だけを組み合わせて作るのには限界があります。
そこで他のソフトで作った物を取り込んで表現しようと言うのが今回の取り組みです。



今回使用するのはCADソフトの中でも一番オーソドックスなSTLと言うものを使用します。
大体のCADソフトならこのSTLを出力することが出来ます。

STLのフォーマットなんて知りませんという人、ご安心を今回もSTLを読込むクラスを作成しております。


まずはこのファイルをダウンロード
し、プロジェクトに追加してください。


さらに今回はテスト用のSTLをここからダウンロード
してください。


それではプログラムのほうに移ります。
まず新しく追加したクラスをCOpenGLクラスのメンバー変数として追加してください。


 CSolidFile m_CSolidFile;

もちろんインクルードもお忘れなく


次にViewのクラスにクラスウィザードでOnSizeの関数を追加してください。
さらに関数内に次の一文を追加


 m_pOpenGL->Resize( cx,cy );

これで初期設定は完了です。


次にSTL読込む準備をしましょう。
今回は最初に読込む設定です。


COpenGLクラスのInitOpenGL()関数の最後に


 m_CSolidFile.OpenSLTFile();

を追加してください。
この関数でSTLファイルを読込むことが出来ます。


では最後に描画しましょう。


DrawOpenGL関数はこの用に記述します。


 //色と奥行きのクリアー
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 glLoadIdentity();  //行列の初期化
 gluLookAt(            //カメラの設定
         300, 300, 300,  //カメラの焦点位置 X,Y,Z
         0, 0, 0,      //カメラの位置 X,Y,Z
         0, 0, 1);      //画面の縦座標軸
 float lightAmbient0[]={0.3f,0.3,0.3,1.0f};  //環境光反射
 float lightSpecular0[]={0.3f,0.3,0.3,1.0f};  //鏡面反射
 float lightDiffuse0[]={1.0f,1.0f,1.0f,0.8f};  //拡散反射
 glLightfv(GL_LIGHT0,GL_AMBIENT,lightAmbient0); //環境光反射設定
 glLightfv(GL_LIGHT0,GL_SPECULAR,lightSpecular0);//鏡面反射設定
 glLightfv(GL_LIGHT0,GL_DIFFUSE,lightDiffuse0);  //拡散反射設定
 float lightPosition0[]={ -10000.0f, 10000.0f, 100.0f}; //光源位置
 glLightfv(GL_LIGHT0,GL_POSITION,lightPosition0);  //光源位置設定 
 glEnable(GL_LIGHTING);   //光源有効
 glEnable(GL_LIGHT0);     //光源0有効
 float MaterialAmbient0[]={0.3f,0.8,0.3,0.8f};  //環境光反射
 float MaterialSpecular0[]={0.3f,0.8,0.3,0.8f};  //鏡面反射
 float MaterialDiffuse0[]={0.3f,0.8,0.3,0.8f};  //拡散反射
 glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,MaterialAmbient0);
 glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,MaterialSpecular0);
 glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,MaterialDiffuse0);
 float MaterialAmbient1[]={0.8f,0.3,0.8,0.8f};  //環境光反射
 float MaterialSpecular1[]={0.8f,0.3,0.8,0.8f};  //鏡面反射
 float MaterialDiffuse1[]={0.8f,0.3,0.8,0.8f};  //拡散反射
 glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,MaterialAmbient1);
 glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,MaterialSpecular1);
 glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,MaterialDiffuse1);
 m_CSolidFile.DrawSTL();
 SwapBuffers(m_pCDC->m_hDC); //描画実行


以上で設定は完了です。
実行してみましょう。


実行するとファイルを開くダイアログが出るはずです。
そこでダウンロードしたSTLファイルを読み込んで見ましょう。


表示されましたか?
これで簡単なSTLビューアーが完成です。


あとはみなさんでカスタマイズしてみてください。