레이싱 휠 및 힘 피드백Racing wheel and force feedback

이 페이지에서는 RacingWheel 를 사용 하는 Xbox one 경주 휠 프로그래밍의 기본 사항 및 UWP (유니버설 Windows 플랫폼) 관련 api에 대해 설명 합니다.This page describes the basics of programming for Xbox One racing wheels using Windows.Gaming.Input.RacingWheel and related APIs for the Universal Windows Platform (UWP).

이 페이지를 읽으면 다음에 대해 알아봅니다.By reading this page, you'll learn:

  • 연결 된 레이스 휠 및 해당 사용자 목록을 수집 하는 방법how to gather a list of connected racing wheels and their users
  • 경쟁 휠이 추가 또는 제거 되었는지 검색 하는 방법how to detect that a racing wheel has been added or removed
  • 하나 이상의 레이스 휠에서 입력을 읽는 방법how to read input from one or more racing wheels
  • force 피드백 명령을 보내는 방법how to send force feedback commands
  • 경주 휠이 UI 탐색 장치로 작동 하는 방식how racing wheels behave as UI navigation devices

레이스 휠 개요Racing wheel overview

경주 휠은 실제 racecar의 느낌이 비슷한 입력 장치입니다.Racing wheels are input devices that resemble the feel of a real racecar cockpit. 경주 휠은 자동차 또는 트럭을 지 원하는 아케이드 스타일 및 시뮬레이션 스타일의 게임을 위한 완벽 한 입력 장치입니다.Racing wheels are the perfect input device for both arcade-style and simulation-style racing games that feature cars or trucks. 경주 휠 은 windows 10 및 XBOX one UWP 앱에서 지원 됩니다.Racing wheels are supported in Windows 10 and Xbox One UWP apps by the Windows.Gaming.Input namespace.

Xbox One 경주 휠은 다양 한 가격 점수에 제공 되며, 일반적으로 가격 점수가 증가 함에 따라 더 많은 입력을 제공 하 고 피드백 기능을 적용 합니다.Xbox One racing wheels are offered at a variety of price points, generally having more and better input and force feedback capabilities as their price points rise. 모든 레이스 휠에는 아날로그 조종 휠, 아날로그 스로틀 및 브레이크 컨트롤 및 일부 휠 단추가 장착 되어 있습니다.All racing wheels are equipped with an analog steering wheel, analog throttle and brake controls, and some on-wheel buttons. 일부 레이스 휠에는 아날로그 클러치 및 핸드 브레이크 컨트롤, 패턴 shifters 및 강제 피드백 기능이 추가로 장착 되어 있습니다.Some racing wheels are additionally equipped with analog clutch and handbrake controls, pattern shifters, and force feedback capabilities. 모든 레이스 휠에 동일한 기능 집합을 제공 하는 것은 아니고, 특정 기능에 대 한 지원에 따라 달라질 수 있습니다 — . 예를 들어 조종 핸들은 다양 한 회전 범위를 지원할 수 있으며 패턴 shifters 다른 수의 기어를 지원할 수 있습니다.Not all racing wheels are equipped with the same sets of features, and may also vary in their support for certain features—for example, steering wheels might support different ranges of rotation and pattern shifters might support different numbers of gears.

디바이스 성능Device capabilities

다른 Xbox One 레이스 휠은 다양 한 선택적 장치 기능 집합 및 해당 기능에 대 한 다양 한 지원 수준을 제공 합니다. 단일 종류의 입력 장치 간의 이러한 변형 수준은 Windows. 게이밍 API에서 지원 되는 장치 간에 고유 합니다.Different Xbox One racing wheels offer different sets of optional device capabilities and varying levels of support for those capabilities; this level of variation between a single kind of input device is unique among the devices supported by the Windows.Gaming.Input API. 또한 대부분의 장치에서 하나 이상의 선택적 기능이 나 기타 변형을 지원 합니다.Furthermore, most devices you'll encounter will support at least some optional capabilities or other variations. 따라서 각각의 연결 된 레이스 휠의 기능을 개별적으로 확인 하 고 게임에 적합 한 모든 기능을 지 원하는 것이 중요 합니다.Because of this, it's important to determine the capabilities of each connected racing wheel individually and to support the full variation of capabilities that makes sense for your game.

