Last active
December 11, 2015 13:38
-
-
Save tkymx/d967d70133dc2e3a0eba to your computer and use it in GitHub Desktop.
実験で得たデータを三次元的に視覚できるようなツールを作ってみた z,xで拡大、縮小 マウスでカメラ操作
drawの中で描画することができます
This file contains hidden or 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 <GL/glut.h> | |
#include<windows.h> | |
#include"Vector.h" | |
using namespace std; | |
#define WINDOW_WIDTH (640.0) | |
#define WINDOW_HEIGHT (480.0) | |
//環境情報 | |
GLfloat light0pos[] = { 0.0, 500.0, -100.0, 1.0 }; | |
GLfloat black[] = { 0.2, 0.2, 0.2, 1.0 }; | |
GLfloat white[] = { 0.8, 0.8, 0.8, 1.0 }; | |
//マテリアル情報 | |
GLfloat mat_ambient[] = { 0.2f, 0.2f, 0.2f, 1.0f }; | |
GLfloat mat_diffuse[] = { 0.8f, 0.0f, 0.0f, 1.0f }; | |
GLfloat mat_specular[] = { 0.8f, 0.8f, 1.0f, 1.0f }; | |
GLfloat mat_shininess[] = { 100.0f }; | |
////////////////////////////////////////////////////// | |
// | |
// 中身 | |
// | |
////////////////////////////////////////////////////// | |
void idle(void) | |
{ | |
glutPostRedisplay(); | |
} | |
void drawTriangle( Vector p1 , Vector p2 , Vector p3 ) | |
{ | |
glBegin(GL_POLYGON); | |
glVertex3f(p1.x,p1.y,p1.z); | |
glVertex3f(p2.x,p2.y,p2.z); | |
glVertex3f(p3.x,p3.y,p3.z); | |
glEnd(); | |
} | |
void drawLine( Vector p1 , Vector p2 ) | |
{ | |
glBegin(GL_LINES); | |
glVertex3f(p1.x,p1.y,p1.z); | |
glVertex3f(p2.x,p2.y,p2.z); | |
glEnd(); | |
} | |
void SetMaterial( Vector color ) | |
{ | |
//マテリアルを追加 | |
float _c[4] = { color.x , color.y , color.z , 1.0 }; | |
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient); | |
glMaterialfv(GL_FRONT, GL_DIFFUSE, _c); | |
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); | |
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess); | |
} | |
void draw() | |
{ | |
//ラインの太さ | |
glLineWidth(1); | |
glPushMatrix(); | |
{ | |
SetMaterial( Vector(0,1,0) ); | |
} | |
glPopMatrix(); | |
//ラインの太さ | |
glLineWidth(2); | |
//行列のプッシュ | |
glPushMatrix(); | |
{ | |
glDisable(GL_LIGHTING); | |
//x軸 | |
glColor3f(1,0,0); | |
drawLine( Vector() , Vector(500,0,0) ); | |
//y軸 | |
glColor3f(0,1,0); | |
drawLine( Vector() , Vector(0,500,0) ); | |
//z軸 | |
glColor3f(0,0,1); | |
drawLine( Vector() , Vector(0,0,500) ); | |
glEnable(GL_LIGHTING); | |
} | |
glPopMatrix(); | |
} | |
struct Camera | |
{ | |
//回転角 | |
double rx0; | |
double ry0; | |
double rx; | |
double ry; | |
//起点座標 | |
int x0; | |
int y0; | |
//移動初期位置 | |
double px0; | |
double py0; | |
double px; | |
double py; | |
//回転中か | |
bool isRotate; | |
bool isTranse; | |
//角度 | |
double angle; | |
Camera() | |
{ | |
rx0 = ry0 = 0; | |
rx = ry = 0; | |
px0 = py0 = 0; | |
px = py = 0; | |
x0 = y0 = 0; | |
isRotate = false; | |
isTranse = false; | |
angle = 60; | |
} | |
}g_Camera; | |
void display(void) | |
{ | |
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); | |
/* モデルビュー変換行列の設定 */ | |
glMatrixMode(GL_MODELVIEW); | |
glLoadIdentity(); | |
/* 視点位置と視線方向 */ | |
gluLookAt( | |
0.0, 1000.0, 300.0, | |
0.0, -140.0, 0.0, | |
0.0, 1.0, 0.0); | |
/* 図形の回転 */ | |
glTranslated( g_Camera.px0+g_Camera.px , 0 , g_Camera.py0+g_Camera.py ); | |
glRotated(g_Camera.rx0 + g_Camera.rx, 1.0, 0.0, 0.0); | |
glRotated(g_Camera.ry0 + g_Camera.ry, 0.0, 1.0, 0.0); | |
/*図形の描画*/ | |
draw(); | |
//更新 | |
glutSwapBuffers(); | |
} | |
void resize(int w, int h) | |
{ | |
glViewport(0, 0, w, h); | |
/* 透視変換行列の設定 */ | |
glMatrixMode(GL_PROJECTION); | |
glLoadIdentity(); | |
gluPerspective(g_Camera.angle, (double)w / (double)h, 1.0, 10000.0); | |
} | |
void mouse(int button, int state, int x, int y) | |
{ | |
if( button == GLUT_LEFT_BUTTON) | |
{ | |
if( state == GLUT_DOWN ) | |
{ | |
//押されたらその地点を記録 | |
g_Camera.x0 = x; | |
g_Camera.y0 = y; | |
g_Camera.isRotate = true; | |
} | |
else if( state == GLUT_UP ) | |
{ | |
g_Camera.isRotate = false; | |
g_Camera.rx0 += g_Camera.rx; | |
g_Camera.ry0 += g_Camera.ry; | |
g_Camera.rx =0; | |
g_Camera.ry = 0; | |
} | |
} | |
else if( button == GLUT_RIGHT_BUTTON) | |
{ | |
if( state == GLUT_DOWN ) | |
{ | |
//押されたらその地点を記録 | |
g_Camera.x0 = x; | |
g_Camera.y0 = y; | |
g_Camera.isTranse = true; | |
} | |
else if( state == GLUT_UP ) | |
{ | |
g_Camera.isTranse = false; | |
g_Camera.px0 += g_Camera.px; | |
g_Camera.py0 += g_Camera.py; | |
g_Camera.px =0; | |
g_Camera.py = 0; | |
} | |
} | |
} | |
void motion( int x , int y ) | |
{ | |
if( g_Camera.isRotate ) | |
{ | |
//回転角の指定 | |
g_Camera.ry = (x-g_Camera.x0); | |
g_Camera.rx = (y-g_Camera.y0); | |
} | |
else if( g_Camera.isTranse ) | |
{ | |
//回転角の指定 | |
g_Camera.px = (x-g_Camera.x0); | |
g_Camera.py = (y-g_Camera.y0); | |
}} | |
void keyboard(unsigned char key, int x, int y) | |
{ | |
switch (key) { | |
case 'z': | |
g_Camera.angle--; | |
resize( glutGet(GLUT_WINDOW_WIDTH) , glutGet(GLUT_WINDOW_HEIGHT) ); | |
break; | |
case 'x': | |
g_Camera.angle++; | |
resize( glutGet(GLUT_WINDOW_WIDTH) , glutGet(GLUT_WINDOW_HEIGHT) ); | |
break; | |
case 'q': | |
case 'Q': | |
case '\033': /* '\033' は ESC の ASCII コード */ | |
exit(0); | |
default: | |
break; | |
} | |
glutPostRedisplay(); | |
} | |
void init(void) | |
{ | |
glClearColor(1.0, 1.0, 1.0, 1.0); | |
glEnable(GL_DEPTH_TEST); | |
glEnable(GL_LIGHTING); | |
glEnable(GL_LIGHT0); | |
/* 光源の位置設定 */ | |
glLightfv(GL_LIGHT0, GL_POSITION, light0pos); | |
glLightfv(GL_LIGHT0, GL_AMBIENT, black); | |
glLightfv(GL_LIGHT0, GL_DIFFUSE, white); | |
glLightfv(GL_LIGHT0, GL_SPECULAR, white); | |
} | |
int main(int argc, char *argv[]) | |
{ | |
glutInitWindowSize( WINDOW_WIDTH, WINDOW_HEIGHT); | |
glutInit(&argc, argv); | |
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH); | |
glutCreateWindow(argv[0]); | |
glutDisplayFunc(display); | |
glutReshapeFunc(resize); | |
glutMouseFunc(mouse); | |
glutMotionFunc(motion); | |
glutKeyboardFunc(keyboard); | |
glutIdleFunc(idle); | |
init(); | |
glutMainLoop(); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment