विंडोज में ड्यूलशॉक 4 मोशन सेंसर एक्सेस करना (आदर्श रूप से एकता)


10

मैं विंडोज 7 के तहत यूनिटी में एक गति नियंत्रक के रूप में एक ड्यूलशॉक 4 के आईएमयू का उपयोग करने की कोशिश कर रहा हूं ।

अब तक मैंने कोशिश की है:

  • DS4Windows ( 1.5.11 ): मोशन सेंसर डेटा को पढ़ता है, लेकिन जब तक मैं उन्हें बाएं और दाएं स्टिक के लिए मैप नहीं करता, तब तक उन्हें कुल्हाड़ियों के रूप में एकता को उजागर नहीं करता है। यह पर्याप्त नहीं है क्योंकि मैं छड़ें का उपयोग खो देता हूं, मैं केवल 6 में से 4 चैनलों के आंकड़ों को फिट कर सकता हूं, और इसके माध्यम से आने वाले मूल्यों को एक संकीर्ण सीमा में क्लिप किया जाता है।
  • Motioninjoy (0.7.1001): एक नियंत्रक के रूप DS4 पता लगाने के लिए (नवीनतम डॉक्स DS3 और से पहले ही देखें) प्रकट नहीं होता है
  • GlovePIE (0.43): लिबस-विन 32 (एक लंबा शॉट) के साथ डुअलशॉक 3 का उपयोग करने के निर्देशों का पालन ​​करने के बाद , सिक्सएक्सिस गुण सभी रिक्त हैं।

अतीत में मैंने Wii रिमोट मोशन सेंसर डेटा को कैप्चर करने और OSC संदेशों के माध्यम से एकता को पास करने के लिए GlovePIE जैसे बाहरी कार्यक्रमों का उपयोग किया है , इसलिए मैं इस तरह से एक दृष्टिकोण के लिए खुला रहूंगा यदि मुझे नियंत्रक के सेंसर पढ़ने के लिए एकता नहीं मिल सकती है सीधे अपने इनपुट सिस्टम के माध्यम से ।

किसी को भी इस के साथ किस्मत थी?

जवाबों:


8

मुझे एक व्यावहारिक दृष्टिकोण मिला है। मैंने DS4Tool स्रोत को पकड़ा और अपनी बिट्स को अपनी एकता परियोजना में कॉपी किया ताकि मैं सीधे डिवाइस से रिपोर्ट पढ़ सकूं

(यह है कि नेटिवमेथोड्स क्लास को कर्नेल 32.dll के साथ इंटरफ़ेस करने के लिए, हिडविविसेस से डिवाइस एन्यूमरेशन , और हिडविस क्लास की रिपोर्ट पढ़ रहा है। मैंने बाकी चीजों को यथासंभव सरल रखने के लिए काट दिया है - मुझे अभी नए के लिए एक थ्रेड पोलिंग मिली है। डेटा जितना हो सके उतना तेज़।)

इस गाइड ने मुझे बताया कि 64-बाइट रिपोर्ट में मोशन सेंसर डेटा कहां मिलेगा। थोड़ा अनुभवजन्य परीक्षण और ऐसा लगता है कि यह जीएस और रेडियन / सेकंड में डेटा प्राप्त करता है:

accel = new Vector3(
            System.BitConverter.ToInt16(_inputBuffer, 19),
            System.BitConverter.ToInt16(_inputBuffer, 21),
            System.BitConverter.ToInt16(_inputBuffer, 23)
            )/8192f;

gyro = new Vector3(
            System.BitConverter.ToInt16(_inputBuffer, 13),
            System.BitConverter.ToInt16(_inputBuffer, 15),
            System.BitConverter.ToInt16(_inputBuffer, 17)
            )/1024f;

यह x + right, y + up और z + प्लेयर की ओर इशारा करते हुए एक दाएँ हाथ का समन्वय प्रणाली है।

इस तरह से डेटा प्राप्त करना एकता के InputManager के साथ हस्तक्षेप नहीं करता है, जो अभी भी गैर-मानक ड्राइवरों को डाउनलोड करने या पृष्ठभूमि में अतिरिक्त सॉफ़्टवेयर चलाने की आवश्यकता के बिना, बटन और स्टिक उठाएगा।


अपडेट: वायरलेस (ब्लूटूथ)

मुझे वायरलेस तरीके से काम करने के लिए दो समस्याएँ मिली (और दो समाधान):

  1. डुअलशॉक 4 जी को विंडोज (विंडोज 8 से पहले) के लिए जोड़ा जाना पसंद नहीं हैयह मूर्खतापूर्ण प्रक्रिया विंडोज 7 पर उस के आसपास काम करने लगती है।

  2. ब्लूटूथ के माध्यम से कनेक्ट होने पर कोई मोशन सेंसर डेटा नहीं । मुझे पता चला है कि आपको डिवाइस को आउटपुट रिपोर्ट लिखने की आवश्यकता है (गति संख्या के लिए इसे भेजने के लिए जादू की संख्या के लिए विधि और DS4Device के लिए HidDevice देखें)। एक बार यह हो जाने के बाद, आपको वापस मिलने वाली इनपुट रिपोर्ट्स को 2 बाइट्स द्वारा स्थानांतरित कर दिया जाएगा।


