Tôi có một lưới hình cầu bán kính 1, tập trung tại (0,0,0) trong tọa độ thế giới. Tôi muốn xoay quả cầu sao cho điểm nhấp vẫn ở dưới chuột mọi lúc. Tuy nhiên, tôi không thể tìm thấy một thuật toán thực hiện điều này. Điểm được nhấp luôn trôi ra khỏi chuột. Thuật toán hiện tại của tôi thực hiện như sau:
Đúc một tia tới một quả cầu có bán kính 1. Tìm điểm giao nhau trong tọa độ thế giới (Pa).
Sau khi chuột được di chuyển, chiếu một tia khác và tìm một điểm giao nhau mới. (Pb) vì cả hai điểm 3D đó đều nằm trên một hình cầu có bán kính một, tập trung tại điểm gốc, nên chúng có chiều dài = 1 nhưng chỉ trong trường hợp tôi bình thường hóa cả hai.
Tìm trục quay bằng cách thực hiện Pa x Pb. Bình thường hóa trục kết quả
axis = glm::cross(Pa,Pb);
axis = glm::normalize(axis);
Tìm góc bằng cách thực hiện arccosine trên sản phẩm chấm
float angle = glm::acos(glm::dot(Pa,Pb));
Xây dựng ma trận xoay từ trục và góc
mat4 rotation = glm::rotate(glm::degrees(angle),axis); <-- This was the mistake glm::degrees is not needed
Nhân ma trận mô hình hiện có với ma trận tính toán đó:
modelMatrix = rotation*modelMatrix;
Các phép quay là chính xác nhưng điểm được nhấp không nằm dưới chuột (Tôi đang kiểm tra bằng cách vẽ một điểm vuông màu đen trên kết cấu hình cầu khi bắt đầu kéo). Nếu tôi nhấp và kéo sang phải, điểm nhấp ban đầu sẽ trôi về bên trái (độ trễ).
glm::rotate
chức năng thực sự mất radian, không độ? Không chắc đoạn cuối cùng liên quan đến câu trả lời cuối cùng như thế nào.