kết nối WiiMote với Unity 5


7

Tôi đang tìm kiếm một hướng dẫn về kết nối WiiMote với Unity 5 như một thiết bị Nhập liệu. Tôi đã tìm thấy thư viện này ở đây nhưng tôi không hiểu cách cài đặt nó và những điều kiện tiên quyết để nó hoạt động.


1
Trước đây (trên 4.x miễn phí), tôi đã sử dụng một chương trình bên ngoài, Găng tay (hoặc OSCulator trên Mac), để giao tiếp với thiết bị và gửi tin nhắn cho Unity thông qua tin nhắn Open Sound Control. Có một thư viện gọi là OSCuMote để làm việc này. Nó hoạt động để tạo mẫu nhanh và bẩn, nhưng có lẽ không phải là một cách tiếp cận chất lượng phát hành. (UniWii nghe có vẻ tốt hơn, nhưng tôi không có kinh nghiệm cá nhân khi sử dụng nó nên tôi đoán) Nếu cách tiếp cận OSC là đủ cho nhu cầu của bạn, hãy cho tôi biết trong câu trả lời và tôi sẽ viết chi tiết dưới dạng câu trả lời.
DMGregory

Vâng, đây là một dự án Đại học để tìm hiểu làm thế nào để giao tiếp với các thiết bị bên ngoài (ví dụ: kinect, rift constulus, wiimote, leapmotion, v.v.). Vấn đề là Nintendo đã tự thiết lập tất cả để nhà phát triển không phải lo lắng về vấn đề này, nhưng vẫn chưa có hỗ trợ nào cho Unity 5)
John Demetriou

@DMGregory Tôi đang cố gắng không làm phức tạp mọi thứ chỉ bằng một con quay đơn giản và đầu vào nút từ WiiMote
John Demetriou


@ Bradman175 Câu hỏi đó đã được hỏi một năm sau tôi :)
John Demetriou

Câu trả lời:


1

Tôi đã cố gắng xem xét thư viện UniWii được liên kết trong câu hỏi , nhưng trang tải xuống Windows dường như là một liên kết bị hỏng tại thời điểm này và các chủ đề diễn đàn về nó chủ yếu là 4 năm tuổi. :

Ý tưởng cơ bản mà nó sử dụng, một plugin DLL gốc được tham chiếu từ C # với ánh xạ [DLLImport], là một ý tưởng hay. Tôi đã sử dụng thành công để giao tiếp với bộ điều khiển Kinect và Playstation Move, vì vậy nếu bạn tìm thấy bản tải xuống hoạt động của phiên bản cập nhật của plugin này, có lẽ đó là một tùy chọn tốt hơn và mạnh mẽ hơn mà tôi sắp làm trình bày dưới đây.


Phương pháp tôi đã sử dụng để đưa thông tin Wii Remote vào Unity (hoặc Flash) là cài đặt một chương trình bên ngoài như Găng tay trên Windows hoặc OSCulator trên Mac. Các chương trình này thực hiện Mô phỏng đầu vào có thể lập trình, giao tiếp hiệu quả với nhiều loại thiết bị và cung cấp cho bạn các công cụ để kiểm soát cách chúng nói chuyện với nhau.

Cả hai đều thể hiện khả năng gửi và nhận dữ liệu qua các tin nhắn Open Sound Control , chúng tôi sẽ lắng nghe trong Unity để đọc dữ liệu đến từ Wii Remote.

Tôi sẽ mô tả phương pháp Găng tay vì tôi quen thuộc nhất khi làm việc trên Windows.

  1. Đảm bảo bộ điều hợp Bluetooth của máy tính của bạn được bật.

  2. Chạy Găng tay và điền vào một tập lệnh mới với nội dung như sau:

(Bạn có thể lưu tệp này dưới dạng tệp ".PIE" mới để tải tệp này sau)

var.port = 54934

