9-Thể hiển toạ độ 3 chiều:
Đến giờ các bạn mới biết đến toạ độ 2 chiều trong opengl, nếu chỉ có vậy thì chẳng khác gì trong lập trình Window cả.Vì vậy trong phần này chúng ta sẽ cùng xem opengl vẽ các hình 3 chiều như thế nào.
/*filename : rotated45.cpp*/
#ifdef unix
#include
#include "aux.h"
#define CALLBACK
#else
#include
#include
#include
#endif
GLvoid CALLBACK draw(void)
{
glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT);
glRotated(45,0.0,1.0,0.0); /*quay quanh trục OY 45 độ*/
glBegin(GL_QUADS);
glColor3d(1.0,0.0,0.0);
glVertex2d(0.1,0.1);
glColor3d(0.0,1.0,0.0);
glVertex2d(0.9,0.1);
glColor3d(0.0,0.0,1.0);
glVertex2d(0.9,0.9);
glColor3d(1.0,0.0,1.0);
glVertex2d(0.1,0.9);
glEnd();
glFlush();
}
GLvoid CALLBACK resize(GLsizei w,GLsizei h)
{
glLoadIdentity();
glViewport(0,0,w,h);
glOrtho(-1.0,1.0,-1.0,1.0,0.0,1.0);
}
int main(int argc, char *argv[])
{
auxInitPosition(200,100,640,480);
auxInitDisplayMode(AUX_RGBA);
auxInitWindow(argv[0]);
auxReshapeFunc(resize);
auxMainLoop(draw);
return 0;
}
Chương trình này không có gì đặc biệt ngoài hàm glRotated() , hàm này cho phép chúng ta quay hình tứ giác của chúng ta quanh trục OY với góc quay 45 độ.Tham số đầu tiên của nó là góc sẽ được quay, 3 tham số sau là tham số của vector mà hình của chúng ta sẽ quay với góc quay trên.Bạn nhận thấy rằng các giá trị của vector chúng ta là : toạ độ x bằng 0, toạ độ y bằng 1, toạ độ z bằng 0. Tức là véctơ của chúng ta thẳng đứng theo trục OY, bạn có thể thay đổi các thông số của vector này để kiểm nghiệm hàm này xem !Các giá trị của các thông số này là kiểu double.(Chú ý nếu không thử các thông số khác thì bạn sẽ rất khó để quan sát hàm này hoạt động ra sao )
Tiếp theo tôi xin trình bày với các bạn cách vẽ một hình lập phương thật sự bằng opengl.
/*filename cube1.cpp*/
#ifdef unix
#include
#include "aux.h"
#define CALLBACK
#else
#include
#include
#include
#endif
GLdouble vertex[][3]={ /*Khai báo dữ liệu cho tám đỉnh của hình lập phương*/
{0.0,0.0,0.0},
{1.0,0.0,0.0},
{1.0,1.0,0.0},
{0.0,1.0,0.0},
{0.0,0.0,1.0},
{1.0,0.0,1.0},
{1.0,1.0,1.0},
{0.0,1.0,1.0}
};
int edge[][2]={ /*Khai báo các cạnh, mà chúng ta sẽ sư dụng dữ liệu*/
{0,1}, /*của các đỉnh bên trên*/
{1,2},
{2,3},
{0,3},
{4,5},
{5,6},
{6,7},
{7,4},
{0,4},
{1,5},
{2,6},
{3,7}
};
GLvoid CALLBACK draw(void)
{
int i;
glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT);
glColor3d(1.0,1.0,1.0);
glBegin(GL_LINES);
for(i=0;i<12;i++){
glVertex3dv(vertex[edge[i][0]]); /*hàm mới*/
glVertex3dv(vertex[edge[i][1]]); /*hàm mới*/
}
glEnd();
glFlush();
}
GLvoid CALLBACK resize(GLsizei w,GLsizei h)
{
glLoadIdentity();
glViewport(0,0,w,h);
glOrtho(-2.0,2.0,-2.0,2.0,0.0,2.0);
//gluPerspective(30.0,1.0,1.0,10.0);
//gluLookAt(3.0,4.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0);
}
int main(int argc, char *argv[])
{
auxInitPosition(200,100,512,512);
auxInitDisplayMode(AUX_RGBA);
auxInitWindow(argv[0]);
auxReshapeFunc(resize);
auxMainLoop(draw);
return 0;
}
Phần khai báo dữ liệu, đối với các bạn chắc thật dễ hiểu, điều đáng nói thứ nhất là chúng ta dùng hàm glVertex3dv() thay cho các hàm vẽ đỉnh 2 chiều trước đây, hàm này nhận tham số là thành viên của mảng, giá trị của các thành viên phải là double, và nó có toạ độ 3 chiều.
Trước hết biên dịch chương trình trên, bạn sẽ chưa thấy gì nếu không cho hai hàm mà tôi đã đánh dấu đỏ bên trên vào.Các bạn hãy nhớ lại cách quan sát bằng glOrtho() trước đây và dễ dàng nhận thấy chúng ta không thể nhìn thấy toàn bộ hình lập phương được mà chỉ là một hình vuông, vì cách nhìn bằng glOrtho() chỉ cho ta nhìn song song thôi.Chính vì vậy mà chúng ta phải chuyển qua cách quan sát bằng gluPerspective(), bốn tham số của nó được trình bày như sau:
void gluPerspective(GLdouble fovy, GLdouble aspect,
GLdouble near, GLdouble far);
Tham số đầu tiên là góc quan sát trong mặt phẳng XOZ, trong ví dụ trên góc đó là 30độ, tham số thứ hai là tỉ lệ giữa w và h, nó bằng w/h, tham số thứ 3 và thứ 4 thì hẳn các bạn đã quen khi quan sát bằng glOrtho().Nếu chỉ có hàm này không thôi thì chúng ta vẫn chưa quan sát được hình lập phương mà chúng ta vẽ. Để quan sát được chúng ta phải dùng thêm hàmgluLookAt()
Hàm này có tới 9 tham số, nhưng thực ra nó nằm trong 3 tham số chính.Tham số đầu tiên là vị trí của mắt, cũng có thể coi đó là vị trí của camera(chú ý là trong toạ độ 3 chiều, nên vị trí của mắt chứa 3 toạ độ), tham số thứ 2 là điểm nhìn, và tham số thứ 3 gọi là upvector, từ này không biết dịch ra tiếng việt ra sao.Upvector , hãy tưởng tượng bạn đang theo dõi một vật, upvector chính là vector từ tim bạn lên đỉnh đầu, nếu thay đổi số liệu cũng tương tự như bạn nghiêng đầu sang phải sang trái.Vậy là 9 tham số đã rõ, bây giờ hãy bỏ lệnh glOrtho()đi và cho 2 lệnh đánh dấu đỏ vào, chúng ta sẽ quan sát được hình lập phương đó, mã nguồn nằm trong file cube2.cpp
Sách - Truyện Khác
Lựa Chọn Phương Pháp Mã Hoá Ký Tự Unicode
Đặng Minh Tuấn
Khi Máy Tính Của Bạn Bị Tấn Công
Minh Chung
Khái Quát Về Kết Nối Adsl
Không rõ
Khắc Phục Một Số Lỗi Modem
Không rõ
Kể Chuyện Về Kim Loại
X.I. Venetxki
Keepass 0.93B (Kp): “Két Sắt” An Toàn Cho Mọi Mật Khẩu
Lê Nguyễn Bảo Nguyên
Học Thuyết Darwin, Phật Giáo Và Thiên Chúa Giáo
Tiến sĩ Amarasiri Weeraratne
Hố Đen Cực Lớn Làm Các Nhà Thiên Văn Đau Đầu
Thiên văn vũ Trụ
Hệ Mặt Trời Sẽ Sụp Đổ Như Thế Nào?
Thiên văn vũ Trụ
Gió Hạt Tốc Độ Cao Làm Khí Quyển Mặt Trời Nóng Lên
Thiên văn vũ Trụ
Giáo Trình C++
Khuyết Danh
Giai Điệu Giây Và Bản Giao Hưởng Vũ Trụ
Brian Greene
Gis Và Môi Trường
Không rõ
Dùng Telnet Truy Cập Mail Server Pop3
Vũ Huy Bằng
Địa Đàng Ở Phương Đông
Stephen Oppenheimer
Đạo Phật Siêu Khoa Học
Minh Giác Nguyễn Học Tài
Con Tằm
Vô Danh
Chống Spam Với Postfix Và Spamassassin
Trần Quang Hoàng



