Kỹ thuật giả billboard trụ sẽ thực hiện quay đối tượng billboard quanh một trục sao cho vector pháp tuyến của nó song song với hình chiếu của vector hướng nhìn của camera xuống mặt phẳng xoz.
Các kỹ thuật billboard trình bày trong luận văn này sẽ được thực hiện việc quay đối tượng thông qua việc biến đổi ma trận mẫu sau:
Ba giá trị phía trên của cột bên phải cho biết sự liên quan giữa vị trí hiện tại của đối tượng với vị trí và hướng nhìn của camera. Ma trận con 3x3 M1 chứa các thông tin về tỷ lệ và hướng quay.
Chúng ta sẽ phân tích kỹ hơn về cấu trúc của ma trận con này. Ma trận này chứa 3 cột, và mỗi cột có một ý nghĩa riêng. Cột đầu tiên là right vector, cột thứ hai là up vector và cột thứ ba đại diện cho lookAt vector. Những vector này có liên quan tới hướng của camera. Khi chuyển ma trận con này thành ma trận đơn vị sẽ khiến cho camera được căn theo hệ trục toàn cục. Để thực hiện kỹ thuật giả
billboard trụ, ta chỉ cần quan tâm tới right và lookAt vector, còn up vector là không thay đổi.
Với phương pháp này thì đối tượng billboard sẽ không thay đổi khi camera quay lên trên hoặc quay xuống dưới. Billboard sẽ chỉ quay khi mà camera quay sang bên trái hoặc bên phải.
Kiểu billboard này có thể áp dụng để biểu diễn những cái cây. Những cái cây sẽ không bị uốn cong về phía sau hoặc về phía trước khi mà camera quay xuống dưới hoặc lên trên bởi vì up vector đã được cố định, do đó khả năng thể hiên của nó sẽ không được sinh động. Lưu ý là ảo giác này sẽ thất bại khi mà bạn bay lên phía trên của những cái cây. Khi đó những cái cây này sẽ ngày càng trở lên mảnh hơn và cuối cùng sẽ hoàn toàn bị biến mất. Tuy nhiên, với những ứng dụng mà trong đó bạn luôn được giữ để đứng trên mặt đất thì billboard trụ thực sự là một lựa chọn tốt.
Sau đây là mã nguồn cho phương pháp giả billboard trụ.
float modelview[16]; int i,j;
// save the current modelview matrix glPushMatrix();
// get the current modelview matrix
glGetFloatv(GL_MODELVIEW_MATRIX , modelview); // The only difference now is that
// the i variable will jump over the
// up vector, 2nd column in OpenGL convention for( i=0; i<3; i+=2 )
if ( i==j )
modelview[i*4+j] = 1.0; else
modelview[i*4+j] = 0.0; }
// set the modelview matrix with the // up vector unchanged
glLoadMatrixf(modelview); drawObject();
// restores the modelview matrix glPopMatrix();
Đoạn mã trên cũng được chia làm hai hàm, đó là biểu diễn và vẽ đối tượng. Chức năng thứ nhất là thiết lập ma trận modelview, còn chức năng thứ hai sẽ phục hồi là ma trận hiện thời.
void billboardCheatCylindricalBegin() { float modelview[16];
int i,j;
// save the current modelview matrix glPushMatrix();
// get the current modelview matrix
glGetFloatv(GL_MODELVIEW_MATRIX , modelview); for( i=0; i<3; i+=2 )
if ( i==j )
modelview[i*4+j] = 1.0; else
modelview[i*4+j] = 0.0; }
// set the modelview matrix glLoadMatrixf(modelview); }
void billboardEnd() { // restore the previously // stored modelview matrix glPopMatrix();
}
Đoạn mã biểu diễn đối tượng billboard trở thành:
billboardCheatCylindricalBegin(); drawObject();
billboardEnd();
Với phương pháp này, các phép tỷ lệ theo trục X và Y sẽ bị mất, nhưng phép tỷ lệ theo trục Z thì vẫn được thực hiện. Lựa chọn tốt nhất là thực hiện các phép tỷ lệ sau khi gọi hàm billboardCheatCylindricalBegin().