2010-07-31 110 views
14

Tôi không muốn nhận được vào lượng giác phức tạp để tính toán phép quay và những thứ tương tự cho thế giới 3D của tôi nên gluLookAt có vẻ như là một lựa chọn tốt đẹp. Theo tài liệu hướng dẫn tất cả những gì tôi cần làm là đặt 3 tọa độ cho vị trí camera, ba cho những gì tôi nên nhìn vào và một vị trí "lên". Việc cuối cùng không có ý nghĩa cho đến khi tôi giả định nó đã được ở góc bên phải với các dòng của tầm nhìn theo hướng phía trên cùng của màn hình nên được.Làm cách nào để sử dụng gluLookAt đúng cách?

Nó không hoạt động như thế chút nào. Tôi có một số mã python. Đây là mã mà initialises một số dữ liệu và một số mã chế độ cho khi tôi nhập này là một phần của trò chơi:

def init(self): 
    self.game_over = False 
    self.z = -30 
    self.x = 0 
def transfer(self): 
    #Make OpenGL use 3D 
    game.engage_3d(45,0.1,100) 
    gluLookAt(0,0,-30,0,0,0,0,1,0) 

"game.engage_3d (45,0.1,100)" về cơ bản thiết lập ma trận chiếu để có một Góc ngắm 45 độ và tọa độ gần và xa là 0,1 và 100.

Đầu tiên gluLookAt đặt máy ảnh ở đúng vị trí, độc đáo.

Tôi có hình lập phương được vẽ với tâm (0,0,0) và nó hoạt động tốt mà không cần gluLookAt. Trước khi tôi vẽ nó, tôi có mã này:

gluLookAt(self.x,0,self.z,0,0,0,0,1,0) 
if game.key(KEY_UP): 
    self.z += 2.0/game.get_fps() 
if game.key(KEY_DOWN): 
    self.z -= 2.0/game.get_fps() 
if game.key(KEY_LEFT): 
    self.x += 2.0/game.get_fps() 
if game.key(KEY_RIGHT): 
    self.x -= 2.0/game.get_fps() 

Bây giờ từ đó, vị trí lên luôn luôn giống như ở góc phải. Những gì tôi đã nghĩ rằng nó sẽ làm là di chuyển về phía trước và quay trở lại trục z với các phím lên và xuống và trái và phải thông qua trục x với các phím trái và phải. Điều thực sự xảy ra, là khi tôi sử dụng các phím trái và phải, khối lập phương sẽ xoay quanh "con mắt" đang được tăng tốc bởi các phím. Phím lên sẽ tạo ra một khối lập phương khác từ hư không để cắt qua màn hình và nhấn khối lập phương đầu tiên. Phím xuống mang lại khối lập phương nhân bản bí ẩn trở lại. Điều này có thể được kết hợp với vòng quay để đưa ra một kết quả hoàn toàn khác biệt như các tài liệu nói sẽ phát sinh.

Điều gì trên trái đất là sai?

Cảm ơn bạn.

Trả lời

37

(Trực giác đằng sau vectơ "lên" trong gluLookAt rất đơn giản: Hãy nhìn vào bất cứ điều gì. Bây giờ, hãy nghiêng đầu 90 độ. Bạn không thay đổi, hướng bạn đang nhìn không thay đổi, nhưng hình ảnh trong võng mạc của bạn rõ ràng có. Sự khác biệt là gì? Đầu của đầu bạn đang trỏ tới đâu. Đó là vector lên.)

Nhưng để trả lời câu hỏi của bạn: không nên ghép nối các cuộc gọi gluLookAt. Nói cách khác, mô hình duy nhất mà nó OK để sử dụng gluLookAt nếu bạn không biết chính xác cách thức hoạt động như sau:

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
gluLookAt(...); 
# do not touch the modelview matrix anymore! 

Có vẻ như từ mã của bạn rằng bạn đang làm một cái gì đó như thế này:

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
gluLookAt(...); 
# some stuff.. 
gluLookAt(...); 

Điều này sẽ tạo ra kết quả lạ, vì gluLookAt nhân ma trận hiện tại với ma trận xem mà nó tính toán. Nếu bạn muốn ghép các phép biến đổi, bạn thực sự tốt hơn khi tìm ra cách làm cho glTranslate, glScale và glRotatef hoạt động cho bạn. Thậm chí tốt hơn, bạn nên tìm hiểu cách các phép biến đổi tọa độ hoạt động và gắn bó với glMultMatrix.

+0

Cảm ơn bạn rất nhiều. Nó hoạt động hoàn hảo ngay bây giờ. Bây giờ tôi có thể chuyển sang những thứ cao cấp hơn. Nhưng bạn có nói rằng gluLookAt chậm không? –

+2

Nó không phải là nó chậm. Đó là gluLookAt giấu một vài điều mà bạn nên biết khi bạn đang làm chương trình OpenGL nghiêm túc. Đặc biệt, bạn nên học cách kết hợp các phép biến đổi tọa độ khác nhau.Điều này làm quen với việc sử dụng và ban đầu hơi bực bội, nhưng nó sẽ trả hết vào cuối: nhiều kỹ thuật đồ họa được xây dựng trên đầu trang của việc biến đổi hệ thống tọa độ một cách khéo léo. –

+36

+1 nếu bạn thực sự nghiêng đầu :-) –

Các vấn đề liên quan