자세한 내용은 레이스 휠 기능 결정을 참조 하세요.For more information, see Determining racing wheel capabilities.

피드백 적용Force feedback

일부 Xbox One 레이스 휠에서는 진정한 힘 피드백을 제공 합니다 — . 즉, 간단한 진동 뿐만 아니라 조정 휠 등의 제어 축에 실제 힘을 적용할 수 있습니다 — .Some Xbox One racing wheels offer true force feedback—that is, they can apply actual forces on an axis of control such as their steering wheel—not just simple vibration. 게임에서는이 기능을 사용 하 여 집중 교육 (시뮬레이션 된_크래시 손상_, "도로 느낌")을 만들고 원활 하 게 작동 하는 문제를 늘립니다.Games use this ability to create a greater sense of immersion (simulated crash damage, "road feel") and to increase the challenge of driving well.

자세한 내용은 Force 피드백 개요를 참조 하세요.For more information, see Force feedback overview.

UI 탐색UI navigation

사용자 인터페이스 탐색을 위한 다양 한 입력 장치를 지원 하 고 게임과 장치 간에 일관성을 유지 하기 위해 대부분의 물리적 입력 장치는 UI 탐색 컨트롤러라는 별도의 논리적 입력 장치로 동시에 작동 합니다.In order to ease the burden of supporting the different input devices for user interface navigation and to encourage consistency between games and devices, most physical input devices simultaneously act as a separate logical input device called a UI navigation controller. UI 탐색 컨트롤러는 입력 장치에서 UI 탐색 명령에 대 한 일반적인 어휘를 제공 합니다.The UI navigation controller provides a common vocabulary for UI navigation commands across input devices.

아날로그 컨트롤에 대 한 고유한 중점 및 경쟁 바퀴 간의 변형 수준으로 인해 일반적으로 게임 패드와 비슷한 디지털 D-패드, 보기, 메뉴, a, B, XY 단추가 포함 됩니다. 이러한 단추는 게임 플레이 명령을 지원 하기 위한 것이 아니며 레이스 휠 단추로 쉽게 액세스할 수 없습니다.Due to their unique focus on analog controls and the degree of variation between different racing wheels, they're typically equipped with a digital D-pad, View, Menu, A, B, X, and Y buttons that resemble those of a gamepad; these buttons aren't intended to support gameplay commands and can't be readily accessed as racing wheel buttons.

UI 탐색 컨트롤러인, 경쟁 바퀴는 필요한 탐색 명령 집합 을 왼쪽 엄지 스틱, D-패드, , 메뉴, aB 단추에 매핑합니다.As a UI navigation controller, racing wheels map the required set of navigation commands to the left thumbstick, D-pad, View, Menu, A, and B buttons.

탐색 명령Navigation command 레이스 휠 입력Racing wheel input
위로Up D-패드 위로D-pad up
아래로Down D-패드 다운D-pad down
왼쪽Left D-패드 왼쪽D-pad left
오른쪽Right D-패드 오른쪽D-pad right
보기View 보기 단추View button
메뉴Menu 메뉴 버튼Menu button
동의함Accept 단추A button
취소Cancel B 단추B button

또한 일부 레이스 휠에서는 몇 가지 선택적인 탐색 명령 집합 을 지 원하는 다른 입력에 매핑할 수 있지만 명령 매핑은 장치 마다 다를 수 있습니다.Additionally, some racing wheels might map some of the optional set of navigation commands to other inputs they support, but command mappings can vary from device to device. 이러한 명령도 지원 하는 것이 좋습니다. 그러나 이러한 명령이 게임 인터페이스를 탐색 하는 데 반드시 필요한 것은 아닙니다.Consider supporting these commands as well, but make sure that these commands are not essential to navigating your game's interface.

