2012-01-13 76 views
8

Tôi vẽ hình nón, và tôi muốn xoay nó, 90 độ ngược chiều kim đồng hồ, sao cho đầu nhọn nhọn hướng về phía tây! Tôi đang sử dụng OpenGL 3+.Sử dụng xoay vòng xoay trong Opengl

Đây là mã của tôi trong Cone.cpp của tôi cho đến nay:

//PROJECTION 
    glm::mat4 Projection = glm::perspective(45.0f, 1.0f, 0.1f, 100.0f); 

    //VIEW 
    glm::mat4 View = glm::mat4(1.); 
    View = glm::translate(View, glm::vec3(2.0f,4.0f, -25.0f)); 

    //MODEL 
    glm::mat4 Model = glm::mat4(1.0); 
    //Scale by factor 0.5 
    Model = glm::scale(glm::mat4(1.0f),glm::vec3(0.5f)); 

    glm::mat4 MVP = Projection * View * Model; 
    glUniformMatrix4fv(glGetUniformLocation(shaderprogram_spaceship, "MVP_matrix"), 1, GL_FALSE, glm::value_ptr(MVP)); 

    glClearColor(0.0, 0.0, 0.0, 1.0); 

    glDrawArrays(GL_LINE_STRIP, start_cone, end_cone); 

Không phải tất cả các mã được hiển thị.

Ai đó có thể hướng dẫn tôi qua vòng xoay không? Tôi phải nhân ma trận Xem phải không? với chức năng "glm rotate"?

+11

Sự cố là gì? Bạn cần cho chúng tôi biết vấn đề là gì. Không công bằng khi không chỉ muốn chúng tôi nói với bạn * giải pháp *, mà còn muốn chúng tôi tìm ra * vấn đề * nữa. –

Trả lời

30

Bạn cần nhân ma trận Mô hình của mình. Bởi vì đó là vị trí mô hình, mở rộng và xoay vòng nên (đó là lý do tại sao nó được gọi là ma trận mô hình).

Tất cả bạn cần làm là:

Model = glm::rotate(Model, angle_in_degrees, glm::vec3(x, y, z)); // where x, y, z is axis of rotation (e.g. 0 1 0) 

Đó có ma trận Model, và áp dụng luân phiên trên đầu trang của tất cả các hoạt động đã có trong đó. Các chức năng khác dịch và quy mô làm tương tự. Bằng cách đó, có thể kết hợp nhiều phép biến đổi trong một ma trận đơn.

8

GLM có ví dụ tốt về luân chuyển: http://glm.g-truc.net/code.html

glm::mat4 Projection = glm::perspective(45.0f, 4.0f/3.0f, 0.1f, 100.f); 
glm::mat4 ViewTranslate = glm::translate(
    glm::mat4(1.0f), 
    glm::vec3(0.0f, 0.0f, -Translate) 
); 
glm::mat4 ViewRotateX = glm::rotate(
    ViewTranslate, 
    Rotate.y, 
    glm::vec3(-1.0f, 0.0f, 0.0f) 
); 
glm::mat4 View = glm::rotate(
    ViewRotateX, 
    Rotate.x, 
    glm::vec3(0.0f, 1.0f, 0.0f) 
); 
glm::mat4 Model = glm::scale(
    glm::mat4(1.0f), 
    glm::vec3(0.5f) 
); 
glm::mat4 MVP = Projection * View * Model; 
glUniformMatrix4fv(LocationMVP, 1, GL_FALSE, glm::value_ptr(MVP)); 
+0

Liên kết ví dụ về mã GLM: [https://glm.g-truc.net/0.9.1/api/a00006.html](https://glm.g-truc.net/0.9.1/api/a00006. html) – befzz

5

tôi nhận thấy rằng bạn cũng có thể nhận lỗi nếu bạn không xác định các góc một cách chính xác, ngay cả khi sử dụng glm::rotate(Model, angle_in_degrees, glm::vec3(x, y, z)) bạn vẫn có thể chạy vào vấn đề. Sửa chữa tôi tìm thấy cho điều này đã được xác định loại như glm::rotate(Model, (glm::mediump_float)90, glm::vec3(x, y, z)) thay vì chỉ nói glm::rotate(Model, 90, glm::vec3(x, y, z))

Hoặc chỉ viết đối số thứ hai, góc bằng radian (trước đây theo độ), như một phao không cần đúc như:

glm::mat4 rotationMatrix = glm::rotate(glm::mat4(1.0f), 3.14f, glm::vec3(1.0)); 

Bạn có thể thêm glm :: radians() nếu bạn muốn tiếp tục sử dụng độ. Và thêm bao gồm:

#include "glm/glm.hpp" 
#include "glm/gtc/matrix_transform.hpp" 
+0

Làm 90 90ff đó có thể đã thực hiện nó. – RobC

+0

Theo [tài liệu] (http://glm.g-truc.net/0.9.4/api/a00206.html#ga3eed13fc5bcaff2f2204b12013bb83bf) góc phải mất theo độ. Vì vậy, việc truyền '3.14f' sẽ quay một lượng nhỏ (3 độ thay vì 180 độ). Ngoài ra, hàm là một khuôn mẫu để truyền số nguyên làm góc làm cho kiểu đối số mơ hồ (tạo ra một lỗi biên dịch thời gian). Chỉ định '180.0f' có thể sẽ là ý của bạn. –