Quan sát trong không gian ba chi u ..... Trong pane trái, ch n cây con linker và ch n Input.. Hãy nh p các dòng sau ây vào tr ng Additional Dependencies trong pane ph i.. Bây gi Visual
Trang 2M C L C
Cài t OpenGL 3
Bài I H th ng h a máy tính 4
Bài II Các thu t toán c s v h a hai chi u 8
Bài III Thu c tính hình v 13
Bài IV Bi n i hình h c hai ba chi u 16
Bài V Quan sát trong không gian ba chi u 18
Bài VI Mô hình hóa b m t v t th 21
Bài VII Lo i b m t khu t 25
Bài VIII Chi u sáng và tô bóng 32
Trang 3dvduc-2007/08
2
Trang 4Cài t OpenGL
I Visual C/C++ 6.0
th c hành c các bài t p trong tài li u này, ta c n ph i cài t Visual C/C++ 6.0 và các th
vi n OpenGL Vi c cài t chúng lên máy tính c th c hi n nh h ng d n sau ây:
1 Cài t Microsoft Visual Studio 6.0 n u ch a có nó trong máy tính.
2 Cài t OpenGL
a Ki m tra xem OpenGL v1.1 software runtime có s n trong WinXP, Windows 2000,
Windows 98, Windows 95 (OSR2) và Windows NT hay ch a?
b N u ch a có, hãy download t Internet theo a ch :http://download.microsoft.com/download/win95upg/info/1/W95/EN-US/Opengl95.exe
c Ch y t p Opengl95.exe v a t i v có OpenGL Libraries và header files sau ây:
opengl32.lib glu32.lib gl.h glu.h
3 Cài t GLUT
a Hãy download t Internet: http://www.xmission.com/~nate/glut/glut-3.7.6-bin.zip
b Cài t theo h ng d n trong t p readme, và sao chép các t p nh ch d n sau:
glut32.dll vào %WinDir%\System, ví d : C:\windows\system
glut32.lib vào $(MSDevDir)\ \ \VC98\lib, ví d : C:\Program Files\Microsoft Visual Studio\VC98\Lib
glut.h vào $(MSDevDir)\ \ \VC98\include\GL, ví d : C:\Program Files\Microsoft Visual Studio\VC98\Include\gl
Phát tri n ch ng trình ng d ng b ng Visual C++ và OpenGL
a Kh i ng Visual C++ b ng th c n File-New-Projects t o d án m i Win32
Console Application.
b Ch n An empty project trong màn hình ti p theo.
c Chuy n n th c n Project-Settings trong IDE Ch n Link tab và chèn opengl32.lib,
glu32.lib, glut32.lib, và n u project s d ng GLUI thì g p c glui32.lib Các t p th vi n
này c n có có trong danh m c Microsoft Visual Studio\VC98\lib hay trong danh m c c a
project hi n hành
d Ki m tra vi c cài t b ng cách nh p m t ch ng trình n gi n GLUT nh ví d 1.1
e Chú ý r ng ta c n chèn các l nh #include <GL/glut.h> và #include <GL/gl.h> vào u
ch ng trình
f D ch và ch y th ch ng trình
g S a l i n u có
N u xu t hi n thông báo l i unexpected end of file while looking for precompiled header
directive , hãy t t thu c tính precompiled headers b ng cách ch n Projects -> Settings,
chuy n n C++ tab, ch n Precompiled Headers t Category listbox, sau ó ch n phím radio "Not using precompiled headers"
II Microsoft Visual Studio NET
1 Th c hi n cài t OpenGL t ng t nh trên ây
2 S a i Project Properties:
a Ch n th c n Project ( Project > * Properties) c a Visual Studio m trang h p tho i
b Ch n combo box Configuration , ch n All Configuration
c Trong pane trái, ch n cây con linker và ch n Input Hãy nh p các dòng sau ây vào
tr ng Additional Dependencies trong pane ph i
d Bây gi Visual Studio bi t tìm GLUT âu Nh n phím OK
Trang 6void myKeyboard(unsigned char c, int x, int y) {
void main(int argc, char **argv) {
Trang 7glFlush();
} void myMouse(int button, int state, int x, int y) {
glVertex2i(x, y);
glEnd();
} glFlush();
} void myInit(void) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(640,480);
glutInitWindowPosition(100,150);
Trang 9float savex, savey;
const int n = 50; // number of segments making up arc float angle = 0;
float angleInc = 360.0 * PI / (180 * n); // angle increment in radians savex = point.x;
Trang 10drawCircle(point, 100.0);
glFlush();
} void myReshape(int w, int h) { // window is reshaped
glViewport (0, 0, w, h); // update the viewport glMatrixMode(GL_PROJECTION);
int dx, dy, incrE, incrNE, d, x, y;
dx=x1-x0;
dy=y1-y0;
d=2*dy-dx; //dstart incrE=2*dy; //DE incrNE=2*(dy-dx); //DNE x=x0; y=y0;
drawPoint(x,y);
while(x<x1)
{ if(d<=0) // select E
{ d+=incrE;
Trang 11{ // select NE d+=incrNE;
x++; y++;
} drawPoint(x,y);
} }
glViewport (0, 0, w, h); // update the viewport glMatrixMode(GL_PROJECTION);
const int screenHeight = 480;
const int screenWidth = 640;
int startflag = 1;
class GLintPoint { public:
GLint x, y;
};
Trang 12void drawLine(GLint x1, GLint y1, GLint x2, GLint y2) {
static GLintPoint List[2];
glClear(GL_COLOR_BUFFER_BIT);
glFlush();
} void main(int argc, char** argv) {
Trang 14Bài III Thu c tính hình v
Trang 15GLubyte mask[]={ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x80, 0x01, 0xC0, 0x06, 0xC0, 0x03, 0x60, 0x04, 0x60, 0x06, 0x20, 0x04, 0x30, 0x0C, 0x20, 0x04, 0x18, 0x18, 0x20, 0x04, 0x0C, 0x30, 0x20, 0x04, 0x06, 0x60, 0x20, 0x44, 0x03, 0xC0, 0x22, 0x44, 0x01, 0x80, 0x22, 0x44, 0x01, 0x80, 0x22, 0x44, 0x01, 0x80, 0x22, 0x44, 0x01, 0x80, 0x22, 0x44, 0x01, 0x80, 0x22, 0x44, 0x01, 0x80, 0x22, 0x66, 0x01, 0x80, 0x66, 0x33, 0x01, 0x80, 0xCC, 0x19, 0x81, 0x81, 0x98, 0x0C, 0xC1, 0x83, 0x30, 0x07, 0xe1, 0x87, 0xe0, 0x03, 0x3f, 0xfc, 0xc0, 0x03, 0x31, 0x8c, 0xc0, 0x03, 0x33, 0xcc, 0xc0, 0x06, 0x64, 0x26, 0x60, 0x0c, 0xcc, 0x33, 0x30, 0x18, 0xcc, 0x33, 0x18, 0x10, 0xc4, 0x23, 0x08, 0x10, 0x63, 0xC6, 0x08, 0x10, 0x30, 0x0c, 0x08, 0x10, 0x18, 0x18, 0x08, 0x10, 0x00, 0x00, 0x08};
Trang 16Bài t p 3.1
V hình khép kín v i các m u tônh sau:
Trang 17glPopMatrix(); // restore the old matrix glFlush();
} void main(int argc, char** argv) {
Trang 18} void myDisplay(void) {
Cho tam giác A(3, 1), B(1, 3), C(3,3)
1 Hãy xác nh t a m i c a các nh tam giác sau khi xoay m t góc 900 ng c chi u kim
ng h xung quanh i m P(2, 2)
2 Phóng to tam giác lên hai l n, gi nguyên v trí c a i m C Tính t a các nh tam giác sau khi bi n hình
Trang 19glClearColor (0.0, 0.0, 0.0, 0.0);
} void myInit(void) {
glClear(GL_COLOR_BUFFER_BIT);
glutWireCube(1); // Ve lap phuong glFlush();
} void main(int argc, char** argv) {
glClearColor (0.0, 0.0, 0.0, 0.0);
}
Trang 20
void myInit(void) {
V l p ph ng trong kh i quan sát ph i c nh t ng quát (Frustum)
#include <GL/glut.h> // GLUT
#include <GL/glu.h> // GLU
#include <GL/gl.h> // OpenGL void init(void)
{ glClearColor (1.0, 1.0, 1.0, 0.0);
} void myDisplay(void) {
Trang 21dvduc-2007/08
20
glFlush ();
} void myReshape(int w, int h) {
glViewport (0, 0, (GLsizei) w, (GLsizei) h);
glutInit(&argc, argv); // OpenGL initializations glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(400, 400); // create a 400x400 window glutInitWindowPosition(0, 0); // in the upper left glutCreateWindow("Thi du 5.3"); // create the window glutDisplayFunc(myDisplay); // setup callbacks glutReshapeFunc(myReshape);
init();
glutMainLoop(); // start it running return 0; // ANSI C expects this }
Trang 22Bài VI Mô hình hóa ba chi u
Thí d 6.1
V ng cong Bézier v i 4 i m i u khi n nh sau:
{ -4.0, -4.0, 0.0}, { -2.0, 4.0, 0.0},{2.0, -4.0, 0.0}, {4.0, 4.0,0.0}
#include <GL/glut.h> // GLUT
#include <GL/glu.h> // GLU
#include <GL/gl.h> // OpenGL
#include <stdlib.h>
GLfloat ctrlpoints[4][3] = {
{ -4.0, -4.0, 0.0}, { -2.0, 4.0, 0.0}, {2.0, -4.0, 0.0}, {4.0, 4.0, 0.0}};
void init(void) {
glEnd();
glFlush();
} void reshape(int w, int h) {
glViewport(0, 0, (GLsizei) w, (GLsizei) h);
glLoadIdentity();
}
Trang 23V m t cong Bézier v i t p i u khi n cho tr c.
void display(void) {
for (i = 0; i <= 30; i++) glEvalCoord2f((GLfloat)i/30.0, (GLfloat)j/8.0);
glEnd();
glBegin(GL_LINE_STRIP);
for (i = 0; i <= 30; i++) glEvalCoord2f((GLfloat)j/8.0, (GLfloat)i/30.0);
glEnd();
} glPopMatrix ();
glFlush();
}
Trang 24void init(void){
glViewport(0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= h) glOrtho(
else glOrtho(
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
} int main(in{
)1(3) t t
)1(
3t t
glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, &
4.0*(GLfloat)h/(GLfloat)w, 4.0*(GLfloat)h/(GLfloat)w, 4.0*(GLfloat)w/(GLfloat)h, 4.0*(GLfloat)w/(GLfloat)h,
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
3
V V V V t
glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, &ctrlpoints[0][0][0]);
4.0*(GLfloat)h/(GLfloat)w, 4.0*(GLfloat)h/(GLfloat)w, 4.0*(GLfloat)w/(GLfloat)h, 4.0*(GLfloat)w/(GLfloat)h, -4.0, 4.0,
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
Trang 25M t ng cong Bézier b c 3 có b n i m i u khi n P0=(2, 2, 0), P1=(4, 2, 2), P2=(8, 6, 4),
P3=(12, 0, 0) Gi s R(t) là ng cong Bézier b c hai liên t c c p C1 t i P3 c a ng cong trên
ng th i gi s R0, R1 và R2 là các i m i u khi n c a ng cong này Hãy xác nh R0 và R1
3 2 1 0 2 2
2 '
3)23(3)143(3)1(3)(
V V V V t t
t t
t t
t Q
)(
3 0
033)0(' )(
3 3
300)1(
G F E D Q
C D D
C B A P
Trang 26Bài VII Lo i b m t khu t
glClearColor (1.0, 1.0, 1.0, 0.0);
} void myDisplay(void) {
Trang 27#include <GL/glut.h> // GLUT
#include <GL/glu.h> // GLU
#include <GL/gl.h> // OpenGL
#include <stdio.h>
#include <math.h>
int a[3]={1.0,1.0,1.0}, b[3]={1.0,-1.0,1.0}, c[3]={-1.0,-1.0,1.0}, d[3]={-1.0,1.0,1.0}, e[3]={1.0,1.0,-1.0}, f[3]={1.0,-1.0,-1.0}, g[3]={-1.0,-1.0,-1.0}, h[3]={-1.0,1.0,-1.0};
float angle_x=0.0;
float angle_y=0.0;
void drawcube(void) { glClear(GL_COLOR_BUFFER_BIT);
Trang 28glViewport (0, 0, (GLsizei) w, (GLsizei) h);
Trang 29glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(400, 400); // create a 400x400 window glutInitWindowPosition(0, 0); // in the upper left glutCreateWindow("Thi Du 7.2"); // create the window glutDisplayFunc(myDisplay); // setup callbacks glutKeyboardFunc(keyboard);
glutReshapeFunc(myReshape);
glutMainLoop(); // start it running return 0; // ANSI C expects this }
Thí d 7.3
V và tô màu kh i a di nv i các nh cho tr c và b sung các phím x, y xoay kh i a di n
#include <GL/glut.h> // GLUT
#include <GL/glu.h> // GLU
#include <GL/gl.h> // OpenGL
#include <stdio.h>
#include <math.h>
int a[3]={0.0,0.0,0.0}, b[3]={1.0,-1.0,1.0}, c[3]={-1.0,-1.0,1.0}, d[3]={-1.0,1.0,1.0}, e[3]={1.0,1.0,-1.0}, f[3]={1.0,-1.0,-1.0}, g[3]={-1.0,-1.0,-1.0}, h[3]={-1.0,1.0,-1.0};
float angle_x=0.0;
float angle_y=0.0;
void drawcube(void) { glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glRotatef(angle_y, 0.0, 1.0, 0.0);
glRotatef(angle_x, 1.0, 0.0, 0.0);
// - glColor3f(1.0, 0.0, 0.0);//red glBegin(GL_POLYGON);
glVertex3iv(d);
glVertex3iv(h);
Trang 30glVertex3iv(g);
glVertex3iv(c);
glEnd();
glColor3f(0.0, 1.0, 0.0); // green glBegin(GL_POLYGON);
Trang 31dvduc-2007/08
30
{ glClearColor(1., 1., 1., 1.0);
glViewport (0, 0, (GLsizei) w, (GLsizei) h);
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB| GLUT_DEPTH);
glutInitWindowSize(400, 400); // create a 400x400 window glutInitWindowPosition(0, 0); // in the upper left glutCreateWindow("Thi Du 7.3"); // create the window glutDisplayFunc(myDisplay); // setup callbacks
Trang 32glutReshapeFunc(myReshape);
glutMainLoop(); // start it running return 0; // ANSI C expects this}
Bài t p 7.1
V và tô màu hình chóp cha={1.0,0.0,0.0}, b={0.0,0.0,
B sung phím x, y v
Bài t p 7.2
V và tô màu hình chóp cha={
p 7.2
à tô màu hình chóp cha={2.0,0.0,0.0}, b={0.0,0.0,
l p ph ng v i kích thsung phím x, y và z
à z xoay hình chóp
à tô màu hình chóp ch nh t v i các nh nh.0,0.0,0.0}, b={0.0,0.0,-
nh t v i các nh nh-2.0}, c={-2.0,0.0,
Trang 33#include <GL/glut.h> // GLUT
#include <GL/glu.h> // GLU
#include <GL/gl.h> // OpenGL void init(void)
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_DEPTH_TEST);
} void display(void) {
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glutSolidSphere (1.0, 20, 16);
glFlush ();
} void reshape (int w, int h) {
glViewport (0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity();
if (w <= h) glOrtho(-1.5, 1.5, -1.5*(GLfloat)h/(GLfloat)w, 1.5*(GLfloat)h/(GLfloat)w, -10.0, 10.0); else
glOrtho (-1.5*(GLfloat)w/(GLfloat)h,1.5*(GLfloat)w/(GLfloat)h, -1.5, 1.5, -10.0, 10.0); glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
} int main(int argc, char** argv) {