2012-03-29 25 views
13

Tôi có một đối tượng mà trước tiên tôi muốn xoay (về trung tâm riêng của nó) sau đó dịch nó sang một số điểm. Tôi có một glm :: quat giữ quay và một glm :: vec3 giữ điểm mà nó cần phải được dịch.glm kết hợp xoay và dịch

glm::vec3 position; 
glm::quat orientation; 
glm::mat4 modelmatrix; <-- want to combine them both in here 

modelmatrix = glm::translate(glm::toMat4(orientation),position); 

Sau đó, tại chức năng tôi làm làm cho tôi ..

pvm = projectionMatrix*viewMatrix*modelmatrix; 
glUniformMatrix4fv(pvmMatrixUniformLocation, 1, GL_FALSE, glm::value_ptr(pvm)); 

..và làm ...

Thật không may là đối tượng chỉ quỹ đạo xung quanh nguồn gốc khi tôi áp dụng một vòng quay (càng xa "vị trí" từ gốc, quỹ đạo càng lớn).

Khi tôi chỉ áp dụng vị trí nó dịch tốt. Khi tôi chỉ áp dụng vòng quay nó vẫn ở gốc và quay về trung tâm của nó (như mong đợi). Vì vậy, tại sao nó đi lạ khi tôi áp dụng cả hai? Tôi thiếu một cái gì đó cơ bản?

Trả lời

23

Vì bạn đang áp dụng chúng theo thứ tự sai. Bằng cách làm như glm::translate(glm::toMat4(orientation),position), bạn đang làm tương đương với điều này:

glm::mat4 rot = glm::toMat4(orientation); 
glm::mat4 trans = glm::translate(glm::mat4(1.0f), position); 
glm::mat4 final = rot * trans; 

Lưu ý rằng bản dịch là ở phía bên phải của ma trận, không phải bên trái. Điều này có nghĩa là bản dịch xảy ra trước tiên, sau đó xoay vòng xảy ra liên quan đến bản dịch. Vì vậy, luân chuyển xảy ra trong không gian sau khi dịch.

Bạn muốn xoay vòng xảy ra trước tiên. Vì vậy, đảo ngược thứ tự của phép nhân ma trận.

+0

Tôi đã ấn tượng rằng glm :: dịch áp dụng bản dịch cho đối số thứ nhất của hàm. Cảm ơn bạn. – Jubei

+3

@Jubei: Nó * * áp dụng bản dịch cho ma trận. Nó phải nhân nó. Điều đó có nghĩa là bản dịch xảy ra * đầu tiên *, khi bạn muốn xoay vòng xảy ra trước tiên. –

+0

Cảm ơn câu trả lời này, tôi đã bị mắc kẹt trong một thời gian hôm nay, nhưng mặc dù tôi đã tìm ra những gì tôi đã làm sai Tôi chỉ đơn giản là không thể tìm thấy bất kỳ xác nhận rằng đây là cách các chức năng được cho là làm việc. –

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