탐색 명령Navigation command 레이스 휠 입력Racing wheel input
Page UpPage Up 잠기기varies
Page DownPage Down 잠기기varies
왼쪽 페이지Page Left 잠기기varies
오른쪽 페이지Page Right 잠기기varies
위로 스크롤Scroll Up 잠기기varies
아래로 스크롤Scroll Down 잠기기varies
왼쪽으로 스크롤Scroll Left 잠기기varies
오른쪽으로 스크롤Scroll Right 잠기기varies
컨텍스트 1Context 1 X 단추 (일반적으로)X Button (commonly)
컨텍스트 2Context 2 Y 단추 (일반적으로)Y Button (commonly)
컨텍스트 3Context 3 잠기기varies
컨텍스트 4Context 4 잠기기varies

레이스 휠 검색 및 추적Detect and track racing wheels

Gamepads에 대해 수행 하는 것과 정확히 동일한 방법으로, 즉, 게임 패드 클래스 대신 RacingWheel 클래스를 사용 하 여 레이스 휠 검색 및 추적이 작동 합니다.Detecting and tracking racing wheels works in exactly the same way as it does for gamepads, except with the RacingWheel class instead of the Gamepad class. 자세한 내용은 게임 패드 및 진동 (영문)을 참조 하세요.See Gamepad and vibration for more information.

레이스 휠 읽기Reading the racing wheel

관심이 있는 경주 바퀴를 확인 한 후에는 입력을 수집할 준비가 된 것입니다.After you identify the racing wheels that you're interested in, you're ready to gather input from them. 그러나 사용할 수 있는 다른 종류의 입력과 달리, 레이스 휠에서는 이벤트를 발생 시켜 상태 변경 통신을 하지 않습니다.However, unlike some other kinds of input that you might be used to, racing wheels don't communicate state-change by raising events. 대신, 현재 상태를 폴링하여 정기적으로 사용 합니다.Instead, you take regular readings of their current states by polling them.

레이스 휠 폴링Polling the racing wheel

폴링은 정확한 시점에서 경주 휠의 스냅숏을 캡처합니다.Polling captures a snapshot of the racing wheel at a precise point in time. 입력 수집에 대 한이 방법은 일반적으로 이벤트 기반이 아니라 결정적 루프에서 실행 되기 때문에 대부분의 게임에 적합 합니다. 또한 시간이 지남에 따라 수집 된 여러 개의 단일 입력에서 가져온 것 보다 한 번에 모두 수집 된 입력에서 게임 명령을 해석 하는 것이 더 간단 합니다.This approach to input gathering is a good fit for most games because their logic typically runs in a deterministic loop rather than being event-driven; it's also typically simpler to interpret game commands from input gathered all at once than it is from many single inputs gathered over time.

GetCurrentReading를 호출 하 여 레이스 휠를 폴링합니다. 이 함수는 레이스 휠의 상태를 포함 하는 RacingWheelReading 를 반환 합니다.You poll a racing wheel by calling GetCurrentReading; this function returns a RacingWheelReading that contains the state of the racing wheel.

다음 예제에서는 현재 상태에 대 한 경쟁 바퀴를 폴링합니다.The following example polls a racing wheel for its current state.

auto racingwheel = myRacingWheels[0];

RacingWheelReading reading = racingwheel->GetCurrentReading();

경쟁 휠 상태 외에도 각 읽기는 상태가 검색 된 시기를 정확 하 게 나타내는 타임 스탬프를 포함 합니다.In addition to the racing wheel state, each reading includes a timestamp that indicates precisely when the state was retrieved. 타임 스탬프는 이전 판독값의 타이밍과 게임 시뮬레이션의 타이밍과 관련 된 경우에 유용 합니다.The timestamp is useful for relating to the timing of previous readings or to the timing of the game simulation.

레이싱 휠 기능 확인Determining racing wheel capabilities

대부분의 레이스 휠 컨트롤은 선택 사항이 며 필요한 컨트롤 에서도 다른 변형을 지원 하기 때문에 각 레이스 휠의 기능을 개별적으로 확인 해야 경쟁 바퀴를 읽을 때마다 수집 된 입력을 처리할 수 있습니다.Many of the racing wheel controls are optional or support different variations even in the required controls, so you have to determine the capabilities of each racing wheel individually before you can process the input gathered in each reading of the racing wheel.

