ICG08 Modeler-2 TA : 大森・後藤・魏 Modeler課題提出方法 今回はオリジナルプリミティブを作ってもらいます 以下のスケルトンコードをダウンロードして使用してください http://130.158.80.141/~cai/Project/Project3/Project3-Modeler08.html この資料はここにあります http://www.cavelab.cs.tsukuba.ac.jp/icg/modeler2008-2.ppt 締め切りの日:2008-07-04 提出:[email protected] CC: [email protected] 件名式:kadai3(学籍番号) Wordドキュメントにはオリジナルプリミティブと自分の3Dモデルの説明を書く プリミティブを作ろう プリミティブを作るとき、面には「glNormal3d」で法線を指定する 側面の法線方向は(1, 0, 0) 台形等の傾いた面の場合は? ⇒ ベクトルの外積で法線を計算する ベクトルの外積 ベクトル aとb を含む平面に直交するベクトルを計算する r r a b r r a b ( ya zb yb za , za xb xa zb , xa yb xb ya ) r b ( xb , yb , zb ) r a ( xa , ya , za ) ベクトルの外積 r r r r a b b aに注意 a = x2-x1; b = y2-y1; c = z2-z1; d = x3-x1; e = y3-y1; f = z3-z1; ( x3 , y3 , z3 ) glBegin( GL_TRIANGLES ); glNormal3d( b*f - c*e, c*d - a*f, a*e - b*d ); glVertex3d(x1, y1, z1); glVertex3d(x2, y2, z2); glVertex3d(x3, y3, z3); ( x1 , y1 , z1 ) ( x2 , y2 , z2 ) ベクトル、行列の演算 実は外積等のベクトル演算はvec.hで定義されている Vec3d a(x2-x1, y2-y1, z2-z1); Vec3d b(x3-x1, y3-y1, z3-z1); Vec3d nml = a^b; glBegin( GL_TRIANGLES ); glNormal3d( nml[0], nml[1], nml[2] ); glVertex3d(x1, y1, z1); glVertex3d(x2, y2, z2); glVertex3d(x3, y3, z3); 同様に行列演算もmat.hで定義されている。見てみよう 擬似曲面の作り方 実は法線方向は面ではなく頂点に対して設定されます 擬似曲面の作り方 頂点ごとに法線を指定すると、面内の法線方向は頂点の法線 から補完される グローのスムースシェーディングで描画される 六角柱による擬似円柱 を上から見た図 色、光について OpenGLには3種類の光があります 環境光 日陰の部分の光 拡散光 普通に光源から当たる光 鏡面光 光源から反射される光 物体にはそれぞれの光に対する色を指定します 色、光について 上 環境光反射 (0.1, 0.1, 0.1) 拡散光反射 (0.0, 0.5, 1.0) 鏡面光反射 (1.0, 1.0, 1.0) shininess 80 プラスチック 環境光反射 (0.1, 0.1, 0.1) 拡散光反射 (0.0, 0.5, 1.0) 鏡面光反射 (0.0, 0.5, 1.0) shininess 80 金属 中 下 環境光反射 (0.1, 0.1, 0.1) 拡散光反射 (0.0, 0.5, 1.0) 鏡面光反射 (0.0, 0.0, 0.0) shininess 80 shininessは鏡面反射率で 物体表面のハイライトの強さ ツヤ消し 色、光について 3種類の光が光源からどれだけ出ているか それらの光を物体がどれだけ反射するか によって最終的な色が決まります (3種の反射光の合計値) 光源の設定 modelerview.cppの最後の方 static GLfloat lightPosition0[] = { 4, 2, -4, 0}; static GLfloat lightDiffuse0[] = { 1, 1, 1, 1}; static GLfloat lightSpecular0[] = { 1, 1, 1, 1};//追加 static GLfloat lightPosition1[] = { -2, 1, 5, 0}; static GLfloat lightDiffuse1[] = { 1, 1, 1, 1}; 光源の設定 modelerview.cppのdraw関数内 m_camera->applyViewingTransform(); glLightfv( GL_LIGHT0, GL_POSITION, lightPosition0 ); glLightfv( GL_LIGHT0, GL_DIFFUSE, lightDiffuse0 ); glLightfv( GL_LIGHT0, GL_SPECULAR, lightSpecular0 );//追加 glLightfv( GL_LIGHT1, GL_POSITION, lightPosition1 ); glLightfv( GL_LIGHT1, GL_DIFFUSE, lightDiffuse1 ); 物体の色指定 sample.cppのdraw関数内 setAmbientColor( 0.1, 0.1, 0.1 ); setDiffuseColor( 0.0, 0.5, 1.0 ); setSpecularColor( 1.0, 1.0, 1.0 ); setShininess( 80 ); drawCylinder( 5.0, 1.0, 0.0 ); グラデーション 物体に指定する色も、法線のように頂点ごとに設定される これを用いたグラデーションが可能 自分だけのモデルを作ろう どんなモデルにどんな動き をさせるか考えよう 自分のモデルに必要なプリミティ ブを作ろう Neck :3DOF Shoulder : 2DOF Elbow : 1DOF Waist : 2DOF Wrist : 1DOF Hip : 2DOF Knee : 1DOF Ankle : 2DOF スライダーの追加 スライダーでモデルのパラメータを変更できるようにしよう 上のほうの「enum」の行に、スライダーの種類を列挙する enum BoxModelControls { XPOS, YPOS, ZPOS, HEIGHT, NUMCONTROLS, }; 注意 「NUMCONTROLS」というキーワードは必ず最後におく! スライダーの追加 下のほうのmain関数で、各スライダーの設定を書く ModelerControl controls[NUMCONTROLS]; controls[XPOS] = ModelerControl("X Position", -5, 5, 0.1f, 0); controls[YPOS] = ModelerControl("Y Position", 0, 5, 0.1f, 0); controls[ZPOS] = ModelerControl("Z Position", -5, 5, 0.1f, 0); controls[HEIGHT] = ModelerControl("Height", 1, 5, 0.1f, 1); ModelerControl(スライダーの名前, 最小値, 最大値, 増分, 初期値) スライダーの追加 sample.cppのdraw関数内で、 VAL(HEIGHT) とすれば、スライダーの値が読める XPOS等、元からあるスライダーを参考に モデルとアニメーションを作ろう ここからは自分の3Dモデルとそのアニメーションを作ってもら います
© Copyright 2024 ExpyDoc