Created
November 23, 2015 06:08
-
-
Save s-yoshiki/4c81aa05e3dda93467d5 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include<iostream> | |
//#include<windows.h> | |
#include<math.h> | |
#include"glut.h" | |
#define SCALE 360.0 | |
GLdouble ex = 4.0, ey = 5.0, ez = 6.0; /* 視点の位置 */ | |
GLdouble tx = 0.5, ty = 0.5, tz = 0.5; /* 目標点の位置 */ | |
GLdouble ax = 0.0, ay = 1.0; /* 対象の回転軸 */ | |
GLdouble angle = 0.0; /* 回転角 */ | |
double sx, sy; /* マウス移動量のスケール */ | |
int cx, cy; /* ドラッグ開始位置 */ | |
double ca; /* ドラッグ開始時の回転角 */ | |
void addValue(double a, double b, double c); | |
//--------------------------------------------------------------------------- | |
//USELIB("..\..\..\..\Program Files\Borland\CBuilder3\LIB\OPENGL32.LIB"); | |
//USELIB("..\..\..\..\Program Files\Borland\CBuilder3\LIB\GLU32.LIB"); | |
//USELIB("..\..\..\..\Program Files\Borland\CBuilder3\LIB\glut32.lib"); | |
//--------------------------------------------------------------------------- | |
#pragma argsused | |
GLdouble vertex[][3] = { /* 直方体の頂点 */ | |
{ 0.0, 0.0, 0.0 }, /* A */ /* 配列の行番号 0 */ | |
{ 1.0, 0.0, 0.0 }, /* B */ /* 配列の行番号 1 */ | |
{ 1.0, 1.0, 0.0 }, /* C */ /* 配列の行番号 2 */ | |
{ 0.0, 1.0, 0.0 }, /* D */ /* 配列の行番号 3 */ | |
{ 0.0, 0.0, 1.0 }, /* E */ /* 配列の行番号 4 */ | |
{ 1.0, 0.0, 1.0 }, /* F */ /* 配列の行番号 5 */ | |
{ 1.0, 1.0, 1.0 }, /* G */ /* 配列の行番号 6 */ | |
{ 0.0, 1.0, 1.0 } /* H */ /* 配列の行番号 7 */ | |
}; | |
GLdouble plotBox[][3] = { /* 直方体の頂点 */ | |
{ 1.0, 0.0, 0.0 }, /* A */ /* 配列の行番号 0 */ | |
{ 2.0, 0.0, 0.0 }, /* B */ /* 配列の行番号 1 */ | |
{ 2.0, 1.0, 0.0 }, /* C */ /* 配列の行番号 2 */ | |
{ 1.0, 1.0, 0.0 }, /* D */ /* 配列の行番号 3 */ | |
{ 1.0, 0.0, 1.0 }, /* E */ /* 配列の行番号 4 */ | |
{ 2.0, 0.0, 1.0 }, /* F */ /* 配列の行番号 5 */ | |
{ 2.0, 1.0, 1.0 }, /* G */ /* 配列の行番号 6 */ | |
{ 1.0, 1.0, 1.0 } /* H */ /* 配列の行番号 7 */ | |
}; | |
int face[][4] = { /* 直方体の4頂点による面 */ | |
{ 0, 1, 2, 3 }, /* A-B-C-D を結ぶ面 */ /* 配列の行番号 0 */ | |
{ 1, 5, 6, 2 }, /* B-F-G-C を結ぶ面 */ /* 配列の行番号 1 */ | |
{ 5, 4, 7, 6 }, /* F-E-H-G を結ぶ面 */ /* 配列の行番号 2 */ | |
{ 4, 0, 3, 7 }, /* E-A-D-H を結ぶ面 */ /* 配列の行番号 3 */ | |
{ 4, 5, 1, 0 }, /* E-F-B-A を結ぶ面 */ /* 配列の行番号 4 */ | |
{ 3, 2, 6, 7 } /* D-C-G-H を結ぶ面 */ /* 配列の行番号 5 */ | |
}; | |
GLdouble normal[][3] = { /* 法線ベクトル */ | |
{ 0.0, 0.0, -1.0 }, /* 配列の行番号 0 */ | |
{ 1.0, 0.0, 0.0 }, /* 配列の行番号 1 */ | |
{ 0.0, 0.0, 1.0 }, /* 配列の行番号 2 */ | |
{ -1.0, 0.0, 0.0 }, /* 配列の行番号 3 */ | |
{ 0.0, -1.0, 0.0 }, /* 配列の行番号 4 */ | |
{ 0.0, 1.0, 0.0 } /* 配列の行番号 5 */ | |
}; | |
GLfloat light0pos[] = { 0.0, 3.0, 5.0, 1.0 }; /* 光源1の位置設定 */ | |
GLfloat light1pos[] = { 5.0, 3.0, 0.0, 1.0 }; /* 光源2の位置設定 */ | |
GLfloat green[] = { 0.0, 1.0, 0.0, 0.5 }; /* 光源2の色設定 */ | |
GLfloat red[] = { 0.8, 0.2, 0.2, 1.0 }; | |
GLfloat blue[] = { 0.2, 0.2, 0.8, 1.0 }; | |
void idle(void) | |
{ | |
glutPostRedisplay(); | |
} | |
void Draw_Figure(void) /* ユーザ定義図形描画関数 */ | |
{ | |
int i, j; | |
glBegin(GL_QUADS); /* glBegin()からglEnd()まで次のように変更 */ | |
for (j = 0; j < 6; ++j) { | |
glNormal3dv(normal[j]); /* 配列の行番号で色指定 */ | |
for (i = 0; i < 4; ++i) { | |
glVertex3dv(vertex[face[j][i]]); /* 配列の行番号で面指定 */ | |
} | |
} | |
/* | |
addValue(0.0, 1.0, 1.0); | |
for (j = 0; j < 6; ++j) { | |
glNormal3dv(normal[j]); | |
for (i = 0; i < 4; ++i) { | |
glVertex3dv(plotBox[face[j][i]]); | |
} | |
}*/ | |
int k; | |
for (k = 0; k <= 10; k++){ | |
addValue(k, k, k); | |
for (j = 0; j < 6; ++j) { | |
glNormal3dv(normal[j]); /* 配列の行番号で色指定 */ | |
for (i = 0; i < 4; ++i) { | |
glVertex3dv(plotBox[face[j][i]]); /* 配列の行番号で面指定 */ | |
} | |
} | |
} | |
std::cout << "a" << std::endl; | |
glEnd(); | |
} | |
void addValue(double a, double b, double c){ | |
int i; | |
for(i = 0; i < 8; i++){ | |
plotBox[i][0] = vertex[i][0] + a; | |
plotBox[i][1] = vertex[i][1] + b; | |
plotBox[i][2] = vertex[i][2] + c; | |
} | |
//std::cout <<"aaaaaaaaaaaa" <<plotBox[i][0] << std::endl; | |
} | |
void display(void) | |
{ | |
double dx = tx - ex, dy = ty - ey, dz = tz - ez; | |
double d = sqrt(dx * dx + dy * dy + dz * dz); /* 目標点から視点までの距離 */ | |
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /* p2.c参照 */ | |
glLoadIdentity(); /* 変換行列は毎回初期化される、初期値は単位行列 */ | |
glLightfv(GL_LIGHT0, GL_POSITION, light0pos); /* 光源の位置設定は視点位置設定の後 */ | |
glLightfv(GL_LIGHT1, GL_POSITION, light1pos); | |
glTranslated(0.0, 0.0, -d); /* 平行移動を元に戻す */ | |
glRotated(angle, ax, ay, 0.0); /* 回転軸周りでの図形の回転 */ | |
glTranslated(0.0, 0.0, d); /* 目標点が原点になるよう平行移動 */ | |
gluLookAt(ex, ey, ez, tx, ty, tz, 0.0, 1.0, 0.0); /* 視点位置と視線方向 頂点Aがウインドウの中心*/ | |
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, red); /* 図形の両面に材質赤色を設定 */ | |
Draw_Figure(); /* 図形の描画 ユーザ定義関数 */ | |
//glutSolidCube(0.3); | |
glutSwapBuffers(); | |
} | |
void resize(int w, int h) | |
{ | |
sx = 1.0 / (double)w; /* マウスポインタ位置のウィンドウ内の相対的位置への換算用 */ | |
sy = 1.0 / (double)h; | |
glViewport(0, 0, w, h); | |
glMatrixMode(GL_PROJECTION); /* 透視変換行列の設定 */ | |
glLoadIdentity(); | |
gluPerspective(30.0, (double)w / (double)h, 1.0, 100.0); | |
glMatrixMode(GL_MODELVIEW); /* モデルビュー変換行列の設定 */ | |
//glLoadIdentity(); /* 変換行列の初期化はresize時、初期値は単位行列 */ | |
//gluLookAt(ex, ey, ez, tx, ty, tz, 0.0, 1.0, 0.0); /* 視点位置と視線方向 */ | |
} | |
void mouse(int button, int state, int x, int y) | |
{ | |
switch (button) { | |
case GLUT_LEFT_BUTTON: | |
if (state == GLUT_DOWN){ | |
glutIdleFunc(idle); /* アニメーション開始 */ | |
cx = x; /* ドラッグ開始点を記録 */ | |
cy = y; | |
ca = angle; /* ドラッグ開始時の回転角を記録 */ | |
} | |
else | |
glutIdleFunc(0); /* アニメーション停止 */ | |
break; | |
default: | |
break; | |
} | |
} | |
void motion(int x, int y) | |
{ | |
double dx, dy, a; | |
dx = (x - cx) * sx; /* ドラッグ開始位置からのマウスポインタの位置変位 */ | |
dy = (y - cy) * sy; | |
a = sqrt(dx * dx + dy * dy); /* ドラッグ開始位置からのマウス移動距離 */ | |
if (a != 0.0) { | |
angle = fmod(ca + SCALE * a, 360.0); /* 距離を角度に換算してドラッグ開始時の回転角に加算 */ | |
/* angleは ( 0~360) */ | |
ax = dy / a; /* マウスの位置変位から回転軸ベクトルを決定 */ | |
ay = dx / a; | |
glutPostRedisplay(); | |
} | |
} | |
void keyboard(unsigned char key, int x, int y) | |
{ | |
switch (key) { | |
case 'q': | |
case 'Q': | |
case '\033': /* '\033' は ESC の ASCII コード */ | |
exit(0); | |
default: | |
break; | |
} | |
} | |
void init(void) /* ユーザ定義関数 */ | |
{ | |
glClearColor(1.0, 0.3, 1.0, 1.0); | |
glEnable(GL_DEPTH_TEST); /* Depth buffer 使用 */ | |
glEnable(GL_CULL_FACE); /* 隠面処理有効 */ | |
glCullFace(GL_FRONT); | |
glEnable(GL_LIGHTING); /* 陰影付け有効 */ | |
glEnable(GL_LIGHT0); /* 光源1を点灯 */ | |
glEnable(GL_LIGHT1); /* 光源2を点灯 */ | |
glLightfv(GL_LIGHT1, GL_DIFFUSE, green); /* 光源の拡散反射光強度(色)を指定 */ | |
glLightfv(GL_LIGHT1, GL_SPECULAR, green); /* 光源の鏡面反射係数を指定 */ | |
} | |
int main(int argc, char *argv[]) | |
{ | |
glutInit(&argc, argv); | |
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH); /* 隠面消去実施 */ | |
glutCreateWindow(argv[0]); | |
glutDisplayFunc(display); | |
glutReshapeFunc(resize); | |
glutMouseFunc(mouse); | |
glutMotionFunc(motion); | |
glutKeyboardFunc(keyboard); | |
init(); | |
glutReshapeWindow(500, 500); | |
glutMainLoop(); | |
return 0; | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment