Làm cách nào để giữ điểm nhấp dưới chuột khi xoay? (GLM)


7

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ễ).

sơ đồ thể hiện sự trôi dạt

Câu trả lời:


1

Tôi tìm ra thủ phạm.

glm :: độ (góc)

Tôi đã sao chép dòng đó từ một số người trên mạng vì lý do nào đó chuyển đổi góc độ sang độ. Hoàn toàn không cần chuyển đổi này.

Theo một người dùng trên reddit: Một cảnh báo về phương pháp này, ma trận mô hình của bạn sẽ suy giảm theo thời gian bằng cách sử dụng loại kỹ thuật này (nhân lên nhiều lần với một ma trận mới), khiến mô hình được kết xuất mở rộng hoặc nghiêng. Bạn có thể muốn phát triển một hàm để "sửa" ma trận, sử dụng một kỹ thuật như chuyển đổi sang định dạng khác (góc bậc bốn hoặc góc Euler) rồi quay lại ma trận hoặc trực tiếp hơn bằng cách trích xuất các vectơ cơ sở ma trận, chuẩn hóa chúng và dán các giá trị trở lại vào ma trận.


1
Ít nhầm lẫn - vì vậy glm::rotatechứ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.
Chaosed0

@ Chaosed0 Đoạn cuối dùng để cảnh báo người dùng muốn áp dụng phương pháp này rằng nó chưa "hoàn thành" và nó đòi hỏi phải làm thêm để tránh làm lệch / mở rộng mô hình. Tôi không biết glm :: rotation mất gì vì GLM được ghi lại rất kém.
Jubei

Gotcha - chỉ cần xem tài liệu cho GLM, trông giống như một con quái vật để sử dụng.
Chaosed0
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.