Skip to content

Instantly share code, notes, and snippets.

@s-yoshiki
Created November 23, 2015 06:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save s-yoshiki/4c81aa05e3dda93467d5 to your computer and use it in GitHub Desktop.
Save s-yoshiki/4c81aa05e3dda93467d5 to your computer and use it in GitHub Desktop.
#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