선택적 컨트롤은 수동 브레이크, 클러치 및 패턴으로, 각각 경주 휠의 Has핸드 브레이크, Has클러치HasPatternShifter 속성을 읽어 연결 된 레이스 휠이 이러한 컨트롤을 지원 하는지 여부를 확인할 수 있습니다.The optional controls are the handbrake, clutch, and pattern shifter; you can determine whether a connected racing wheel supports these controls by reading the HasHandbrake, HasClutch, and HasPatternShifter properties of the racing wheel, respectively. 속성의 값이 true이면 컨트롤이 지원 됩니다. 그렇지 않으면 지원 되지 않습니다.The control is supported if the value of the property is true; otherwise it's not supported.

if (racingwheel->HasHandbrake)
{
    // the handbrake is supported
}

if (racingwheel->HasClutch)
{
    // the clutch is supported
}

if (racingwheel->HasPatternShifter)
{
    // the pattern shifter is supported
}

또한 다를 수 있는 컨트롤은 조종 휠 및 패턴으로 구분 됩니다.Additionally, the controls that may vary are the steering wheel and pattern shifter. 조종 핸들은 실제 휠이 지원할 수 있는 실제 회전의 정도에 따라 다를 수 있으며, 패턴 이동 기는 지 원하는 고유 전달 기어의 수에 따라 달라질 수 있습니다.The steering wheel can vary by the degree of physical rotation that the actual wheel can support, while the pattern shifter can vary by the number of distinct forward gears it supports. 경쟁 휠의 속성을 읽어 실제 휠에서 지 원하는 최대 회전 각도를 결정할 수 있습니다 MaxWheelAngle . 값은 지원 되는 최대 실제 각도 (양수)로,이는 카운터 클록 지향 방향 (음수도) 에서도 지원 됩니다.You can determine the greatest angle of rotation the actual wheel supports by reading the MaxWheelAngle property of the racing wheel; its value is the maximum supported physical angle in degrees clock-wise (positive) which is likewise supported in the counter-clock-wise direction (negative degrees). 경주 휠의 속성을 읽어 패턴에서 지 원하는 가장 높은 전방 기어를 결정할 수 있습니다 MaxPatternShifterGear . 해당 값은 지원 되는 가장 높은 전방 기어 ( — 즉, 값이 4 인 경우)는 역방향, 중립, 첫 번째, 두 번째, 세 번째 및 네 번째 기어를 지원 합니다.You can determine the greatest forward gear the pattern shifter supports by reading the MaxPatternShifterGear property of the racing wheel; its value is the highest forward gear supported, inclusive—that is, if its value is 4, then the pattern shifter supports reverse, neutral, first, second, third, and fourth gears.

auto maxWheelDegrees = racingwheel->MaxWheelAngle;
auto maxShifterGears = racingwheel->MaxPatternShifterGear;

마지막으로, 일부 레이스 휠은 조종 핸들을 통해 피드백을 지원 합니다.Finally, some racing wheels support force feedback through the steering wheel. 레이스 휠의 WheelMotor 속성을 읽어 연결 된 레이스 휠에서 강제 피드백을 지원 하는지 여부를 확인할 수 있습니다.You can determine whether a connected racing wheel supports force feedback by reading the WheelMotor property of the racing wheel. 가 null이 아닌 경우에는 강제 피드백이 지원 됩니다. WheelMotor 그렇지 않으면 지원 되지 않습니다. nullForce feedback is supported if WheelMotor is not null; otherwise it's not supported.

if (racingwheel->WheelMotor != nullptr)
{
    // force feedback is supported
}

지원 되는 레이스 휠의 피드백 기능을 사용 하는 방법에 대 한 자세한 내용은 force 피드백 개요를 참조 하세요.For information on how to use the force feedback capability of racing wheels that support it, see Force feedback overview.

단추 읽기Reading the buttons

