Sử dụng Đệ tứ: Tôi có thể làm gì với chúng? (không có toán)


24

Tôi là một nhà phát triển trò chơi và không học Toán. Vì vậy, tôi chỉ muốn sử dụng Quancyions như một công cụ. Và để có thể làm việc với xoay 3D, cần phải sử dụng Quancyions (Hoặc Ma trận, nhưng chúng ta hãy ở lại Đệ tứ ở đây trong Câu hỏi này). Tôi nghĩ điều quan trọng đối với nhiều nhà phát triển là sử dụng chúng. Đó là lý do tại sao tôi muốn chia sẻ kiến ​​thức của mình và hy vọng lấp đầy những lỗ hổng mà tôi có. Hiện nay....

Theo như tôi hiểu:

Một Đệ tứ có thể mô tả 2 điều:

  1. Định hướng hiện tại của một đối tượng 3d.
  2. Việc chuyển đổi xoay mà một đối tượng có thể làm. (Xoay vòng)

Bạn có thể làm với một Đệ tứ:

Phép nhân:

  1. Quancyion endOrientation = Quancyion rotationChange * Quancyion currentOrientation;

    Vì vậy, ví dụ: Đối tượng 3D của tôi được xoay 90 ° sang trái - và xoay vòng tôi nhân lên là xoay 180 ° sang phải, cuối cùng, Đối tượng 3D 90 ° của tôi được chuyển sang phải.

  2. Xoay vòng QuernionChange = Kết thúc Quancyion * Quancyion.Inverse (startRotation);

    Với điều này, bạn có được một Xoay vòng, có thể được áp dụng cho Định hướng khác.

  3. Vector3 endPostion = Xoay vòng QuThion * Vector3 currentPocation;

    Vì vậy, ví dụ: Đối tượng 3D của tôi ở vị trí (0,0,0) và phép quay của tôi, tôi nhân lên là xoay 180 ° sang phải, mục đích của tôi là một cái gì đó như (0, -50,0). Bên trong Quancyion đó có một Trục - và một vòng quay quanh trục đó. Bạn quay điểm của bạn quanh trục Y Độ.

  4. Vector3 rotated OffersetVector = Xoay quernionChange * Vector3 current OffersetVector;

    Ví dụ: Hướng bắt đầu của tôi hiển thị LÊN - (0,1,0) và xoay vòng tôi nhân lên là xoay 180 ° sang phải, hướng kết thúc của tôi hiển thị xuống. (0, -1,0)

Trộn (Lerp và Slerp):

  1. Quancyion currentOrientation = Qu Parention.Slerp (startOrientation, endOrientation, interpolator)

    nếu bộ nội suy là 1: currentOrientation = endOrientation

    nếu bộ nội suy là 0: currentOrientation = startOrientation

    Slerp nội suy chính xác hơn, Lerp nội suy hiệu suất cao hơn.

Những câu hỏi của tôi):

Là tất cả mọi thứ tôi giải thích cho đến bây giờ chính xác?

Đó có phải là "tất cả" bạn có thể làm với Đệ tứ không? (không.)

Bạn có thể làm gì khác với họ?

Sản phẩm Dot và sản phẩm Cross giữa 2 Quancyions dùng để làm gì?

Chỉnh sửa:

Câu hỏi cập nhật với một số câu trả lời


Giả sử bạn không có 2, nhưng ncác định hướng khác nhau (thái độ, tư thế, v.v.). Sau đó, bạn có thể trung bình chúng bằng cách sử dụng trọng số, khái quát hóa hiệu quả slerp / lerp. Bạn cũng có thể chuyển đổi một bậc bốn thành một rôto, tương đương với việc áp dụng vận tốc góc trong một khoảng thời gian nhất định cho một cơ thể cứng nhắc. Do đó, bạn có thể mô tả tích hợp vận tốc góc với tứ phương. Bạn cũng có thể ước tính mức độ khác nhau của hai hướng (tính chiều dài của cung tròn được kéo dài bởi hai bậc bốn trên siêu cầu).
teodron

