Windows에서 DualShock 4 모션 센서에 액세스 (이상적으로 Unity) 축으로 Unity에 노출하지 않습니다. 스틱을 사용하지 않기

Windows 7에서 DualShock 4의 IMU 를 Unity의 모션 컨트롤러로 사용하려고합니다 .

지금까지 나는 시도했다 :

  • DS4Windows (1.5.11) : 모션 센서 데이터를 읽지 만 왼쪽 및 오른쪽 스틱에 매핑하지 않으면이를 축으로 Unity에 노출하지 않습니다. 스틱을 사용하지 않기 때문에 충분하지 않으며 6 채널의 데이터 중 4 개만 맞출 수 있으며 들어오는 값은 좁은 범위로 잘립니다.
  • Motioninjoy (0.7.1001) : DS4를 컨트롤러로 감지하지 않는 것 같습니다 (최신 문서는 DS3 이전 버전 만 참조)
  • GlovePIE (0.43) : LibUSB-Win32 (긴 샷)와 함께 DualShock 3을 사용 하기 위한 지침 을 따른 후 SixAxis 속성이 모두 비어 있습니다.

과거에는 GlovePIE와 같은 외부 프로그램을 사용하여 Wii 원격 모션 센서 데이터를 캡처하고 OSC 메시지 를 통해 Unity에 전달했습니다 . 따라서 Unity가 컨트롤러의 센서를 읽을 수 없다면 이와 같은 접근 방식이 가능합니다 입력 시스템을 통해 직접 .

누구든지 이것으로 운이 있었습니까?



답변

실행 가능한 접근 방식을 찾았습니다. DS4Tool 소스를 잡고 필요한 비트를 Unity 프로젝트에 복사하여 장치에서 직접 보고서를 읽을 수있었습니다.

(즉,의 NativeMethods의 Kernel32.dll에서와 인터페이스 클래스에서 장치 열거 HidDevices 과에서 보고서 읽기 HidDevice의 . 클래스를 나는 가능한 한 간단하게 물건을 유지하기 위해 나머지를 잘라 – 그냥 새에 대한 스레드 폴링있어 데이터를 최대한 빨리)

이 안내서 는 64 바이트 보고서에서 모션 센서 데이터를 찾을 수있는 위치를 알려줍니다. 약간의 경험적 테스트이며 다음과 같이 데이터를 gs 및 라디안 / 초로 가져옵니다.

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 + 오른쪽, y + 위, z +가 플레이어를 가리키는 오른손 좌표계입니다.

이 방법으로 데이터를 가져 오는 것은 Unity의 InputManager를 방해하지 않으며, 표준이 아닌 드라이버를 다운로드하거나 백그라운드에서 추가 소프트웨어를 실행할 필요없이 버튼과 스틱을 계속 예상합니다.


업데이트 : 무선 (블루투스)

무선으로 작동하도록 두 가지 문제와 두 가지 솔루션을 발견했습니다.

  1. DualShock 4는 Windows (Windows 8 이전)와 페어링 상태를 유지하는 것을 좋아하지 않습니다 . 이 바보 같은 절차 는 Windows 7에서 해결되는 것 같습니다.

  2. Bluetooth를 통해 연결된 모션 센서 데이터가 없습니다 . 모션 데이터를 전송하도록 동축하기 위해서는 출력 보고서를 장치에 기록해야합니다 (메소드 번호는 HidDevice, 매직 번호는 DS4Device 참조). 이 작업이 완료되면 다시 입력 한 보고서가 2 바이트 씩 이동합니다.


답변

나는 이것에 대한 해결책을 스스로 만들었다. JoyShockLibrary 라고 하며 DualShock 4, Switch Pro Controller 및 Joy-Cons에서 읽습니다. DS4에 대한 Bluetooth 지원은 최근에 추가되어 여전히 개선되고 있지만 오픈 소스, MIT 라이센스이며 잘 작동합니다.

그것은에서 사용되는 JoyShockMapper 입력 맵핑 도구이며, 아직 공개되지 JoyShockOverlay,하지만 당신은 행동에 그것을 볼 수 있습니다 여기 (Gfycat)와 여기 (유튜브).

JoyShockLibrary는 IMU 보고서 외에도 XInput과 매우 유사하게 XInput을 완벽하게 보완하므로 현재 지원하는 모든 자이로 및 가속도계 입력의 이점으로 모든 최신 콘솔 컨트롤러를 쉽게 커버 할 수 있습니다.

Unity에서는 사용하기가 쉽지만 다른 사람들이 쉽게 사용할 수 있도록 .cs 파일을 넣어야합니다.


답변

그것들은 DirectInput을 XInput으로 감싸는 도구 인 것처럼 보입니다. Unity는 DirectInput을 지원하므로 타사 도구없이 작동하도록해야합니다. 핵심은 IMU가 DirectInput의 어떤 것에 매핑되고 이미 사용 가능한 상태에있는 경우입니다. 그렇지 않은 경우 원시 데이터를 처리하기 위해 직접 DirectInput 핸들러를 작성해야 할 수도 있습니다.

이 모든 컨트롤러 문제에 대해 xbox에 감사 할 수 있습니다.