각 레이스 휠 단추는 — D-패드의 네 가지 방향, 이전 기어다음 기어 단추, 16 개 추가 단추를 통해 해당 단추를 — 눌린 (다운) 또는 릴리스 (up) 여부를 나타내는 디지털 읽기를 제공 합니다.Each of the racing wheel buttons—the four directions of the D-pad, the Previous Gear and Next Gear buttons, and 16 additional buttons—provides a digital reading that indicates whether it's pressed (down) or released (up). 효율성을 위해 단추 판독값은 개별 부울 값으로 표시 되지 않습니다. 대신 RacingWheelButtons 열거형으로 표현 되는 단일 비트 필드에 압축 됩니다.For efficiency, button readings aren't represented as individual boolean values; instead they're all packed into a single bitfield that's represented by the RacingWheelButtons enumeration.

참고

경주 휠에는 보기메뉴 단추와 같은 UI 탐색에 사용 되는 추가 단추가 있습니다.Racing wheels are equipped with additional buttons used for UI navigation such as the View and Menu buttons. 이러한 단추는 열거형의 일부가 아니므로 RacingWheelButtons UI 탐색 장치로 경주 휠에 액세스 하 여 읽을 수만 있습니다.These buttons are not a part of the RacingWheelButtons enumeration and can only be read by accessing the racing wheel as a UI navigation device. 자세한 내용은 UI 탐색 장치를 참조 하세요.For more information, see UI Navigation Device.

Buttons RacingWheelReading 구조체의 속성에서 단추 값을 읽습니다.The button values are read from the Buttons property of the RacingWheelReading structure. 이 속성은 비트 필드 이므로 관심이 있는 단추의 값을 격리 하기 위해 비트 마스킹을 사용 됩니다.Because this property is a bitfield, bitwise masking is used to isolate the value of the button that you're interested in. 해당 비트가 설정 된 경우 단추가 눌러져 있습니다 (down). 그렇지 않으면 해제 됩니다 (up).The button is pressed (down) when the corresponding bit is set; otherwise, it's released (up).

다음 예에서는 다음 기어 단추를 눌렀는지 여부를 확인 합니다.The following example determines whether the Next Gear button is pressed.

if (RacingWheelButtons::NextGear == (reading.Buttons & RacingWheelButtons::NextGear))
{
    // Next Gear is pressed
}

다음 예에서는 다음 기어 단추가 해제 되어 있는지 여부를 확인 합니다.The following example determines whether the Next Gear button is released.

if (RacingWheelButtons::None == (reading.Buttons & RacingWheelButtons::NextGear))
{
    // Next Gear is released (not pressed)
}

경우에 따라 단추를 눌렀다 놓은 상태에서 눌린 상태로 전환 하는 경우, 여러 단추를 눌렀는지 또는 눌렀다 놓았을 때 또는 단추 집합이 특정 방법으로 몇 번의 단추에 배치 되는지 여부를 확인 하는 것이 좋습니다 — .Sometimes you might want to determine when a button transitions from pressed to released or released to pressed, whether multiple buttons are pressed or released, or if a set of buttons are arranged in a particular way—some pressed, some not. 이러한 조건을 검색 하는 방법에 대 한 자세한 내용은 단추 전환 검색복잡 한 단추 배열 검색을 참조 하세요.For information on how to detect these conditions, see Detecting button transitions and Detecting complex button arrangements.

휠 읽기Reading the wheel

조종 휠은-1.0에서 + 1.0 사이의 아날로그 판독값을 제공 하는 필수 컨트롤입니다.The steering wheel is a required control that provides an analog reading between -1.0 and +1.0. 값-1.0은 가장 왼쪽의 휠 위치에 해당 합니다. + 1.0 값은 맨 오른쪽 위치에 해당 합니다.A value of -1.0 corresponds to the left-most wheel position; a value of +1.0 corresponds to the right-most position. Wheel RacingWheelReading 구조체의 속성에서 조종 핸들의 값을 읽습니다.The value of the steering wheel is read from the Wheel property of the RacingWheelReading structure.

float wheel = reading.Wheel;  // returns a value between -1.0 and +1.0.