Và vâng, trong cái nhìn đầu tiên, lý do của bạn là chính xác (sự hiểu biết của bạn về tứ phương là khá tốt cho một người không có kỹ thuật). Điều này là không phù hợp cho một bình luận, nhưng xin chúc mừng! Ngay cả những người không có năng khiếu về mặt kỹ thuật cũng biết tất cả các sử dụng bậc bốn, mặc dù họ sử dụng chúng như các công cụ kỹ thuật phần mềm cho một mục đích.
teodron

4
"Và để có thể làm việc với xoay 3D, cần phải sử dụng Quancyions" Tôi không thể nhấn mạnh đủ câu này sai như thế nào. Bạn có thể sử dụng các góc Euler hoặc Tait-Bryan để phát triển trò chơi, vấn đề duy nhất là khóa gimbal. Nếu bạn muốn trở thành một nhà phát triển trò chơi, bạn sẽ cần toán học tại một thời điểm, hãy học nó.
Bálint

1
"Nhà phát triển trò chơi" và "không học toán" là một oxymoron.
Margaret Bloom

2
Tôi đánh giá cao những gì bạn đang cố gắng làm với câu hỏi, nhưng câu trả lời nên có trong câu trả lời, không phải câu hỏi. Tạo một câu trả lời "tóm tắt" nếu bạn nghĩ rằng nó đáng để đối chiếu chúng.
Cơ bản

Câu trả lời:


23

Phép nhân

Ít nhất là về mặt thực thi Đệ tứ của Unity, thứ tự nhân được mô tả trong câu hỏi là không chính xác. Điều này rất quan trọng vì xoay 3D không giao hoán .

Vì vậy, nếu tôi muốn xoay một đối tượng bằng cách rotationChangebắt đầu từ nó, currentOrientationtôi sẽ viết nó như thế này:

Quaternion newOrientation = rotationChange * currentOrientation;

(ví dụ: Các phép biến đổi xếp chồng lên nhau sang trái - giống như quy ước ma trận của Unity. Xoay vòng ngoài cùng bên phải được áp dụng trước / ở đầu "cục bộ nhất")

Và nếu tôi muốn chuyển đổi một hướng hoặc vectơ bù bằng một phép quay, tôi sẽ viết nó như sau:

Vector3 rotatedOffsetVector = rotationChange * currentOffsetVector;

(Unity sẽ tạo ra một lỗi biên dịch nếu bạn làm ngược lại)

Pha trộn

Đối với hầu hết các trường hợp, bạn có thể thoát khỏi vòng quay Lerping. Đó là bởi vì góc được sử dụng "dưới mui xe" trong một phần tư là một nửa góc quay, làm cho nó gần với phép tính gần đúng tuyến tính của Lerp hơn là một Ma trận (nói chung sẽ không Lerp tốt!). Kiểm tra khoảng 40 phút vào video này để giải thích thêm .

Một trường hợp khi bạn thực sự cần Slerp là khi bạn cần tốc độ phù hợp theo thời gian, như nội suy giữa các khung hình chính trên dòng thời gian hoạt hình. Đối với các trường hợp bạn chỉ quan tâm rằng một đầu ra là trung gian giữa hai đầu vào (như pha trộn các lớp của một hình ảnh động) thì thường Lerp phục vụ khá tốt.

Khác gì?

Các dấu chấm sản phẩm của hai quaternion đơn vị cung cấp cho các cosin của góc giữa chúng, vì vậy bạn có thể sử dụng các sản phẩm chấm như một biện pháp tương tự nếu bạn cần phải so sánh quay. Tuy nhiên, điều này hơi khó hiểu, vì vậy, đối với mã dễ đọc hơn, tôi thường sử dụng Qu Parention.Angle (a, b) , điều này thể hiện rõ hơn rằng chúng ta đang so sánh các góc, theo các đơn vị (độ) quen thuộc.

