diff --git a/opglwidget.cpp b/opglwidget.cpp index 0907b3d..280a79a 100644 --- a/opglwidget.cpp +++ b/opglwidget.cpp @@ -1,13 +1,45 @@ #include "opglwidget.h" #include +#include #include void OPGLWidget::initializeGL() { + glClearDepth(1.0f); + glDepthFunc(GL_LESS); + glEnable(GL_DEPTH_TEST); + glShadeModel(GL_SMOOTH); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glMatrixMode(GL_MODELVIEW); + glEnable(GL_LIGHTING); + glEnable(GL_LIGHT0); + GLfloat light_array[] = {0.4, 0.4, 0.4, 0.4}; + GLfloat light_position[] = {10.0, 20.0, 10.0, 1.0}; + glLightfv(GL_LIGHT0, GL_AMBIENT, light_array); + glLightfv(GL_LIGHT0, GL_DIFFUSE, light_array); + glLightfv(GL_LIGHT0, GL_SPECULAR, light_array); + glLightfv(GL_LIGHT0, GL_POSITION, light_position); glClearColor(0.0f, 0.0f, 0.0f, 1.0f); } void OPGLWidget::paintGL() { - glClear(GL_COLOR_BUFFER_BIT); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glLoadIdentity(); + reorient(); +} + +void OPGLWidget::reorient() { + float F_mag = pow(loc[0], 2) + pow(loc[1], 2) +pow(loc[2], 2); + GLfloat f[] = {-loc[0]/F_mag, -loc[1] / F_mag, -loc[2] / F_mag}; + + GLfloat s[] = {-f[2], 0, f[0]}; + float s_mag = pow(s[0], 2) + pow(s[1], 2) + pow(s[2], 2); + + GLfloat u[] = {(s[1] * f[2] - s[2] * f[1]) / s_mag, (s[0] * f[2] - s[2] * f[0]) / s_mag, (s[0] * f[1] - s[1] * f[0]) / s_mag}; + + const GLfloat m[] = {s[0], u[0], -f[0], 0, s[1], u[1], -f[1], 0, s[2], u[2], -f[2], 0, 0, 0, 0, 1}; + glMultMatrixf(m); + glTranslatef(-loc[0], -loc[1], -loc[2]); } void OPGLWidget::resizeGL(int w, int h) { diff --git a/opglwidget.h b/opglwidget.h index 3a32627..180f9d3 100644 --- a/opglwidget.h +++ b/opglwidget.h @@ -8,4 +8,7 @@ protected: void paintGL(); void initializeGL(); void resizeGL(int w, int h); + void reorient(); + + float loc[3] = {-10, 0, -10}; };