휠 판독값은 실제 레이스 휠에서 지원 되는 회전 범위에 따라 실제 바퀴에서 다른 각도의 실제 회전에 해당 하지만 일반적으로 휠 판독값을 조정 하지 않으려고 합니다. 더 큰 회전을 지 원하는 바퀴는 더 높은 정밀도를 제공 합니다.Although wheel readings correspond to different degrees of physical rotation in the actual wheel depending on the range of rotation supported by the physical racing wheel, you don't usually want to scale the wheel readings; wheels that support greater degrees of rotation just provide greater precision.

스로틀 및 브레이크 읽기Reading the throttle and brake

스로틀 및 브레이크는 모두 부동 소수점 값으로 표현 되는 0.0 (완전히 릴리스된) 및 1.0 (완전히 누름) 사이의 아날로그 판독값을 제공 하는 필수 컨트롤입니다.The throttle and brake are required controls that each provide analog readings between 0.0 (fully released) and 1.0 (fully pressed) represented as floating-point values. RacingWheelReading 구조체의 속성에서 스로틀 컨트롤의 값을 읽습니다 .이 경우에는 Throttle 속성에서 브레이크 컨트롤의 값을 RacingWheelReading 읽습니다 Brake .The value of the throttle control is read from the Throttle property of the RacingWheelReading struct; the value of the brake control is read from the Brake property.

float throttle = reading.Throttle;  // returns a value between 0.0 and 1.0
float brake    = reading.Brake;     // returns a value between 0.0 and 1.0

수동 브레이크 및 클러치 읽기Reading the handbrake and clutch

수동 브레이크 및 클러치는 각각 부동 소수점 값으로 표현 되는 0.0 (완전히 릴리스된) 및 1.0 (완전히 개입 됨) 사이의 아날로그 판독값을 제공 하는 선택적 컨트롤입니다.The handbrake and clutch are optional controls that each provide analog readings between 0.0 (fully released) and 1.0 (fully engaged) represented as floating-point values. RacingWheelReading 구조체의 속성에서 수동 브레이크 컨트롤의 값을 읽습니다 .이 경우에는 Handbrake 속성에서 클러치 컨트롤의 값을 RacingWheelReading 읽습니다 Clutch .The value of the handbrake control is read from the Handbrake property of the RacingWheelReading struct; the value of the clutch control is read from the Clutch property.

float handbrake = 0.0;
float clutch = 0.0;

if(racingwheel->HasHandbrake)
{
    handbrake = reading.Handbrake;  // returns a value between 0.0 and 1.0
}

if(racingwheel->HasClutch)
{
    clutch = reading.Clutch;        // returns a value between 0.0 and 1.0
}

패턴의 무늬를 읽습니다.Reading the pattern shifter

패턴 지정 기는 부호 있는 정수 값으로 표시 되는-1과 MaxPatternShifterGear 사이의 디지털 읽기를 제공 하는 선택적 컨트롤입니다.The pattern shifter is an optional control that provides a digital reading between -1 and MaxPatternShifterGear represented as a signed integer value. -1 또는 0 값은 각각 역방향중립 기어에 해당 합니다. 점점 더 증가 하는 양의 값은 MaxPatternShifterGear(포함)까지 전달 되는 더 많은 기어에 해당 합니다.A value of -1 or 0 correspond to the reverse and neutral gears, respectively; increasingly positive values correspond to greater forward gears up to MaxPatternShifterGear, inclusive. 패턴 PatternShifterGear의 값은 RacingWheelReading 구조체의 PatternShifterGear 속성에서 읽습니다.The value of the pattern shifter is read from the PatternShifterGear property of the RacingWheelReading struct.

if (racingwheel->HasPatternShifter)
{
    gear = reading.PatternShifterGear;
}

참고