debug = "On: " + Wiimote1.Exists + " Wiimote battery level: " + Wiimote1.Battery + " Rotation: " + Wiimote1.YawSpeed

SendOsc("localhost", var.port, "/wii/1/start", true)
SendOsc("localhost", var.port, "/wii/1/acceleration", tostring(Wiimote1.gx), tostring(Wiimote1.gy), tostring(Wiimote1.gz))
SendOsc("localhost", var.port, "/wii/1/rotationSpeed", tostring(Wiimote1.PitchSpeed in radians), tostring(-Wiimote1.YawSpeed in radians), tostring(Wiimote1.RollSpeed in radians))
SendOsc("localhost", var.port, "/wii/1/analog", tostring(Wiimote1.Nunchuk.JoyX), tostring(Wiimote1.Nunchuk.JoyY))
SendOsc("localhost", var.port, "/wii/1/buttonA", int(Wiimote1.A))
SendOsc("localhost", var.port, "/wii/1/buttonB", int(Wiimote1.B))
SendOsc("localhost", var.port, "/wii/1/buttonC", int(Wiimote1.Nunchuk.C))
SendOsc("localhost", var.port, "/wii/1/buttonZ", int(Wiimote1.Nunchuk.Z))
SendOsc("localhost", var.port, "/wii/1/button1", int(Wiimote1.One))
SendOsc("localhost", var.port, "/wii/1/done", true)
  1. Nhấp vào nút "Chạy" trong Găng tay. Bây giờ nó đang quét từ xa Wii.

  2. Đặt Remote Wii trên một mặt phẳng (để hiệu chuẩn ban đầu ổn định)

  3. Nhấn các nút 1 & 2 trên Wii Remote cùng một lúc.

Tất cả 4 đèn trên điều khiển từ xa sẽ nhấp nháy - Wii Remote đang quét các máy thu

  1. Đợi Windows thực hiện "cài đặt phần cứng mới" vô nghĩa.

Bạn có thể bỏ qua điều này, bao gồm bất kỳ hộp thoại nào nói rằng bạn cần khởi động lại (chúng nói dối).

  1. Đèn 1 & 4 nên bật sáng, đèn 2 & 3 tắt.

Găng tay đã tìm thấy điều khiển từ xa

  1. Đèn 2 & 3 nên bật sáng, tắt đèn 1 & 4.

Găng tay đang hiệu chỉnh các cảm biến. Giữ điều khiển từ xa, hoặc nó sẽ hiệu chỉnh mãi mãi (điều mà đôi khi nó vẫn làm).

  1. Đèn 1 sẽ sáng, phần còn lại tắt

Điều khiển từ xa được đăng ký là trình phát 1 và đang gửi dữ liệu qua các tin nhắn Open Sound Control.

Hộp Gỡ lỗi trong Găng tay sẽ cho thấy rằng điều khiển từ xa tồn tại, báo cáo mức pin của nó và hiển thị dữ liệu xoay vòng ngáp hiện tại. (Đó là dòng thứ hai của kịch bản ở trên). Nếu bạn không nhận được dữ liệu ngáp khi xoay bộ điều khiển, thì bạn nên tắt nguồn và thử ghép lại.

  1. Bạn có thể dừng và bắt đầu trò chơi Unity hoặc tập lệnh PIE của mình bao nhiêu tùy ý và điều khiển từ xa sẽ "chỉ hoạt động" cho đến khi nó tắt.

Lưu ý rằng khi bạn dừng tập lệnh, đèn sẽ tắt, nhưng điều khiển từ xa vẫn BẬT và làm cạn kiệt pin. Nếu bạn không sử dụng điều khiển trong một thời gian, hãy giữ nút nguồn để tắt. Bạn sẽ phải bắt đầu lại từ bước 3 khi bạn muốn sử dụng lại.

Được rồi, vậy đó là cách lấy dữ liệu vào máy tính của bạn. Bây giờ bạn có thể sử dụng một thư viện như OSCuMote ( liên kết tải xuống ) để đọc các tin nhắn OSC đến trên cổng 54934 và truy cập dữ liệu trong các tập lệnh Unity C # của bạn.