Những loại phương thức tiện lợi mà Unity cung cấp cho Quancyions là siêu hữu ích. Trong hầu hết mọi dự án tôi đều sử dụng cái này ít nhất một vài lần :

Quaternion.LookRotation(Vector3 forward, Vector3 up)

Điều này xây dựng một tứ phương rằng:

  • xoay trục z + cục bộ thành điểm chính xác dọc theo forwardđối số vectơ
  • xoay trục y + cục bộ thành điểm càng gần càng tốt với upđối số vectơ, nếu được cung cấp hoặc (0, 1, 0)nếu bị bỏ qua

Lý do "lên" chỉ nhận được "càng gần càng tốt" là hệ thống bị quá hạn. Đối mặt với z + để forwardsử dụng tối đa hai bậc tự do (ví dụ: ngáp và cao độ) để chúng ta chỉ còn một bậc tự do (cuộn).

Tôi thấy khá thường xuyên tôi muốn một cái gì đó với các thuộc tính chính xác ngược lại: Tôi muốn cục bộ y + chỉ chính xác upvà z + cục bộ càng gần càng tốt forwardvới sự tự do còn lại.

Ví dụ, điều này xuất hiện khi cố gắng tạo khung tọa độ tương đối máy ảnh cho đầu vào chuyển động: Tôi muốn hướng lên cục bộ của mình vuông góc với mặt sàn hoặc bề mặt nghiêng bình thường, vì vậy đầu vào của tôi không cố gắng đưa nhân vật vào địa hình hoặc đẩy họ ra khỏi nó.

Bạn cũng có thể nhận được điều này nếu bạn muốn vỏ tháp pháo của xe tăng đối mặt với mục tiêu, mà không bị bong ra khỏi thân xe tăng khi nhắm lên / xuống.

Chúng ta có thể xây dựng chức năng tiện lợi của riêng mình để thực hiện việc này, sử dụng LookRotationcho việc nâng vật nặng:

Quaternion TurretLookRotation(Vector3 approximateForward, Vector3 exactUp)
{
    Quaternion rotateZToUp = Quaternion.LookRotation(exactUp, -approximateForward);
    Quaternion rotateYToZ = Quaternion.Euler(90f, 0f, 0f);

    return rotateZToUp * rotateYToZ;
}

Ở đây trước tiên chúng ta xoay cục bộ y + sang z + và z + cục bộ sang y-.

Sau đó, chúng tôi xoay z + mới theo hướng lên của chúng tôi (vì vậy kết quả thực là các điểm y + cục bộ trực tiếp dọc theo exactUp) và y + mới càng gần càng tốt với hướng chuyển tiếp bị phủ định (vì vậy kết quả thực là các điểm z + cục bộ càng gần càng tốt approximateForward)

Một phương pháp tiện lợi tiện dụng khác là Quaternion.RotateTowards, mà tôi thường sử dụng như vậy:

Quaternion newRotation = Quaternion.RotateTowards(
                             oldRotation, 
                             targetRotation,
                             maxDegreesPerSecond * Time.deltaTime
                         );

Điều này cho phép chúng tôi tiếp cận targetRotationvới tốc độ ổn định, có thể kiểm soát được bất kể tốc độ khung hình - quan trọng đối với các phép quay ảnh hưởng đến kết quả / sự công bằng của cơ chế chơi trò chơi (như chuyển động của nhân vật hoặc theo dõi tháp pháo trên người chơi). Naively Lerping / Slerping trong tình huống này có thể dễ dàng dẫn đến các trường hợp chuyển động trở nên nhanh hơn ở tốc độ khung hình cao, ảnh hưởng đến cân bằng trò chơi. (Điều đó không có nghĩa là các phương pháp này sai - có nhiều cách để sử dụng chúng một cách chính xác mà không thay đổi sự công bằng, nó chỉ cần sự chăm sóc. RotateTowardsCung cấp một lối tắt thuận tiện giúp xử lý vấn đề này cho chúng tôi)