지원 되는 패턴의 무늬는 이전 기어 및 플레이어 자동차의 현재 기어에도 영향을 주는 다음 기어 단추와 함께 존재 합니다.The pattern shifter, where supported, exists alongside the required Previous Gear and Next Gear buttons which also affect the current gear of the player's car. 이러한 입력을 통합 하는 간단한 전략은 플레이어에서 자동차에 대 한 자동 전송을 선택 하는 경우 패턴 다시 시작 (및 클러치)을 무시 하 고, 플레이어에서 자동차에 대해 수동 전송을 선택할 때 이전다음 기어 단추를 무시 하는 간단한 전략입니다.A simple strategy for unifying these inputs where both are present is to ignore the pattern shifter (and clutch) when a player chooses an automatic transmission for their car, and to ignore the Previous and Next Gear buttons when a player chooses a manual transmission for their car only if their racing wheel is equipped with a pattern shifter control. 게임에 적합 하지 않은 경우 다른 통합 전략을 구현할 수 있습니다.You can implement a different unification strategy if this isn't suitable for your game.

InputInterfacing 샘플 실행Run the InputInterfacing sample

InputInterfacingUWP 샘플 (github) 에서는 경쟁 휠 및 다양 한 종류의 입력 장치를 함께 사용 하는 방법 뿐만 아니라 이러한 입력 장치가 UI 탐색 컨트롤러로 동작 하는 방식을 보여 줍니다.The InputInterfacingUWP sample (github) demonstrates how to use racing wheels and different kinds of input devices in tandem, as well as how these input devices behave as UI navigation controllers.

강제 피드백 개요Force feedback overview

많은 레이스 휠에는 더 몰입 형 및 까다로운 구동 환경을 제공 하기 위한 강제 피드백 기능이 있습니다.Many racing wheels have force feedback capability to provide a more immersive and challenging driving experience. 강제 피드백을 지 원하는 레이스 휠에는 일반적으로 휠 회전의 축 인 단일 축을 따라 조종 핸들에 강제로 적용 되는 단일 모터가 있습니다.Racing wheels that support force feedback are typically equipped with a single motor that applies force to the steering wheel along a single axis, the axis of wheel rotation. Force 사용자 의견은 windows 10 및 XBOX one UWP 앱에서 지원 됩니다.Force feedback is supported in Windows 10 and Xbox One UWP apps by the Windows.Gaming.Input.ForceFeedback namespace.

참고

Force 피드백 Api는 force의 여러 축을 지원할 수 있지만 현재는 Xbox One 레이스 휠이 휠 회전과는 다른 피드백 축을 지원 하지 않습니다.The force feedback APIs are capable of supporting several axes of force, but no Xbox One racing wheel currently supports any feedback axis other than that of wheel rotation.

강제 피드백 사용Using force feedback

이 섹션에서는 Xbox One 레이스 휠에 대 한 force 피드백 효과를 프로그래밍 하는 기본 사항을 설명 합니다.These sections describe the basics of programming force feedback effects for Xbox One racing wheels. 효과를 사용 하 여 피드백을 적용 합니다 .이 효과는 먼저 force 피드백 장치에 로드 된 다음, 소리 효과와 유사한 방식으로 시작, 일시 중지, 다시 시작 및 중지 될 수 있습니다. 그러나 먼저 레이스 휠의 피드백 기능을 결정 해야 합니다.Feedback is applied using effects, which are first loaded onto the force feedback device and then can be started, paused, resumed, and stopped in a manner similar to sound effects; however, you must first determine the feedback capabilities of the racing wheel.

Force 피드백 기능 결정Determining force feedback capabilities

레이스 휠의 WheelMotor 속성을 읽어 연결 된 레이스 휠에서 강제 피드백을 지원 하는지 여부를 확인할 수 있습니다.You can determine whether a connected racing wheel supports force feedback by reading the WheelMotor property of the racing wheel. 가 null 인 경우에는 강제 피드백이 지원 되지 않습니다 WheelMotor . 그렇지 않은 경우에는 강제 피드백이 지원 되며, 영향을 받을 수 있는 축과 같은 모터의 특정 피드백 기능을 계속 확인할 수 있습니다. nullForce feedback isn't supported if WheelMotor is null; otherwise, force feedback is supported and you can proceed to determine the specific feedback capabilities of the motor, such as the axes it can affect.