क्या आपके लिए इस पोस्ट के अनुसार इस उत्तर को स्पष्ट करना संभव है ?

मैं अभी यात्रा कर रहा हूं, लेकिन जब मैं वाईफ़ाई के साथ कुछ डाउनटाइम पा रहा हूं, तो मैं इसे ले लूंगा। धन्यवाद @JoshPetrie!
DMGregory

इस पर खुदाई करते हुए, मेरे पास उस गति संवेदी परियोजना के लिए स्रोत कोड नहीं है जिस पर मैं काम कर रहा था, और DS4Tool में वापस जाकर मुझे याद दिलाया कि मुझे केवल बिट्स की आवश्यकता क्यों है! यह सुपर वर्बोज़ हो जाता है और एक StackExchange उत्तर के लिए एक उचित लंबाई से परे हो सकता है। मैं जितना संभव हो उतना सरल बनाने की कोशिश करूँगा, लेकिन इसमें कुछ समय लगेगा।
DMGregory

1
@DMGregory - यह डेटा शीट है, मुझे लगता है, IMU के लिए DualShock 4 उपयोग करता है: mouser.com/ds/2/783/BST-BMI055-DS000-08-786482.pdf - और यह कहता है कि Short.MaxValue मेल खाती है 2000 डिग्री प्रति सेकंड। मेरी गणना से, आप प्रति सेकंड 1833 डिग्री प्राप्त कर रहे हैं, जो करीब है (और परीक्षण के परिणाम के लिए उचित है), लेकिन शायद तदनुसार अपनी गणना समायोजित करने से आपको थोड़ी अधिक सटीकता मिलेगी?
जिब स्मार्ट

(मैं अभी खुद गायरो सामान कर रहा हूं, और अपने आप को परीक्षण करके मानक इकाई रूपांतरणों का पता लगाने की कोशिश करने जा रहा था, और फिर एक मित्र ने मेरे लिए यह लिंक पाया)
जिब स्मार्ट

1

मैंने खुद इसका हल बनाया है। इसे JoyShockLibrary कहा जाता है , और DualShock 4, स्विच प्रो नियंत्रक, और Joy-Cons से पढ़ता है। यह खुला स्रोत, MIT लाइसेंस है, और अच्छी तरह से काम करता है, हालांकि DS4 के लिए ब्लूटूथ समर्थन केवल हाल ही में जोड़ा गया था और अभी भी सुधार कर रहा है।

यह JoyShockMapper में उपयोग किया जाता है , जो एक इनपुट-मैपिंग टूल है, और JoyShockOverlay, जो अभी तक सार्वजनिक नहीं है, लेकिन आप इसे यहां (Gfycat) और यहां (YouTube) कार्रवाई में देख सकते हैं ।

JoyShockLibrary XInput को अच्छी तरह से पूरक करता है - इसके IMU रिपोर्ट के अलावा, यह XInput के समान दिखता है - इसलिए आप उन सभी मौजूदा जीन कंसोल नियंत्रकों को आसानी से कवर कर सकते हैं, जो इसे समर्थन करने वाले gyro और एक्सेलेरोमीटर इनपुट के लाभ के साथ हैं।

एकता के साथ उपयोग करना बहुत आसान है, हालांकि मुझे दूसरों के लिए इसे आसान बनाने के लिए एक .cs फ़ाइल डालनी चाहिए।


0

उन सभी को उपकरण दिखाई देते हैं जो DirectInput को XInput लपेटते हैं। एकता के पास DirectInput का समर्थन है और इसलिए आपको इसे 3 पार्टी टूल्स के बिना काम करते हुए देखना चाहिए। यदि IMU DirectInput में कुछ भी मैप किया जाता है और यदि यह पहले से ही उपयोग करने योग्य स्थिति में है, तो कुंजी। यदि नहीं, तो कच्चे डेटा से निपटने के लिए आपको अपना DirectInput हैंडलर लिखना पड़ सकता है।

आप इन सभी नियंत्रक मुसीबतों के लिए Xbox का धन्यवाद कर सकते हैं।


दुर्भाग्य से IMU 20 "जॉयस्टिक कुल्हाड़ियों" में से किसी के लिए मैप नहीं किया गया है, एकता पढ़ता है, और न ही Input.gyro आदि के लिए मैंने कच्चे डेटा में खुदाई को समाप्त किया; समाधान के विवरण के साथ एक उत्तर जोड़ा गया।
DMGregory
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.