Tôi sẽ cố gắng dọn sạch tập lệnh C # mà tôi đã viết cho dự án cuối cùng của mình và đưa nó vào như một phần của câu trả lời này.


Tôi đã có cùng một vấn đề cả ngày (không tìm thấy dll) và tôi nghĩ rằng đây là cùng một mã.google.com.vn/p/3div
John Demetriou

Câu hỏi nhỏ về windows 8.1 Bạn đã kết nối với wiimote như thế nào? Ý tôi là bạn đã thêm nó trong các thiết bị bluetooth hoặc một cái gì đó tương tự trước khi giao tiếp với nó thông qua sự thống nhất?
John Demetriou

1
@ John Demetriou, tôi e rằng tôi chỉ thực hiện điều này với Windows Vista và 7. Win 7 không cần bất kỳ thiết lập nào trong Thiết bị Bluetooth, nhưng tôi không biết chắc chắn có cần thêm bước nào trên Windows 8 không 8.1. Tôi biết rằng việc kết nối DualShock 4 chỉ dễ dàng hơn từ Windows 7 đến 8, vì vậy tôi hy vọng đó cũng là trường hợp của Wii Remote.
DMGregory

Quá trình cho dualshock là gì?
John Demetriou

@John Demetriou, trên Win 8, bạn đặt nó vào chế độ ghép nối bằng cách giữ các nút Share & PS cho đến khi bạn nhận được một cái chớp mắt từ thanh ánh sáng, sau đó thêm nó qua màn hình cài đặt Thiết bị Bluetooth. Trong Win 7, điều đó phức tạp hơn: gamedev.stackexchange.com/questions/87106/ Mặc dù chúng tôi đang đi lạc ngoài chủ đề - vui lòng liên hệ trực tiếp với tôi nếu bạn muốn thảo luận thêm.
DMGregory

0

Mặc dù câu trả lời của DMGregory là thực sự kỹ lưỡng và tốt nhưng tôi đã tìm thấy một giải pháp khác và mạnh mẽ hơn phù hợp với nhu cầu của tôi. Tôi đã tìm thấy một dll (hiện tại tôi không thể tìm thấy liên kết nhưng sẽ tải lên ở đâu đó và chỉnh sửa câu trả lời của tôi để bao gồm liên kết) và sử dụng DLLImport và các chức năng này

[DllImport ("UniWii")]
private static extern void wiimote_start();
[DllImport ("UniWii")]
private static extern void wiimote_stop();
[DllImport ("UniWii")]
private static extern int wiimote_count();
[DllImport ("UniWii")]
private static extern byte wiimote_getAccX(int which);
[DllImport ("UniWii")]
private static extern byte wiimote_getAccY(int which);
[DllImport ("UniWii")]
private static extern byte wiimote_getAccZ(int which);
[DllImport ("UniWii")]
private static extern float wiimote_getIrX(int which);
[DllImport ("UniWii")]
private static extern float wiimote_getIrY(int which);
[DllImport ("UniWii")]
private static extern float wiimote_getRoll(int which);
[DllImport ("UniWii")]
private static extern float wiimote_getPitch(int which);
[DllImport ("UniWii")]
private static extern float wiimote_getYaw(int which);
[DllImport ("UniWii")]
private static extern bool wiimote_getButtonA(int which);
[DllImport ("UniWii")]
private static extern bool wiimote_getButtonB(int which);
[DllImport ("UniWii")]
private static extern bool wiimote_getButtonUp(int which);
[DllImport ("UniWii")]
private static extern bool wiimote_getButtonLeft(int which);
[DllImport ("UniWii")]
private static extern bool wiimote_getButtonRight(int which);
[DllImport ("UniWii")]
private static extern bool wiimote_getButtonDown(int which);
[DllImport ("UniWii")]
private static extern bool wiimote_getButton1(int which);
[DllImport ("UniWii")]
private static extern bool wiimote_getButton2(int which);
[DllImport ("UniWii")]
private static extern bool wiimote_getButtonPlus(int which);
[DllImport ("UniWii")]
private static extern bool wiimote_getButtonMinus(int which);
[DllImport ("UniWii")]
private static extern bool wiimote_getButtonHome(int which);
[DllImport ("UniWii")]
private static extern byte wiimote_getNunchuckStickX(int which);
[DllImport ("UniWii")]
private static extern byte wiimote_getNunchuckStickY(int which);
[DllImport ("UniWii")]
private static extern byte wiimote_getNunchuckAccX(int which);
[DllImport ("UniWii")]
private static extern byte wiimote_getNunchuckAccZ(int which);
[DllImport ("UniWii")]
private static extern bool wiimote_getButtonNunchuckC(int which);
[DllImport ("UniWii")]
private static extern bool wiimote_getButtonNunchuckZ(int which);

