Professional Documents
Culture Documents
Hướng dẫn:
I. Chọn đối tượng (Picking)
Bổ sung thêm button SELECT trên thanh toolbar để thực hiện chọn lựa đối tượng. Sử dụng giải
thuật ở phần 3.8.1 trong sách Interactive Computer Graphics.
II. Di chuyển (Moving)
Sử dụng thêm biến m_center trong class CGeometricObject thể hiện tâm của đối tượng. Khi đối
tượng thay đổi vị trí ta cập nhật lại tọa độ của biến này.
a. Tọa độ viewport
Chúng ta cần lấy thông tin viewport hiện tại. Thông tin mà chúng ta cần là vị trí (x, y) của
viewport và kích thước (width, height) của viewport).
Một khi chúng ta lấy được những thông tin này bằng cách sử dụng hàm
glGetIntegerv(GL_VIEWPORT, viewport), biến viewport sẽ lưu giữ thông tin sau:
viewport[0]=x
viewport[1]=y
viewport[2]=width
viewport[3]=height
b. Ma trận ModelView
Sau khi có được thông tin viewport, chúng ta có thể lấy được thông tin về ModelView. Ma trận
ModelView giúp xác định các đỉnh của OpenGL primitives được biến đổi như thế nào trong hệ tọa độ mắt
nhìn.
GLdouble modelview[16]; // Where The 16 Doubles Of The Modelview Matrix Are To Be
Stored
glGetDoublev(GL_MODELVIEW_MATRIX, modelview); // Retrieve The Modelview Matrix
c. Ma trận chiếu
Sau đó chúng ta cần lấy thông tin ma trận chiếu. Ma trận chiếu biến đổi đỉnh trong hệ tọa độ mắt
nhìn đến hệ tọa độ clipping.
Chú ý rằng hệ tọa độ windows bắt đầu vị trí (0, 0) nằm ở góc trên bên trái trong khi đó hệ tọa độ
OpenGL bắt đầu ở góc dưới bên trái. Do đó, ta phải chuyển sang tọa độ OpenGL bằng cách sau đây:
winY = (float)viewport[3] - winY; // Subtract The Current Mouse Y Coordinate From The
Screen Height.
Đến đây chúng ta vẫn còn thiếu tọa độ z. Đây là cách dùng để lấy tọa độ này:
Toàn bộ đoạn mã dùng để chuyển từ hệ tọa độ cửa sổ màn hình (windows) sang hệ tọa độ
OpenGL như sau:
winX = (float)x;
winY = (float)viewport[3] - (float)y;
glReadPixels( x, int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ );
Bước 3 : Di chuyển đối tượng song song với đường thẳng nối giao điểm (tìm được ở bước số 2)
và vị trí mới.
Sử dụng thêm biến m_scale (véc tơ 3 chiều) trong class CGeometricObject để thể hiện kích
thước của đối tượng.
Sử dụng phím để tăng hoặc giảm kích thước của đối tượng theo các trục Ox, Oy, Oz.
CQuaternion m_rotObject;