Mais conteúdo relacionado
Semelhante a OpenGL 3DCG (8)
Mais de Takenori Nakagawa (20)
OpenGL 3DCG
- 6. x,y,z 軸の描画
GL_LINES で (0, 0, 0) から x,y,z それぞれ長さ 100 の線を引く。
各メソッドの解説
glLineWidth(GLfloat width): 線幅を指定
glColor4d: RGBA で色を指定 (GL_LIGHTING が disable の時のみ有効)
glBegin(GLenum mode): モードを指定して頂点の追加を開始
glVertex3d: XYZ で座標を指定
glEnd(void): glBegin と対になる頂点グループの終わりを示す
- 9. 三角錐の描画
glBegin(GL_TRIANGLE_STRIP);
glVertex3d(0, 0, 0); glNormal3d(0, 0, -1);
glVertex3d(4, 0, 0); glNormal3d(0, 0, -1);
glVertex3d(0, 0, 3); glNormal3d(0, 0, -1);
glVertex3d(0, 2, 0); glNormal3d(0, 0, -1);
glVertex3d(0, 0, 0); glNormal3d(0, 0, -1);
glVertex3d(4, 0, 0); glNormal3d(0, 0, -1);
glEnd();
- 21. W,A,S,D で移動
void keyboard(unsigned char key, int x, int y)
{
printf( "Key Code : %d, Position : %d %dn", key, x, y );
// switch文を用いたキー処理の例(switch-caseを使う場合、breakの書き忘れに注意)
double size = 1.0;
switch(key) {
case 'a':
// x 軸正方向へ移動
wm[12] += size;
break;
case 'd':
// x 軸負方向へ移動
wm[12] -= size;
break;
case 'w':
// z 軸正方向へ移動
wm[14] += size;
break;
case 's':
// z 軸負方向へ移動
wm[14] -= size;
break;
default:
printf( "tKey: Other -> %cn", key );
}
glutPostRedisplay();
}
- 23. マウスでカメラの向きを変更
void mousePressed(int button, int state, int x, int y)
{
printf( "Mouse Button: %d, State: %d, Position %d %dn", button, state, x, y );
// mouse down 時
if (! state) {
// 座標を記録しておく
mouse_pos.x = x;
mouse_pos.y = y;
}
}
- 24. マウスでカメラの向きを変更
void mouseDragged(int x, int y)
{
printf( "Mouse Drag Position %d %dn", x, y );
pos2d diff = {mouse_pos.x - x, mouse_pos.y - y};
mouse_pos.x = x;
mouse_pos.y = y;
y_rad += diff.x / window.w * M_PI / 5;
x_rad += diff.y / window.h * M_PI / 5;
// y 軸回転
vm_y[0] = cos(y_rad);
vm_y[2] = -sin(y_rad);
vm_y[8] = sin(y_rad);
vm_y[10] = cos(y_rad);
// x 軸回転
vm_x[5] = cos(x_rad);
vm_x[6] = sin(x_rad);
vm_x[9] = -sin(x_rad);
vm_x[10] = cos(x_rad);
// 視点の再計算
resize(window.w, window.h);
glutPostRedisplay(); // ウィンドウに再描画命令を送る(ポストする)
}
- 26. 三角錐の自動回転
void idle()
{
// y 軸に対して毎度 1 度ずつ右ねじ回転
rad += M_PI / 180;
if (rad > M_PI * 2) {
rad = 0;
}
wm[0] = cos(rad);
wm[2] = -sin(rad);
wm[8] = sin(rad);
wm[10] = cos(rad);
glutPostRedisplay(); // ウィンドウに再描画命令を送る(ポストする)
}