if (racingwheel->WheelMotor != nullptr)
{
    auto axes = racingwheel->WheelMotor->SupportedAxes;

    if(ForceFeedbackEffectAxes::X == (axes & ForceFeedbackEffectAxes::X))
    {
        // Force can be applied through the X axis
    }

    if(ForceFeedbackEffectAxes::Y == (axes & ForceFeedbackEffectAxes::Y))
    {
        // Force can be applied through the Y axis
    }

    if(ForceFeedbackEffectAxes::Z == (axes & ForceFeedbackEffectAxes::Z))
    {
        // Force can be applied through the Z axis
    }
}

Force 피드백 효과를 로드 하는 중Loading force feedback effects

Force 피드백 효과는 게임의 명령에서 자율적으로 "재생" 되는 피드백 장치에 로드 됩니다.Force feedback effects are loaded onto the feedback device where they are "played" autonomously at the command of your game. 여러 가지 기본 효과가 제공 됩니다. IForceFeedbackEffect 인터페이스를 구현 하는 클래스를 통해 사용자 지정 효과를 만들 수 있습니다.A number of basic effects are provided; custom effects can be created through a class that implements the IForceFeedbackEffect interface.

Effect 클래스Effect class 효과 설명Effect description
ConditionForceEffectConditionForceEffect 장치 내에서 현재 센서에 대 한 응답으로 변수 force를 적용 하는 효과입니다.An effect that applies variable force in response to current sensor within the device.
ConstantForceEffectConstantForceEffect 벡터를 따라 일관 된 적용을 적용 하는 효과입니다.An effect that applies constant force along a vector.
PeriodicForceEffectPeriodicForceEffect 벡터를 따라 파형에 의해 정의 된 변수 force를 적용 하는 효과입니다.An effect that applies variable force defined by a waveform, along a vector.
RampForceEffectRampForceEffect 벡터를 따라 선형으로 늘어나는/감소 하는 효과를 적용 하는 효과입니다.An effect that applies a linearly increasing/decreasing force along a vector.
using FFLoadEffectResult = ForceFeedback::ForceFeedbackLoadEffectResult;

auto effect = ref new Windows.Gaming::Input::ForceFeedback::ConstantForceEffect();
auto time = TimeSpan(10000);

effect->SetParameters(Windows::Foundation::Numerics::float3(1.0f, 0.0f, 0.0f), time);

// Here, we assume 'racingwheel' is valid and supports force feedback

IAsyncOperation<FFLoadEffectResult>^ request
    = racingwheel->WheelMotor->LoadEffectAsync(effect);

auto loadEffectTask = Concurrency::create_task(request);

loadEffectTask.then([this](FFLoadEffectResult result)
{
    if (FFLoadEffectResult::Succeeded == result)
    {
        // effect successfully loaded
    }
    else
    {
        // effect failed to load
    }
}).wait();

강제 피드백 효과 사용Using force feedback effects

로드 된 후에는 경쟁 휠의 속성에서 함수를 호출 WheelMotor 하거나 피드백 효과 자체에서 함수를 호출 하 여 개별적으로 효과를 시작, 일시 중지, 다시 시작 및 중지할 수 있습니다.Once loaded, effects can all be started, paused, resumed, and stopped synchronously by calling functions on the WheelMotor property of the racing wheel, or individually by calling functions on the feedback effect itself. 일반적으로 게임 플레이를 시작 하기 전에 피드백 장치에 사용할 모든 효과를 로드 한 다음 각 기능을 사용 하 여 SetParameters 게임 재생이 진행 됨에 따라 효과를 업데이트 해야 합니다.Typically, you should load all the effects that you want to use onto the feedback device before gameplay begins and then use their respective SetParameters functions to update the effects as gameplay progresses.

if (ForceFeedbackEffectState::Running == effect->State)
{
    effect->Stop();
}
else
{
    effect->Start();
}

마지막으로, 필요할 때마다 특정 레이스 휠에서 전체 강제 피드백 시스템을 비동기적으로 사용 하거나 사용 하지 않도록 설정 하거나 다시 설정할 수 있습니다.Finally, you can asynchronously enable, disable, or reset the entire force feedback system on a particular racing wheel whenever you need.

참고 항목See also