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モデルとそのアニメーションを作ってもら
います
ダウンロード

Interactive CG