CHƢƠNG 2 : CÁC KỸ THUẬT TẠO LẬP BILLBOARD
2.2. Các kỹ thuật billboard cầu
2.2.1. Kỹ thuật giả billboard cầu
Kỹ thuật giả billboard cầu sẽ thực hiện quay đối tượng billboard quanh một tâm sao cho vector pháp tuyến của nó song song với vector hướng nhìn của camera.
Hình ảnh sau đây chỉ mang tính chất minh họa. Nó thể hiện một người tuyết và một vài cái cây được áp dụng kỹ thuật billboard. Thật khó để có thể nói rằng những cái cây không hướng về phía của camera. Nhưng thực tế là, người ta làm cho bề mặt của cái cây hướng vuông góc với hướng nhìn của camera.
2.5 Phƣơng pháp giả billboard cầu
Sơ đồ dưới đây thể hiện điều gì đã thực sự xảy ra. Vòng tròn màu đen ở phía dưới biểu diễn cho camera. Vector xuất phát từ camera chỉ hướng nhìn hiện tại của camera. Vector này chỉ ra phương của mặt phẳng vuông góc với hướng nhìn của camera. Các đối tượng trong các tình huống từ O1 tới O3 được quay sao cho vector pháp tuyến của chúng luôn hướng về phía mặt phẳng này. Điều này khiến cho đối tượng dường như là được đặt vào một hệ trục cục bộ và bề mặt của nó thì luôn hướng về phía chiều dương của trục Z.
2.6 Bản chất của phƣơng pháp giả billboard cầu
Để thực hiện được kỹ thuật này người ta cũng sử dụng một ma trận mẫu như ở phần trước. Ma trận này lưu trữ thông tin về các biến đổi hình học, hướng
Khi ma trận con M1 được chuyển thành ma trận đơn vị, các phép tỷ lệ và quay sẽ bị loại bỏ, theo đó hướng nhìn của camera sẽ được căn theo trục Z của hệ trục toàn cục, vector up và right của camera cũng được căn theo các trục của hệ trục tọa độ toàn cục. Dạng billboard này hoạt động theo kiểu giả billboard cầu, tâm của billboard là gốc tọa độ cục bộ. Nếu sử dụng kiểu billboard này cho những cái cây, thì khi người dùng nhìn lên trên hoặc xuống dưới, những cái cây sẽ bị kéo về phía trước hoặc phía sau.
Trong thực tế, khi chuyển ma trận con này thành ma trận đơn vị có nghĩa là đối tượng sẽ không chịu một phép quay nào khi nó được biểu diễn. Do đó nó sẽ được biểu diễn giống như khi mà camera hướng về phía chiều âm của trục tọa độ Z. Chú ý là phép tỉ lệ cũng sẽ bị phá vỡ, vì vậy các phép tỷ lệ cần phải được thực hiện sau khi thực hiện các phép biến đổi trên mà trận mẫu.
Đầu tiên, ma trận mẫu hiện tại sẽ được lưu lại. Sau đó ma trận này sẽ được đem ra biến đổi, ma trận con 3x3 ở góc trên bên trái sẽ được chuyển thành ma trận đơn vị. Ma trận này sẽ được nạp vào cho máy trạng thái OpenGL, và biểu diễn đối tượng tại gốc trục tọa độ cục bộ. Cuối cùng mà trận mẫu gốc sẽ được phục hồi.
float modelview[16]; int i,j;
// save the current modelview matrix glPushMatrix();
// get the current modelview matrix
glGetFloatv(GL_MODELVIEW_MATRIX , modelview); // undo all rotations
// beware all scaling is lost as well for( i=0; i<3; i++ )
for( j=0; j<3; j++ ) { if ( i==j ) modelview[i*4+j] = 1.0; else modelview[i*4+j] = 0.0; }
// set the modelview with no rotations and scaling glLoadMatrixf(modelview);
drawObject();
// restores the modelview matrix glPopMatrix();
Với đoạn mã trên, đối tượng sẽ quay để luôn đối mặt với mặt phẳng trực giao với hướng nhìn của camera. Tâm quay chính là gốc của hệ trục cục bộ. Đoạn mã trên thực hiện hai chức năng, đó là chức năng biểu diễn và vẽ đối tượng. Chức năng đầu tiên sẽ thiết lập ma trận modelview, và chức năng thứ hai sẽ phục hồi lại ma trận hiện thời.
void billboardCheatSphericalBegin() { float modelview[16];
int i,j;
// save the current modelview matrix glPushMatrix();
// get the current modelview matrix
// undo all rotations
// beware all scaling is lost as well for( i=0; i<3; i++ )
for( j=0; j<3; j++ ) { if ( i==j ) modelview[i*4+j] = 1.0; else modelview[i*4+j] = 0.0; }
// set the modelview with no rotations glLoadMatrixf(modelview);
}
void billboardEnd() { // restore the previously // stored modelview matrix glPopMatrix();
}
Mã nguồn để biểu diễn đối tượng billboard sẽ trở thành:
billboardCheatSphericalBegin(); drawObject();
billboardEnd();
Như đã nói ở trên, các thao tác tỷ lệ sẽ bị mất khi thiết lập ma trận modelview. Nếu muốn thực hiện các phép tỷ lệ trên đối tượng, bạn cần phải thực
hiện nó sau khi thực hiện các cài đặt cho đối tượng billboard bằng đoạn mã ở trên. billboardCheatSphericalBegin(); glScalef(1,2,1); drawObject(); billboardEnd()
Phương pháp giả billboard trụ hoạt động hoàn toàn giống như phương pháp giả billboard cầu trong trường hợp người dùng chỉ thực hiện được các thao tác quay sang phải hoặc sang trái. Phương pháp này chỉ có sự khác biệt khi người dùng thực hiện các thao tác quay lên trên hoặc xuống dưới. Khi này, đối tượng billboard sẽ bị kéo về phía trước hay đẩy về phía sau.