OpenGL实现四面体位图测试和连续动画.doc
文本预览下载声明
#include windows.h
#include gl/glut.h
#include math.h
#include stdio.h
struct vector3
{
float x, y, z;
};
// 定义四面体的四个点
float r = 1.0;
float a[] = {-0.5, -0.5, -0.25};
float b[] = {-0.5, r-0.5, -0.25};
float c[] = {sqrt(3.0)*r/2-0.5, r/2-0.5, -0.25};
float d[] = {sqrt(3.0)*r/6-0.5, r/2-0.5, sqrt(6.0)*r/3-0.25};
// 四个面的法向量
vector3 normalACB, normalABD, normalBCD, normalADC;
// 绕 x 轴, y 轴旋转的角度
int anglex = 0, angley = 0;
// 定义光源
float light_pos[] = {2.0, 2.0, 2.0, 0.0};
float light_Ka[] = {1.0, 0.0, 0.0, 1.0};
float light_Kd[] = {1.0, 1.0, 1.0, 1.0};
float light_Ks[] = {1.0, 1.0, 1.0, 1.0};
// 计算一个三角形的法向量
vector3 calculateNormal(float a[], float b[], float c[])
{
float ab[3], ac[3];
vector3 normal;
ab[0] = b[0] - a[0];
ab[1] = b[1] - a[1];
ab[2] = b[2] - a[2];
ac[0] = c[0] - a[0];
ac[1] = c[1] - a[1];
ac[2] = c[2] - a[2];
normal.x = ab[1]*ac[2] - ab[2]*ac[1];
normal.y = ab[0]*ac[2] - ab[2]*ac[0];
normal.z = ab[0]*ac[1] - ab[1]*ac[0];
return normal;
}
void init()
{
glClearColor(1.0, 1.0, 1.0, 0.0);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);
glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
glLightfv(GL_LIGHT0, GL_POSITION, light_pos);
glLightfv(GL_LIGHT0, GL_AMBIENT, light_Ka);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_Kd);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_Ks);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
}
void idle()
{
anglex = (anglex + 1) % 360;
angley = (angley + 1) % 360;
glutPostRedisplay();
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// 画坐标轴
glColor3f(1.0, 1.0, 1.0);
glBegin(GL_LINES);
glVertex3f(0.0, 0.0, 0.0);
glVertex3f(5.0, 0.0, 0.0);
glVertex3f(0.0, 0.0, 0.0);
glVertex3f(0.0, 5.0, 0.0);
glVertex3f(0.0, 0.0, 0.0);
glVertex3f(0.0, 0.0, 5.0);
glEnd();
glPushMatrix();
glRotated(anglex, 1.0, 0.0, 0.0);
float a1[3], b1[3], c1[3], d1[3];
// 计算旋转之后的四个点
a1[0] = a[0];
a1[1] = cos(anglex*1.0)*a[1] - sin(anglex*1.0)*a[2];
a1[2] = si
显示全部