Tôi đã quản lý để giao diện với WiiMote và có được chức năng tôi cần.

Nhà xuất bản ban đầu của dll không còn hỗ trợ nó nữa, hoặc không quan tâm nữa. Tôi đã gửi email cho họ về điều đó và họ vẫn chưa trả lời sau một vài tháng. Tôi tìm thấy nó mặc dù trong một dự án được lưu trữ trong mã google ( ở đây ). Đây là một dự án đầy đủ với các ví dụ và.

EDIT Cũng lưu ý nếu bạn sử dụng dll này cho một ứng dụng thương mại, bạn sẽ phải liên hệ với nhà xuất bản gốc để được cấp phép (nếu bạn quản lý để nhận được phản hồi từ họ). Và tôi cũng gặp một số vấn đề khi sử dụng dll này khi xây dựng trên máy 64 bit bằng Unity 64 bit (nếu nó được xây dựng trên máy 32 bit thì mọi thứ đều ổn và nó chạy hoàn hảo trên cả 64 bit và 32 bit)


1
Tôi rất vui vì bạn đã sắp xếp nó! Tôi sẽ để lại câu trả lời khác, trong trường hợp ai đó đến duyệt câu hỏi này và muốn có tùy chọn không có DLL. Vì tò mò, bạn sẽ cần phải thực hiện phản ứng tổng hợp cảm biến, để biến các biện pháp gia tốc kế + con quay hồi chuyển thành một ước tính định hướng? Tôi đã có một số kinh nghiệm với điều này trong Unity, vì vậy hãy cho tôi một tiếng hét nếu bạn muốn chung tay với nó. :)
DMGregory

@DMGregory Ý bạn là gì khi hợp nhất cảm biến?
John Demetriou

1
Phản ứng tổng hợp cảm biến là khi bạn thực hiện các phép đo thiếu sót / giới hạn từ nhiều cảm biến khác nhau (như gia tốc kế và con quay hồi chuyển) và kết hợp chúng thành ước tính đồng thuận của hình ảnh đầy đủ - trong trường hợp này là hướng của thiết bị. Một con quay hồi chuyển tự nó chỉ cho chúng ta biết về sự thay đổi trong vòng quay, và một gia tốc kế mang đến sự pha trộn lộn xộn giữa gia tốc tức thời và định hướng tuyệt đối cho trường trọng lực. Kết hợp cả hai cho phép mỗi cảm biến điền vào dữ liệu bị thiếu hoặc nhiễu / trôi trong cái kia.
DMGregory

@JohnDemetriou Tôi cũng ở trong hoàn cảnh như bạn. Bạn có thể vui lòng chia sẻ DLL mà bạn tìm thấy để làm việc cho bạn. Cảm ơn bạn!
Andrei Erdoss

1
@AndreiErdoss đã cập nhật câu trả lời của tôi với liên kết và thông tin bổ sung trên dll
John Demetriou
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.