topical media & game development
basic-visual-03-3dtransformations.c
? /
basic-visual-03-3dtransformations.c
// ------------------------------------------------------------------------
// This program is complementary material for the book:
//
// Frank Nielsen
//
// Visual Computing: Geometry, Graphics, and Vision
//
// ISBN: 1-58450-427-7
//
// Charles River Media, Inc.
//
//
// All programs are available at www.charlesriver.com/visualcomputing/
//
// You may use this program for ACADEMIC and PERSONAL purposes ONLY.
//
//
// The use of this program in a commercial product requires EXPLICITLY
// written permission from the author. The author is NOT responsible or
// liable for damage or loss that may be caused by the use of this program.
//
// Copyright (c) 2005. Frank Nielsen. All rights reserved.
// ------------------------------------------------------------------------
// ------------------------------------------------------------------------
// File: 3dtransformations.cpp
//
// Description: Common 3D transformations: rotations, shears, translations...
// ------------------------------------------------------------------------
include <stdafx.h>
include <GL/glut.h>
include <bunny.h>
int width=512,height=512;
GLfloat cx,cy,cz;
define INITIALIZE(M) for(int ii=0;ii<4;ii++) for(int jj=0;jj<4;jj++) M[4*ii+jj]=((ii==jj) ? 1.0 : 0.0);
void gravity()
{
int i;
cx=cy=cz=0.0;
for(i=0;i<NUM_POINTS;i++)
{
cx+=bunny[3*i];
cy+=bunny[3*i+1];
cz+=bunny[3*i+2];
}
cx/=(float)NUM_POINTS;
cy/=(float)NUM_POINTS;
cz/=(float)NUM_POINTS;
}
void disp();
void keyb(unsigned char key, int x, int y);
void reshape(int x, int y);
void init();
GLfloat spin=0;
bool rotate=0;
define INDEX(a,b) ((a)+(b)*4)
GLfloat M[16], MGL[16];
int main(int argc, char **argv){
glutInit(&argc, argv);
spin=0;
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowPosition(0,0);
glutInitWindowSize(width,height);
glutCreateWindow("3D Transformations on the decimated Stanford Bunny");
init();
glutDisplayFunc(disp);
glutKeyboardFunc(keyb);
glutReshapeFunc(reshape);
glutMainLoop();
return 0;
}
void init(){
glClearColor(0.0,0.0,0.0,0.0);
glShadeModel(GL_FLAT);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_DEPTH_TEST);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glVertexPointer(3,GL_FLOAT,0,bunny);
glNormalPointer(GL_FLOAT,0,normals);
glEnable(GL_NORMALIZE);
glHint (GL_LINE_SMOOTH_HINT, GL_NICEST);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glEnable (GL_LINE_SMOOTH);
INITIALIZE(M);
gravity();
printf("\%f \%f \%f\n",cx,cy,cz);
}
void DrawAxis(GLfloat maxu=1.0)
{
GLfloat b=10.0;
glDisable(GL_LIGHTING);
glLineWidth(3.0f);
glColor3f(1.0,0.0,0.0);
glBegin(GL_LINES);
glVertex3f(0.0,0.0,0.0);
glVertex3f(maxu,0.0,0.0);
glEnd();
glColor3f(0.0,1.0,0.0);
glBegin(GL_LINES);
glVertex3f(0.0,0.0,0.0);
glVertex3f(0.0,maxu,0.0);
glEnd();
glColor3f(0.0,0.0,1.0);
glBegin(GL_LINES);
glVertex3f(0.0,0.0,0.0);
glVertex3f(0.0,0.0,maxu);
glEnd();
glEnable(GL_LIGHTING);
}
void disp(void)
{
static GLfloat position1 [] = {0.0,7,6,1.0};
static GLfloat position2 [] = {0.0,-0.15,-0.1,1.0};
static GLfloat color [] = {0.8,0.8,0.8,1.0};
glClearColor(1.0,1.0,1.0,0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(-0.3,0.25,0.5,0,0.11,0,0,1,0);
glPushMatrix();
glTranslatef(position1[0],position1[1],position1[2]);
glLightfv(GL_LIGHT0,GL_POSITION,position1);
glPopMatrix();
glPushMatrix();
glPushMatrix();
glMultMatrixf(M);
glColor3f(0.5,0.5,0.5);
if (rotate) {spin+=1.0;if (spin>360) spin-=360;}
glRotatef(spin,0.0,1.0,0.0);
glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,color);
glDrawElements(GL_TRIANGLES,3*NUM_TRIANGLES,GL_UNSIGNED_INT,triangles);
glPushMatrix(); glTranslatef(cx,cy,cz); DrawAxis(0.15); glPopMatrix();
glPopMatrix();
DrawAxis();
glPopMatrix();
// Swap the buffers && redraw
glutSwapBuffers();
glutPostRedisplay();
}
include <math.h>
GLfloat angle=3.14159265/4.0;
void keyb(unsigned char key, int x, int y)
{
int i,j; float shear=1.0;
switch(key)
{
case ' ':
rotate=!rotate;
break;
case 'I': case 'i':
for(i=0;i<4;i++) for(j=0;j<4;j++) M[4*i+j]=((i==j) ? 1.0 : 0.0);
break;
case 'T': case 't':
for(i=0;i<4;i++) for(j=0;j<4;j++) M[4*i+j]=((i==j) ? 1.0 : 0.0);
M[INDEX(0,3)]=cx;
M[INDEX(1,3)]=cy;
M[INDEX(2,3)]=cz;
break;
case 'E': case 'e':
for(i=0;i<4;i++) for(j=0;j<4;j++) M[4*i+j]=((i==j) ? 1.0 : 0.0);
M[INDEX(0,0)]=cos(angle); M[INDEX(0,1)]=-sin(angle);
M[INDEX(1,0)]=sin(angle); M[INDEX(1,1)]=cos(angle);
break;
case 'R': case 'r':
for(i=0;i<4;i++) for(j=0;j<4;j++) M[4*i+j]=((i==j) ? 1.0 : 0.0);
M[INDEX(1,1)]=cos(angle); M[INDEX(1,2)]=-sin(angle);
M[INDEX(2,1)]=sin(angle); M[INDEX(2,2)]=cos(angle);
break;
case 'W': case 'w':
for(i=0;i<4;i++) for(j=0;j<4;j++) M[4*i+j]=((i==j) ? 1.0 : 0.0);
M[INDEX(0,0)]=cos(angle); M[INDEX(0,2)]=-sin(angle);
M[INDEX(2,0)]=sin(angle); M[INDEX(2,2)]=cos(angle);
break;
case 'S': case 's':
INITIALIZE(M);
M[INDEX(0,0)]=1.5;M[INDEX(1,1)]=0.5;M[INDEX(2,2)]=0.25;
break;
case 'O': case 'o':
for(i=0;i<4;i++) for(j=0;j<4;j++) M[4*i+j]=((i==j) ? 1.0 : 0.0);
M[INDEX(0,0)]=M[INDEX(1,1)]=-1; //M[INDEX(2,2)]-1;
break;
case 'Y': case 'y':
for(i=0;i<4;i++) for(j=0;j<4;j++) M[4*i+j]=((i==j) ? 1.0 : 0.0);
M[INDEX(0,0)]=-1;
break;
case 'X': case 'x':
for(i=0;i<4;i++) for(j=0;j<4;j++) M[4*i+j]=((i==j) ? 1.0 : 0.0);
M[INDEX(1,1)]=-1;
break;
case 'Z':case 'z':
for(i=0;i<4;i++) for(j=0;j<4;j++) M[4*i+j]=((i==j) ? 1.0 : 0.0);
M[INDEX(2,2)]=-1;
case 'H': case 'h':
for(i=0;i<4;i++) for(j=0;j<4;j++) M[INDEX(i,j)]=rand()/RAND_MAX;
M[INDEX(0,3)]=M[INDEX(1,3)]=M[INDEX(2,3)]=0.0;
M[INDEX(3,3)]=1.0;
break;
// SHEARS
// shear zy
case 'J':case 'j':
for(i=0;i<4;i++) for(j=0;j<4;j++) M[4*i+j]=((i==j) ? 1.0 : 0.0);
M[INDEX(2,1)]=shear;
break;
case 'K':case 'k':
for(i=0;i<4;i++) for(j=0;j<4;j++) M[4*i+j]=((i==j) ? 1.0 : 0.0);
M[INDEX(0,1)]=shear;
break;
case 'L':case 'l':
for(i=0;i<4;i++) for(j=0;j<4;j++) M[4*i+j]=((i==j) ? 1.0 : 0.0);
M[INDEX(1,0)]=shear;
break;
}
printf("Model Matrix:\n");
for(i=0;i<4;i++)
{for(j=0;j<4;j++)
printf("\%f ",M[INDEX(i,j)]);
printf("\n");}
}
void reshape(int x, int y){
glViewport(0,0,x,y);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(50,x/(y*1.0),0.001,1000.0);
}
(C) Æliens
20/2/2008
You may not copy or print any of this material without explicit permission of the author or the publisher.
In case of other copyright issues, contact the author.