Mẹo: Thêm & t = 40m vào cuối URL video để nó sẽ chuyển thẳng đến đó (tùy chọn, ví dụ 40m5s). Các sản phẩm chấm của Đệ tứ cũng có ích khi xử lý các thế giới trò chơi hình cầu - hoặc rộng hơn khi định hướng các khối của hình cầu xoay.
Luke Briggs

@Luke Briggs: Điểm thế giới trò chơi hình cầu nghe có vẻ đáng để xây dựng trong câu trả lời của riêng nó (đặc biệt là với sơ đồ) nếu bạn sẵn sàng cho nó. :)
DMGregory

Ý tưởng tuyệt vời - đó là 3:00 đây (vì vậy tôi nghĩ rằng nó sẽ đi ra một chút vô nghia!) Nhưng tôi muốn được hạnh phúc để kéo một cái gì đó cùng nhau vào ngày mai (Nếu tôi nhớ!)
Luke Briggs

1
Chỉnh sửa: Tôi đã có một chút suy nghĩ về một câu trả lời để thách thức được chấp nhận! Ít nhất tôi sẽ đánh dấu nó là một vết cắt thô để mọi người có thể nhận ra vết bỏng đêm khuya đã xảy ra: P
Luke Briggs

Chúng ta đi đây! Tôi đã cố gắng bao quát nó theo nghĩa tổng quan đồ họa trên cơ sở rằng câu trả lời của bạn đã bao gồm các chức năng cơ bản thực sự tốt. Thời gian cho một số giấc ngủ tôi nghĩ!
Luke Briggs

14

Sản phẩm chấm được sử dụng ở đâu?

Trong Unity, một trong những người dùng phổ biến nhất của sản phẩm chấm là bất cứ khi nào bạn kiểm tra xem hai phần tư có bằng nhau thông qua ==hoặc !=. Unity tính toán sản phẩm dấu chấm để kiểm tra độ tương tự thay vì so sánh trực tiếp các giá trị x, y, z, w bên trong. Thật đáng để ghi nhớ điều này vì nó khiến cuộc gọi trở nên đắt đỏ hơn bạn tưởng.

Chúng tôi cũng sử dụng nó trong một trường hợp sử dụng thú vị quá ..

Thú vị với các sản phẩm chấm tứ phương - Thế giới và quỹ đạo hình cầu

Mô phỏng của toàn bộ các hành tinh và thậm chí toàn bộ hệ mặt trời đang ngày càng phổ biến. Để thực hiện điều này trong thời gian thực, chúng tôi cũng cần sản phẩm chấm tứ phương. Rất nhiều trong số họ. Sản phẩm chấm quancyion rất ít được sử dụng nhưng nó chắc chắn có công dụng của nó - Hãy xem nào!

Đầu tiên, chúng ta có một loạt các phép quay để xem xét:

  1. (Tùy chọn) Ngôi sao xung quanh trung tâm thiên hà
  2. Hành tinh xung quanh ngôi sao
  3. Độ nghiêng của hành tinh
  4. Vòng quay của hành tinh
  5. Vị trí của các ô lưới gần đó (xoay quanh lõi hành tinh) *
  6. Nhiều mặt phẳng quỹ đạo

Kết hợp tất cả chúng lại với nhau và bạn kết thúc với rất nhiều phức tạp (và rất nhiều con số khổng lồ!). Khi người xem đang đứng trên bề mặt hành tinh, chúng ta không muốn họ bị tổn thương ở một tốc độ điên rồ nào đó trong không gian trò chơi của chúng ta. Chúng tôi thực sự thay vì họ đứng yên và một nơi nào đó gần nguồn gốc - thay vào đó di chuyển vũ trụ xung quanh người chơi.

Hành tinh quay

