2017-01-29 22 views
5

Tôi đang tạo một trò chơi mà bạn sử dụng điều khiển từ xa quay (chỉ biết vòng quay của nó) để lái xe. Tôi có một vấn đề với chuyển đổi Quaternion (đây là đầu ra của bộ điều khiển) để xoay bánh lái. Đây là hình thức làm việc gần nhất với tất cả những thứ mà tôi đã thử (transform.localRotation là vòng quay của vô-lăng):Làm thế nào để chuyển đổi quaternion xoay để chuyển động tay lái?

void Update() { 

    transform.localRotation = GvrController.Orientation; 

    transform.localRotation = new Quaternion(0.0f, 0.0f, transform.localRotation.z, transform.localRotation.w); 

} 

Đây rõ ràng không phải là giải pháp tốt và hoạt động không tốt. Có một hình ảnh rất đơn giản về những gì tôi đang cố gắng làm: enter image description here Định hướng mặc định của bộ điều khiển hướng về phía trước như trên hình ảnh.

Về cơ bản, toàn bộ vấn đề là cách bỏ qua tất cả các trục khác với trục chịu trách nhiệm quay (trục 1 trên hình ảnh) và áp dụng nó vào vô-lăng. Bạn có biết làm thế nào tôi có thể làm điều này?

EDIT: Bởi vì thật khó để giải thích vấn đề mà không trực quan hóa tôi chụp ảnh bộ điều khiển của mình và vẽ trục lên chúng.

Đây là định hướng mặc định của điều khiển:

enter image description here

Và đây là cách nó được tổ chức với trục đánh dấu vào nó:

enter image description here

+0

Nó có lẽ sẽ giúp ích nếu bạn đưa ra một số đầu vào và đầu ra mong đợi để hiểu rõ hơn về vòng xoay mà bộ điều khiển mang lại cho bạn. – FINDarkside

+0

Vâng đây là những khó chịu để gỡ lỗi. Tôi khuyên bạn nên chạy thử chạy thử với góc đầu ra mong muốn đã biết, sau đó bạn có thể "đảo ngược" công thức chính xác trong bất kỳ môi trường lập trình nào như Matlab hoặc Python Spyder và sau đó chuyển nó sang ngôn ngữ/khung mong muốn. – NikoNyrh

+0

Bạn có thể vui lòng cung cấp cho chúng tôi bản ghi có chuyển đổi Euler không? –

Trả lời

2

Sử dụng Quaternion.EulerQuaternion.eulerAngles. Lưu ý thứ tự cho hàm Euler là z, x rồi y, không giống như Vector3. EulerAngles trả về một góc theo độ (trong khi rotation.x trả về số lượng quaternion cho trục đó). Chức năng Euler hy vọng một góc do đó bạn muốn một cái gì đó như:

Quaternion rot = GvrController.Orientation; 
transform.localRotation = Quaternion.Euler(rot.eulerAngles.z, 0, 0); 

Tùy thuộc vào cách các trục của bộ điều khiển của bạn được thiết lập, bạn có thể cần phải thử nghiệm với định hướng khác nếu nó không phải là y-up z-forward ví dụ

transform.localRotation = Quaternion.Euler(rot.eulerAngles.x, 0, 0); 

hoặc

transform.localRotation = Quaternion.Euler(0, 0, rot.eulerAngles.z); 

và vân vân. Nó sẽ sớm trở nên rõ ràng mà hệ thống nó sử dụng.

Ngoài ra, nếu vô-lăng không được làm tròn với bất kỳ thứ gì sử dụng vòng quay thay vì cục bộ.

+0

Tôi có cùng một vấn đề như trước: nó phản ứng không chỉ với bộ điều khiển được xoay như một tay lái mà còn xoay nó về phía trước. –

+1

Tôi muốn sử dụng định hướng bộ điều khiển sử dụng. Đã cập nhật bài đăng. Nếu trục z sai chỉ cần thử các trục khác. – Absinthe

+0

Vẫn không hoạt động. Nó cho kết quả rất không nhất quán - vô lăng thay đổi hướng quay hoặc dừng mà không có tôi thay đổi hướng quay của bộ điều khiển.Tôi đã thử tất cả trục và bất kỳ trục nào trong số chúng dường như tương ứng với trục mà tôi muốn vô lăng xoay vòng. –

Các vấn đề liên quan