Làm thế nào tôi có thể so sánh hai quan điểm cho bình đẳng logic?


9

Tôi đang cố gắng viết một số bài kiểm tra đơn vị và nhận ra tôi không biết làm thế nào để so sánh các quan điểm. Tôi cần biết nếu hai bậc bốn đại diện cho cùng một hướng (đối tượng sẽ phải đối mặt theo cùng một cách). Với vị trí như vectơ, tôi chỉ cần so sánh các bộ phận và kiểm tra xem chúng có đủ gần không, nhưng đối với các giá trị bậc bốn, các giá trị có thể rất khác nhau.

Làm thế nào tôi có thể so sánh hai quan điểm?


Tôi không chắc đó có phải là thông lệ tiêu chuẩn hay không, nhưng trong ví dụ Java và Unity, các phần tư được lưu trữ dưới dạng bốn giá trị nổi. Đơn giản chỉ cần so sánh các eachother như được nêu trong các bài: answers.unity3d.com/questions/288338/... stackoverflow.com/questions/5803627/quaternion-comparision
Tholle

1
@Tholle người dùng cũng quan tâm đến tác động của việc áp dụng tứ phương để biến đổi / xoay một thực thể 3D (tức là tư thế khôn ngoan). Hai quan điểm khác nhau có thể đạt được cùng một vòng quay (ví dụ q-q). Cách ngây thơ (tính toán khôn ngoan) sẽ là áp dụng cả hai bậc bốn vào cùng một vectơ và xem kết quả vectơ của chúng có khác nhau không ..
teodron

Câu trả lời:


7

Nếu hai phần tư của bạn là q1q2, chúng đại diện cho cùng một vòng quay nếu một trong hai điều kiện này giữ:

  1. q1là thành phần khôn ngoan xấp xỉ bằng q2OR
  2. q1 là thành phần khôn ngoan xấp xỉ bằng -q2

Biết được điều này, bạn có thể viết một trình kiểm tra công bằng khá đơn giản phù hợp với mục tiêu của bạn.


9
+1, một nitpick mặc dù q-qđại diện cho cùng một hướng (đang được yêu cầu), nhưng không phải là cùng một vòng quay. Điều này là rất quan trọng khi nội suy.
falstro

@falstro, tôi nghĩ tôi hiểu ý của bạn: trục xoay bị đảo ngược, nhưng góc đối số cũng bị phủ định giữa q-qkhi được biểu diễn dưới dạng toán tử xoay trục góc. Vì vậy, về mặt kỹ thuật, hiệu quả của các phép quay này là như nhau, mặc dù các toán tử thì không. Và, vâng, khi SLERPING, người ta phải chắc chắn q1q2nằm trên cùng một bán cầu của siêu cầu S3 để cho slerp đi theo con đường ngắn nhất.
teodron

1
Chính xác, khi bạn thực hiện một trong hai phép quay, bạn sẽ kết thúc với cùng một hướng, nhưng nội suy nó (cho dù bạn lerp hoặc slerp hoặc một số nội suy ưa thích khác), bạn sẽ thấy nó đang rẽ theo những cách khác nhau. Và vâng, đối số góc bị phủ định, nhưng điều đó cũng giống như 2pi-anglevậy, vì vậy nó xoay theo chiều dài xung quanh các trục bị phủ định. Đôi khi đây là những gì bạn muốn mặc dù; đó chỉ là một điều cần chú ý, q1 dot q2 > 0kết quả trong lượt ngắn, q1 dot q2 < 0bước ngoặt dài.
falstro

12

Chỉ vì nó không được đề cập. Vì các bậc bốn được sử dụng cho định hướng không gian luôn luôn là đơn vị chiều dài (hoặc nên), nên sau đây cũng sẽ hoạt động.

abs(q1.dot(q2)) > 1-EPS

trong đó EPS là một số yếu tố mờ nhạt để cho phép các lỗi nhỏ do độ chính xác điểm nổi hạn chế. Nếu (và chỉ nếu) cả hai quan điểm đại diện cho cùng một định hướng q1 = +- q2, và do đó q1.dot(q2) = +- 1. Nếu bạn muốn đảm bảo rằng chúng cùng một vòng quay (thay vì chỉ định hướng), thì hãy xóa abs.


@bogglez đúng. Đã bị ẩn trong văn bản tl; dr. :)
falstro

+1, khá thanh lịch và, thậm chí có thể hiệu quả hơn về số lượng so với câu trả lời của tôi (với điều kiện các thao tác SIMD được sử dụng :)).
teodron

Các biện minh toán học cho điều này là gì?
fabian789 8/2/2016

"Toán học" (trong ngoặc kép gây ra tôi không phải là nhà toán học :)) biện minh: Hai vectơ có độ dài đơn vị có sản phẩm chấm (còn gọi là sản phẩm bên trong) là 0 nếu chúng thẳng đứng với nhau, 1 * 1 = 1 nếu chúng chỉ chính xác cùng hướng và 1 * 1 * cos (phi) trong trường hợp chung, với góc phi của chúng ...
ntg

2

Đệ tứ được lưu trữ dưới dạng 4 phao hoặc đôi, thường được gọi là x, y, z và w, trong đó ba phần đầu đại diện cho một trục và w mức độ xoay quanh trục đó.

Một cách tiếp cận ngây thơ sẽ chỉ là so sánh những con số của hai bậc bốn cho sự bình đẳng. Tuy nhiên, vì các phép tính dấu phẩy động liên quan đến một lỗi, ít nhất bạn nên sử dụng một lỗi, thường được gọi là eps (đối với epsilon) và so sánh từng thành phần như

    double const eps = 1e-12; // some error threshold
    abs(quat1_x - quat2_x) < eps // similar enough?
    // repeat for other values..

Một thử nghiệm tốt hơn sẽ là tính toán sản phẩm chấm của hai bậc bốn và kiểm tra xem nó có gần với 1.0 không. Bạn nên tìm phương trình của tứ phân vị với sin và cos và chỉ cần chấm hai bậc bốn, sau đó bạn sẽ dễ dàng thấy lý do tại sao điều này hoạt động.


0

Dựa trên tất cả các đề xuất để sử dụng Dot và eps tôi thấy rằng việc sử dụng (thống nhất):

Mathf.Approximately(Mathf.Abs(Quaternion.Dot(transform.rotation, to)), 1.0f)

làm việc tốt mà không cần tôi phải đưa ra quyết định về kích thước của eps.

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.