Skip to content

Instantly share code, notes, and snippets.

@tkymx
Last active December 11, 2015 13:38
Show Gist options
  • Save tkymx/d967d70133dc2e3a0eba to your computer and use it in GitHub Desktop.
Save tkymx/d967d70133dc2e3a0eba to your computer and use it in GitHub Desktop.
実験で得たデータを三次元的に視覚できるようなツールを作ってみた z,xで拡大、縮小 マウスでカメラ操作 drawの中で描画することができます
#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