Hình 2.2 là cửa sổ khi bắt đầu ứng dụng thể hiện một hình cầu 3-D .Thơng qua hình cầu này ta cĩ thể minh họa được một số giải thuật đồ họa 3-D.
Hình 2.2: Trước khi thực
KILOBOOKS.COM
2.2.1. Các phép biến hình OpenGL.
Trước khi thực hiện các phép biến hình thì đối tượng hình cầu được khởi động bằng
các giá trị: m_xRotation = 0.0f; m_yRotation = 0.0f; m_zRotation = 0.0f; m_xTranslation = 0.0f; m_yTranslation = 0.0f; m_zTranslation = -5.0f; m_xScaling = 1.0f; m_yScaling = 1.0f; m_zScaling = 1.0f; 2.2.1.1.Phép tịnh tiến:
Để thực hiện phép tịnh tiến ta dùng phím phải của con chuột để di chuyển hình cầu, các biến m_xTranslation, m_yTranslation, m_zTranslation nhận giá trị mới thì
InvalidateRect được gọi để vẽ lại hình.
KILOBOOKS.COM
2.2.1.2. Phép Quay:
Ngược lại với phép tịnh tiến để thực hiện phép quay ta dùng phím trái của con
chuột để điều khiển hình cầu quay theo các trục tuỳ ý, lúc này các biến m_xRotation,
m_yRotation, m_zRotation nhận giá trị mới thì InvalidateRect được gọi để vẽ lại hình.
Hình 2.2.1.2: Sau khi thực hiện phép quay
2.2.1.3. Phép Co giãn:
Để thực hiện phép co giãn hình cầu ta thơng qua ba thanh trượt tương ứng với ba
trục X, Y, Z. Thanh trựơt cĩ giá trị từ 1 – 100, khi ta di chuyển các thanh trượt các biến
m_xScaling, m_yScaling, m_zScaling nhận giá trị mới thì InvalidateRect được gọi để vẽ
lại hình.
Hình 2.2.1.3: Sau khi thực hiện phép co giản theo ba trục
2.2.2. Kiểu bĩng , chiếu sáng, hiệu ứng răng cưa và các thao tác vẽ đối tượng 3-D: 2.2.2.1. Kiểu bĩng:
Một phương diện quan trọng của OpenGL là kiểu bĩng dùng thể hiện đối tượng trong
cảnh. Co hai kiểu bĩng: mượt (smooth) và phẳng (flat). Để chọn kiểu bĩng, sử dụng hàm
glShadeMode() như sau:
KILOBOOKS.COM
Đối số đơn của hàm là hằng thể hiện kiểu bĩng được chọn, là GL_SMOOTH, hoặc
GL_FAT. Với bĩng mượt, OpenGL phải xác định màu bĩng cho từng pixel trên đa giác. Trong đối số bĩng phẳng, toàn bộ đa giác dùng chung một màu bĩng. Hàm
OnCheckSmooth() kiểm tra kiểu bĩng.
void CFormCommandView::OnCheckSmooth() {
// TODO: Add your control notification handler code here m_Smooth = !m_Smooth; If(m_Smooth) glShadeModel(GL_SMOOTH); else glShadeModel(GL_FLAT); this->GetRenderView()->InvalidateRect(NULL,FALSE);
Hình 2.2.2.1a:Kiểu bĩng mượt Hình 2.2.2.1 Kiểu bĩng phẳng
2.2.2.2. Chiếu sáng đối tượng:
Đầu tiên đối tượng được vẽ cĩ màu trong suốt để đối tượng cĩ ánh sáng chiếu với
màu sắc tùy ý chương trình sử dụng CColorDialog cho người dùng tùy ý chọn.
Hình 2.2.2.2a: Chọn màu chiếu sáng Hình 2.2.2.2b:Chiếu sáng
KILOBOOKS.COM
Trên màn hình, một đường thẳng là tập hợp của các pixel được chiếu sáng trong hệ
thống kẽ ơ vuơng. Do đĩ, chỉ cĩ đường nằm ngang hoặc thẳng đứng là được vẽ một cách
suơng sẽ. Cịn các đường nghiêng sẽ cĩ hiện tượng răng cưa. Hàm OnCheckAntialias() sẽ
làm giảm hiệu ứng răng cưa:
void CFormCommandView::OnCheckAntialias() { m_Antialias = !m_Antialias; if(m_Antialias) { glEnable(GL_LINE_SMOOTH); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glHint(GL_LINE_SMOOTH_HINT,GL_NICEST); glLineWidth(1.5); } else { glDisable(GL_LINE_SMOOTH); glDisable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glHint(GL_LINE_SMOOTH_HINT,GL_NICEST); glLineWidth(1.0); } GetRenderView()->InvalidateRect(NULL,FALSE); }
Hình 2.2.2.3a:Chưa khử răng cưa Hình 2.2.2.3b:Đã khử răng cưa
2.2.2.4. Các thao tác vẽ đối tượng 3-D:
Đa giác là hình tạo bởi các đường nối (cạnh) giữa một tập hợp các vertex. Một đa
giác cĩ ít nhất ba cạnh. Như vậy, đa giác đơn giản nhất là tam giác.
OpenGL cĩ thể vẽ đa giác như các điểm, các đường ngồi, hay đối tượng đặc.
KILOBOOKS.COM
giác OpenGL cĩ hai mặt trước và sau cĩ thể vẽ theo cách riêng, và cĩ thể quay một đa giác để xem mặt bên kia.
Hàm glPogonMode() được dùng để vẽ đa giác:
Chương trình cho phép vẽ hình cầu với các chế độ điểm (GL_POINT), khung lưới (GL_LINE), đa giác đặc (GL_FILL).
void CFormCommandView::OnRadioModel0() { glPolygonMode(GL_FRONT_AND_BACK,GL_POINT); this->GetRenderView()->InvalidateRect(NULL,FALSE); } void CFormCommandView::OnRadioModel0() { glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); this->GetRenderView()->InvalidateRect(NULL,FALSE); } void CFormCommandView::OnRadioModel0() { glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); this->GetRenderView()->InvalidateRect(NULL,FALSE); }
KILOBOOKS.COM
Hình 2.2.2.4a: Hình cầu vẽ bằng khung lưới
Hình 2.2.2.4b: Thao tác vẽ hình cầu đặc
Hình 2.2.2.4c: Hình cầu vẽ bằng điểm