2013-08-07 79 views
7

Tôi đã vượt qua một số lỗi rất đơn giản khi bắt đầu sử dụng glm (trong VS2010). Tôi đã có mã ngắn này:ma trận dịch ma trận không dịch vector

glm::mat4 translate = glm::translate(glm::mat4(1.f), glm::vec3(2.f, 0.f, 0.f)); 
glm::vec4 vector(1.f,1.f,1.f,0.f); 
glm::vec4 transformedVector = translate * vector; 

Kết quả của biến đổiVector giống với giá trị ban đầu của nó (1.f, 1.f, 1.f, 0.f). Tôi không biết tôi đang thiếu gì ở đây. Tôi đã thử ma trận xoay và đang hoạt động tốt, điểm được chuyển đổi chính xác.

glm::mat4 rotate = glm::rotate(glm::mat4(1.f), 90.f, glm::vec3(0.f, 0.f, 1.f)); 
glm::vec4 vector(1.f, 1.f, 1.f, 0.f); 
glm::vec4 transformedVector = rotate * vector; 

Ok, tôi đã phát hiện ra sự cố. Tôi muốn dịch một đỉnh không phải là vec-tơ, trong trường hợp này tôi phải đặt giá trị w thành 1.

Trả lời

19

Bạn đang quên đi các tọa độ dự báo. Vì vậy, thành phần cuối cùng của

glm::vec4 vector 

nên 1. Vì vậy, việc sửa chữa chỉ đơn giản là làm điều này:

glm::mat4 translate = glm::translate(glm::mat4(1.f), glm::vec3(2.f, 0.f, 0.f)); 
glm::vec4 vector(1.f,1.f,1.f,1.f); 
glm::vec4 transformedVector = translate * vector; 

Đây là do cách projective phối công việc, về cơ bản để có được từ tọa độ xạ (vec4) đến tọa độ bình thường (vec3) bạn chia cho thành phần w. (Bạn không thể làm gì nếu nó bằng không.)

Lý do nó hoạt động đối với phép quay nhưng không dịch là vì xoay vòng không gian chiếu "giống nhau" như trong không gian bình thường, nhưng bản dịch khác nhau.

Tôi vừa nhận thấy rằng bạn đã giải quyết được lỗi của mình nhưng tôi cho rằng giải thích có thể hữu ích.