Làm thế nào để dịch chuyển động chuột sang một gizmo xoay?


7

Tôi cần triển khai gizmos dịch, chia tỷ lệ và xoay và tôi gặp sự cố với gizmo xoay. Về cơ bản, tôi không biết cách dịch chuyển động của chuột để xác định hướng xoay đối tượng.

Bằng cách xoay gizmo (widget) Tôi có nghĩa là một cái gì đó như dưới đây:

nhập mô tả hình ảnh ở đây

Đối với gizmos dịch và chia tỷ lệ, được biểu diễn dưới dạng 3 trục, tôi thực hiện như sau: Tôi tạo một vectơ về sự khác biệt giữa vị trí chuột trước và hiện tại trong không gian màn hình. Sau đó nhân vectơ này với nghịch đảo của ma trận xem và ma trận chiếu, điều này cho tôi một vectơ chuyển động của chuột trong không gian thế giới. Sau đó, tôi lấy sản phẩm chấm của vectơ trong không gian thế giới với trục đã chọn. Điều này cho phép tôi xác định xem chuyển động của chuột có phù hợp với trục hoặc ra khỏi trục không.

Nhưng tôi không thể làm điều tương tự cho gizmo xoay. Gizmo xoay được biểu diễn dưới dạng 3 vòng tròn, mỗi vòng tròn biểu thị một vòng quay quanh một trục. Khi một vòng tròn được nhấp, tôi cần tìm một số cách dịch chuyển động chuột để xác định hướng xoay đối tượng xung quanh trục đã chọn. Tôi không biết làm thế nào để làm điều này. Xin vui lòng giúp đỡ.

Điều quan trọng cần lưu ý là tôi đang sử dụng tính năng chọn màu và không chiếu tia để xác định nơi gizmo được nhấp. Điều này có nghĩa là tôi không có điểm mà tia tới trúng gizmo trong không gian thế giới để bắt đầu. Tôi đề cập đến điều này bởi vì tôi đã xem các ví dụ sử dụng raycasting như libgizmo và tôi không nghĩ mình có thể làm điều tương tự.

Cảm ơn trước sự giúp đỡ nào.


2
Tôi phải mất một giây để hiểu ý của bạn về một gizmo xoay. Tôi đã thêm một hình ảnh trong trường hợp nó hữu ích (tôi nghĩ bạn không thể thêm hình ảnh cho đến khi bạn có tiếng tăm đáng buồn hơn!). Nếu bạn có một hình ảnh phù hợp hơn trong tâm trí, hãy cho tôi biết và tôi có thể thay đổi hình ảnh.
Alan Wolfe

Cảm ơn đã thêm hình ảnh Alan. Bạn nói đúng, tôi nghĩ nó sẽ làm mọi thứ rõ ràng hơn.
0xfeedbacc

Fwiw tôi nghĩ bạn đúng. Sử dụng lựa chọn dựa trên màu sắc sẽ không hiệu quả cho việc này.
Alan Wolfe

Câu trả lời:


2

Ánh xạ vị trí chuột vào vòng tròn bằng cách vẽ một đường tưởng tượng giữa chuột và tâm của gizmo trên mặt phẳng của vòng tròn hiện tại. Làm điều này cho các vị trí bắt đầu và hiện tại.

Sau đó, bạn có thể dễ dàng có được vòng xoay tứ phương xung quanh trung tâm từ đầu đến cuối bằng cách thực hiện normalize(quat(1+dot(v_1, v_2), cross(v_1, v_2))).

Điều này hoạt động vì sản phẩm chấm là cos của góc giữa vectơ và chữ thập là vectơ vuông góc với 2 vectơ (còn gọi là góc quay) và có độ dài của sin của góc giữa các vectơ. Điều này có nghĩa là bạn có thể tạo ra tứ phân vị trong số chúng. Sau đó, bạn có thể nlerp tứ phân đôi đó với tứ phân vị đơn vị để có được vòng quay bạn cần.

Tuy nhiên với thông tin đó, bạn có thể thực hiện một cung tròn bằng cách chiếu chuột lên quả bóng đó là gizmo và sử dụng các vectơ bắt đầu và kết thúc theo cách đó.


Câu trả lời này thực sự cần một bức tranh
joojaa

2

Câu trả lời của Ratchet Freak có thể hoạt động. Tôi không chắc chắn, tôi đã không dành nhiều thời gian cho nó bởi vì tôi không biết cách tạo ra tứ phương từ dấu chấm và sản phẩm chéo như mô tả.

Những gì chúng tôi đã làm là:

  • Chiếu trung tâm của gizmo lên màn hình không gian.

  • Lấy góc giữa các vectơ GizmoToLastMouse và GizmoToCienMouse bằng cách sử dụng công thức sản phẩm chấm: acos (Dot (GizmoToLastMouse, GizmoToCienMouse) / (GizmoToLastMouse.Lạng () * GizmoToCouse

  • Lấy dấu của góc bằng cách lấy chéo của GizmoToLastMouse và GizmoToCienMouse và chấm nó với màn hình bình thường.

  • Nhận một dấu hiệu khác (lần 1.0f hoặc -1.0f) dựa trên hướng của gizmo, bằng cách lấy sản phẩm chấm giữa trục xoay và vectơ từ trung tâm của gizmo đến máy ảnh

  • Áp dụng xoay dựa trên góc và hai dấu hiệu cho trục thích hợp

Có thể có một cách tốt hơn để làm điều đó, nhưng điều này hoạt động khá tốt cho nhu cầu của chúng tôi.


một bậc bốn được xây dựng quat(cos(angle/2), axis*sin(angle/2))và bạn biết rằng sản phẩm chấm chúng ta bằng cos (góc) nhân với sản phẩm có độ dài và sản phẩm chéo là trục nhân với sin (góc) nhân với sản phẩm có độ dài. Bình thường hóa nó và bạn có thể dễ dàng có được tứ phương của cùng một vòng quay nhưng với góc gấp đôi. Để có được tính chất phù hợp, bạn có thể thực hiện điều slerp(unit, quat, 0.5)đó sau khi kết thúc nội tuyến lànormalize(unit+quat);
ratchet freak
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.