2009-06-17 54 views
5

Đối với dự án của tôi, tôi cần xoay một hình chữ nhật. Tôi nghĩ, điều đó sẽ dễ dàng, nhưng tôi nhận được một hành vi không thể đoán trước khi chạy nó ..C++/OpenGL - Xoay hình chữ nhật

Đây là mã:

glPushMatrix(); 
    glRotatef(30.0f, 0.0f, 0.0f, 1.0f); 
    glTranslatef(vec_vehicle_position_.x, vec_vehicle_position_.y, 0); 
    glEnable(GL_TEXTURE_2D); 
    glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
    glBegin(GL_QUADS); 

     glTexCoord2f(0.0f, 0.0f); 
     glVertex2f(0, 0); 
     glTexCoord2f(1.0f, 0.0f); 
     glVertex2f(width_sprite_, 0); 
     glTexCoord2f(1.0f, 1.0f); 
     glVertex2f(width_sprite_, height_sprite_); 
     glTexCoord2f(0.0f, 1.0f); 
     glVertex2f(0, height_sprite_); 

    glEnd(); 
    glDisable(GL_BLEND); 
    glDisable(GL_TEXTURE_2D); 
    glPopMatrix(); 

Vấn đề với điều đó, đó là hình chữ nhật của tôi đang thực hiện một bản dịch đâu đó trong cửa sổ trong khi xoay. Nói cách khác, hình chữ nhật không giữ vị trí: vec_vehicle_position_.xvec_vehicle_position_.y.

Sự cố là gì?

Cảm ơn

Trả lời

10

Bạn cần phải lật thứ tự của sự biến đổi của bạn:

glRotatef(30.0f, 0.0f, 0.0f, 1.0f); 
glTranslatef(vec_vehicle_position_.x, vec_vehicle_position_.y, 0); 

trở thành

glTranslatef(vec_vehicle_position_.x, vec_vehicle_position_.y, 0); 
glRotatef(30.0f, 0.0f, 0.0f, 1.0f); 
+0

Cảm ơn rất nhiều, nó hoạt động! –

1

Đảm bảo xoay vòng được áp dụng trước khi dịch.

9

Để xây dựng trên các câu trả lời trước.

Biến đổi trong OpenGL được thực hiện thông qua phép nhân ma trận. Trong ví dụ của bạn, bạn có:

M_r_ - xoay chuyển

M_t_ - bản dịch chuyển

v - một đỉnh

và bạn đã áp dụng chúng theo thứ tự:

M_r_ * M_t_ * v

Sử dụng dấu ngoặc đơn để làm rõ:

(M_r_ * (M_t_ * v))

Chúng tôi thấy rằng đỉnh được chuyển đổi bởi ma trận gần hơn trước, trong trường hợp này là bản dịch. Nó có thể là một chút truy cập trực quan bởi vì điều này đòi hỏi bạn phải xác định các biến đổi theo thứ tự ngược lại mà bạn muốn chúng được áp dụng. Nhưng nếu bạn nghĩ về cách các biến đổi được đặt trên ngăn xếp ma trận thì hy vọng sẽ có ý nghĩa hơn một chút (ngăn xếp được nhân trước).

Do đó, tại sao để có được kết quả mong muốn, bạn cần xác định biến đổi theo thứ tự ngược lại.

+0

Thật vậy :) Cảm ơn bạn đã cập nhật! –

3

Inertiatic cung cấp phản hồi rất tốt. Từ góc độ mã, các phép biến đổi của bạn sẽ xảy ra theo thứ tự ngược lại chúng xuất hiện. Nói cách khác, các biến đổi gần hơn với mã vẽ thực tế sẽ được áp dụng trước tiên.

Ví dụ:
glRotate();
glTranslate();
glScale();
drawMyThing();

đầu tiên sẽ mở rộng quy mô điều của bạn, sau đó dịch nó, sau đó xoay nó.Bạn có hiệu quả cần phải "đọc mã ngược của bạn" để tìm ra biến đổi nào đang được áp dụng theo thứ tự nào. Đồng thời, hãy ghi nhớ trạng thái của các biến đổi này là gì khi bạn đẩy và bật ngăn xếp kiểu xem.

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