Điều quan trọng, để chúng ta có thể điều chỉnh độ xoáy và độ nghiêng của hành tinh trong kịch bản này, chúng ta cần phải khóa trục để nó chỉ có thể xoay lên / xuống trên hình ảnh ở trên (tức là vung "lên" khi người chơi di chuyển Bắc). Đó là nơi mà một sản phẩm chấm tứ phương xuất hiện. Nếu chúng ta không sử dụng một sản phẩm chấm ở đây và thay vào đó chỉ cần nhân độ nghiêng, điều này sẽ xảy ra:

Nghiêng 'hành tinh' không chính xác

Lưu ý cách các cực của các 'hành tinh' trên quỹ đạo của chúng ta luôn nghiêng về phía ngôi sao. Đây không phải là những gì xảy ra trong thực tế - độ nghiêng là theo một hướng cố định .

Không đi quá xa chủ đề, đây là một bản tóm tắt nhanh:

  • Trên một mặt cầu, một hướng cũng mô tả gọn gàng một vị trí bề mặt.
  • Chúng tôi đã có rất nhiều vòng quay để kết hợp với nhau.
  • Mô tả mọi thứ như xoay vòng; vị trí của người xem, quá. Điều này giúp tăng hiệu suất vì cuối cùng chúng tôi sẽ thực hiện ít hoạt động hơn.
  • Góc giữa các phép quay (sản phẩm chấm của chúng tôi) sau đó giúp đo kinh độ và hoạt động đặc biệt tốt trong việc xử lý nghiêng.

Bằng cách chỉ thu được góc, chúng tôi giảm một số vòng quay không mong muốn đó . Đồng thời, chúng tôi cũng đã kết thúc với một phép đo kinh độ rất hữu ích cho việc điều hướng cũng như khí hậu địa phương.

* Các hành tinh được xây dựng từ rất nhiều ô lưới . Chỉ những người gần đó thực sự được hiển thị.


2
Điều này thực hiện công việc tuyệt vời trong bối cảnh và thúc đẩy vấn đề, nhưng tôi vẫn hơi mơ hồ về cách tính toán của sản phẩm chấm tứ phương (ví dụ: sản phẩm vô hướng dot(a, b) = a.x*b.x + a.y*b.y + a.z*b.z + a.w*b.wtrái ngược với thành phần bậc bốn mà chúng ta sẽ sử dụng để kết hợp với nhau luân chuyển) sẽ giúp chúng tôi giải quyết vấn đề này. Tôi rất vui lòng nâng cấp nếu bạn có thể giải thích vấn đề này một lát sau (Tôi không có ý giữ bạn khỏi sự chậm chạp của bạn ... Ý tôi là ngủ!)
DMGregory

@DmGregory câu trả lời ngắn gọn là nghiêng là số lẻ; tất cả mọi thứ kết hợp độc đáo ngoại trừ cái đó (hành tinh sẽ xuất hiện để lắc lư xung quanh ngôi sao của nó). Tôi sẽ (hy vọng!) Thêm một số bối cảnh vào ngày mai!
Luke Briggs

@DMGregory Tôi đã thêm một số thông tin bổ sung (Tôi không thể ngủ!) - hy vọng điều đó làm cho nó rõ ràng hơn.
Luke Briggs

1
Xin lỗi nếu tôi hơi dày đặc, nhưng sau khi đọc lại nhiều lần tôi vẫn không biết mình đã sử dụng sản phẩm chấm trong công thức như thế nào để đạt được sự biến đổi mà bạn mô tả. Bạn có thể thêm một mã giả nhỏ đặt ra các hoạt động bạn thực hiện rõ ràng không?
DMGregory

@DMGregory Tôi không quen thuộc với các bậc bốn nhưng nếu đây là phép quay trên một mặt cầu, thì đây không phải là các chế phẩm xoay. Điều này là sử dụng hình học hình cầu với các vectơ để tính toán vectơ bình thường cho một "đường thẳng" trên bề mặt của một hình cầu AKA bất kỳ chu vi. Một lần nữa, câu trả lời không có ý nghĩa gì cũng như câu hỏi này, nhưng tôi tin rằng họ đang sử dụng hình học hình cầu.
Vịt lớn
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.