7. 3D 개체와 상호 작용7. Interacting with 3D objects

이 자습서에서는 3D 개체의 근거리 및 원거리 조작을 사용하도록 설정하고 허용되는 조작 유형을 제한하는 방법을 알아봅니다.In this tutorial, you will learn how to enable near and far manipulation of 3D objects and limit the allowed types of manipulation. 개체 조작을 보다 쉽게 제어할 수 있도록 3D 개체 주위에 경계 상자를 추가하는 방법도 알아봅니다.You will also learn how to add bounding boxes around 3D objects to make it easier to control the object manipulation.

목표Objectives

  • 3D 개체가 상호 작용할 수 있도록 구성하는 방법 알아보기Learn how to configure 3D objects so they can be interacted with
  • 3D 개체에 경계 상자를 추가하는 방법 알아보기Learn how to add bounding boxes to 3D objects

3D 개체 조작Manipulating 3D objects

이 섹션에서는 장면에서 개체 위치 지정 자습서를 진행하는 동안 테이블에서 구성한 모든 Rover 파트를 조작하는 기능을 추가합니다.In this section, you will add the ability to manipulate all the Rover parts you organized on the table during the Positioning objects in the scene tutorial.

이를 위해 수행할 주요 단계는 다음과 같습니다.The main steps you will take to achieve this are:

  1. 모든 파트 개체에 Object Manipulator(스크립트) 구성 요소 추가Add the Object Manipulator (Script) component to all the part objects
  2. 모든 파트 개체에 NearInteractionGrabbable 구성 요소 추가Add the NearInteractionGrabbable component to all the part objects
  3. Object Manipulator(스크립트) 구성 요소 구성Configure the Object Manipulator (Script) component

참고

개체를 조작 하려면 개체에 다음 구성 요소가 있어야 합니다.To be able to manipulate an object, the object must have the following components:

  • 충돌체 구성 요소(예: 상자 충돌체)Collider component, for example, a Box Collider
  • Object Manipulator(스크립트) 구성 요소Object Manipulator (Script) component

추적 손으로 개체에 대한 조작잡기 를 수행하려면 개체에 다음 구성 요소가 있어야 합니다.To be able to manipulate and grab an object with tracked hands, the object must have the following components:

  • 충돌체 구성 요소(예: 상자 충돌체)Collider component, for example, a Box Collider
  • Object Manipulator(스크립트) 구성 요소Object Manipulator (Script) component
  • NearInteractionGrabbable 구성 요소NearInteractionGrabbable component

또한 Rover 파트를 Rover에 배치하여 완전한 Rover 어셈블리로 만들 수 있도록 Rover Explorer를 구성합니다.Additionally, you will configure the Rover Explorer so that you can place the rover parts on to the Rover to make it a complete rover assembly.

Hierarchy(계층 구조) 창에서 RoverExplorer > RoverParts 개체를 펼치고, 자식 Rover 파트 개체와 RoverAssembly 개체를 모두 선택한 다음, Inspector(인스펙터) 창에서 Add Component(구성 요소 추가) 단추를 사용하여 다음 구성 요소를 선택한 모든 개체에 추가합니다.In the Hierarchy window, expand the RoverExplorer > RoverParts object and select all its child rover part objects and the RoverAssembly object, then in the Inspector window, use the Add Component button to add the following components to all the selected objects:

  • Object Manipulator(스크립트) 구성 요소Object Manipulator (Script) component
  • NearInteractionGrabbable 구성 요소NearInteractionGrabbable component
  • Part Assembly Controller(스크립트) 구성 요소Part Assembly Controller (Script) component

RoverAssembly 및 모든 로버 부품 개체가 선택되고 구성 요소가 추가된 Unity

서로 인접하지 않은 여러 개체를 선택하려면 Ctrl 키를 누른 채 마우스를 사용하여 개체를 선택합니다.To select multiple objects that are not next to each other, press-and-hold the CTRL key while using the mouse to select any object.

참고

이 자습서의 학습 목표를 달성하기 위해 Rover 파트에 충돌체가 이미 추가되어 있습니다.For the purpose of this tutorial, colliders have already been added to the rover parts. 충돌체에 대한 자세한 내용은 Unity의 충돌체 설명서를 참조하세요.To learn more about colliders, you can visit Unity's Collider documentation.

참고

Part Assembly Controller(스크립트)는 MRTK의 일부는 아니지만 자습서 자산에 포함되어 있습니다.The Part Assembly Controller (Script) is not part of the MRTK but was included with the tutorial assets.

Rover 파트 개체와 RoverAssembly 개체를 선택한 상태로, Inspector(인스펙터) 창에서 Object Manipulator(스크립트) 구성 요소를 다음과 같이 구성합니다.With all the rover part objects and the RoverAssembly object still selected, in the Inspector window, configure the Object Manipulator (Script) component as follows:

  • Two Handed Manipulation Type(양손 조작 유형) 드롭다운에서 Scale(크기 조정) 선택을 취소하고 Move(이동) 및 Rotate(회전)만 가능하도록 설정From the Two Handed Manipulation Type dropdown, uncheck the Scale, so only Move and Rotate is enabled

Two Handed Manipulation Type(양손 조작 유형)이 구성된 Unity

참고

이제 모든 Rover 파트 개체와 RoverAssembly 개체에 대해 개체 조작이 가능하도록 설정했습니다.At this point, you have enabled object manipulation for all the rover part objects and the RoverAssembly object.

프로젝트 창에서 Assets > MRTK > SDK > StandardAssets > Audio 폴더로 이동하여 오디오 클립을 찾습니다.In the Project window, navigate to the Assets > MRTK > SDK > StandardAssets > Audio folder to locate the audio clips:

Audio 폴더가 선택된 Unity 프로젝트 창

Hierarchy(계층 구조) 창에서 Rover 파트 개체 를 다시 선택한 다음, Inspector(인스펙터) 창에서 Add Component(구성 요소 추가) 단추를 사용하여 Audio Sources(오디오 소스) 구성 요소를 추가하고 다음과 같이 구성합니다.In the Hierarchy window, reselect all the rover part objects, then in the Inspector window, use the Add Component button to add the Audio Sources component and configure it as follows:

  • MRTK_Scale_Start 오디오 클립을 AudioClip 필드에 할당Assign the MRTK_Scale_Start audio clip to the AudioClip field
  • Play On Awake(활성 상태일 때 재생) 확인란의 선택을 취소Uncheck the Play On Awake checkbox
  • Spatial Blend(공간 블렌드)를 1로 변경Change Spatial Blend to 1

모든 로버 부품이 선택되고 Audio Source 구성 요소가 추가되고 구성된 Unity

Hierarchy(계층 구조) 창에서 RoverAssembly > RoverModel_PlacementHints_XRay > Parts_PlacementHints 개체를 펼쳐서 모든 배치 힌트 개체를 표시한 다음, 첫 번째 Rover 파트 RoverParts > Camera_Part 를 선택하고 Part Assembly Controller(스크립트) 구성 요소를 다음과 같이 구성합니다.In the Hierarchy window, expand the RoverAssembly > RoverModel_PlacementHints_XRay > Parts_PlacementHints object to reveal all of the placement hint objects, then select the first rover part, RoverParts > Camera_Part, and configure the Part Assembly Controller (Script) component as follows:

  • Camera_PlacementHint 개체를 Location To Place(배치할 위치) 필드에 할당Assign the Camera_PlacementHint object to the Location To Place field

Camera_Part PartAssemblyController 구성 요소가 구성된 Unity

나머지 Rover 파트 개체와 RoverAssembly 개체 각각에 대해 이 단계를 반복 하여 Part Assembly Controller(스크립트) 구성 요소를 다음과 같이 구성합니다.Repeat this step for each of the remaining rover part objects and the RoverAssembly object to configure the Part Assembly Controller (Script) component as follows:

  • Generator_Part 의 경우 Generator_PlacementHint 개체를 Location To Place(배치할 위치) 필드에 할당For the Generator_Part, assign the Generator_PlacementHint object to the Location To Place field
  • Lights_Part 의 경우 Lights_PlacementHint 개체를 Location To Place(배치할 위치) 필드에 할당For the Lights_Part, assign the Lights_PlacementHint object to the Location To Place field
  • UHFAntenna_Part 의 경우 UHFAntenna_PlacementHint 개체를 Location To Place(배치할 위치) 필드에 할당For the UHFAntenna_Part, assign the UHFAntenna_PlacementHint object to the Location To Place field
  • Spectrometer_Part 의 경우 Spectrometer_PlacementHint 개체를 Location To Place(배치할 위치) 필드에 할당For the Spectrometer_Part, assign the Spectrometer_PlacementHint object to the Location To Place field
  • RoverAssembly 의 경우 개체 자체(즉, 동일한 RoverAssembly 개체)를 Location To Place(배치할 위치) 필드에 할당For the RoverAssembly, assign the object itself, i.e. the same RoverAssembly object, to the Location To Place field

Hierarchy(계층 구조) 창에서 RoverExplorer > Buttons > Reset(초기화) 단추 개체를 선택한 다음, Inspector(인스펙터) 창에서 상호작용 가능 OnClick () 이벤트를 다음과 같이 구성합니다.In the Hierarchy window, select the RoverExplorer > Buttons > Reset button object, then in the Inspector window, configure the Interactable OnClick () event as follows:

  • RoverAssembly 개체를 None (Object) 필드에 할당Assign the RoverAssembly object to the None (Object) field
  • No Function(함수 없음) 드롭다운에서 PartAssemblyController > ResetPlacement () 를 선택하여 이 함수를 이벤트가 트리거될 때 실행할 작업으로 설정From the No Function dropdown, select PartAssemblyController > ResetPlacement () to set this function as the action to be executed when the event is triggered

Reset 단추 개체 OnClick 이벤트가 구성된 Unity

이제 게임 모드로 전환하면 근거리 또는 원거리 상호 작용을 사용하여 Rover 파트를 Rover에 놓을 수 있습니다.If you now enter Game mode, you can use near or far interaction to place the rover parts on to the Rover. 파트가 해당하는 배치 힌트에 가까워지면 위치로 맞춰져서 Rover의 일부가 됩니다.Once the part is close to the corresponding placement hint, it will snap into place and become part of the Rover. 배치를 다시 설정하려면 Reset(초기화) 단추를 누르면 됩니다.To reset the placements, you can press the Reset button:

Reset 단추가 눌러져 있는 Unity 재생 모드 분할 보기

Object Manipulator 구성 요소 및 관련 속성에 대해 자세히 알아보려면 MRTK 설명서 포털에서 Object Manipulator 가이드를 참조하세요.To learn more about the Object Manipulator component and its associated properties, you can visit the Object Manipulator guide in the MRTK Documentation Portal.

경계 상자 추가Adding bounding boxes

경계 상자를 사용하면 크기 조정 및 회전에 사용할 수 있는 핸들을 제공하여 근거리 및 원거리 상호 작용 모두에서 한 손으로 개체를 보다 쉽고 직관적으로 조작할 수 있습니다.Bounding boxes make it easier and more intuitive to manipulate objects with one hand for both near and far interaction by providing handles that can be used for scaling and rotating.

이 예제에서는 전체 환경을 쉽게 이동, 회전, 확장할 수 있도록 RoverExplorer 개체에 경계 상자를 추가합니다.In this example, you will add a bounding box to the RoverExplorer object so the whole experience can easily be moved, rotated, and scaled. 또한 경계 상자를 켜고 끌 수 있도록 메뉴를 구성합니다.Additionally, you will configure the Menu so you can turn the Bounding Box on and off.

Hierarchy(계층 구조) 창에서 RoverExplorer 개체를 선택한 다음, Inspector(인스펙터) 창에서 Add Component(구성 요소 추가) 단추를 사용하여 다음 구성 요소를 추가합니다.In the Hierarchy window, select the RoverExplorer object, then in the Inspector window, use the Add Component button to add the following components:

  • BoundingBox 구성 요소BoundingBox component
  • Object Manipulator(스크립트) 구성 요소Object Manipulator (Script) component

그런 다음, 두 구성 요소 옆에 있는 확인란을 선택 취소 하여 기본적으로 사용하지 않도록 설정 합니다.Then uncheck the checkbox next to both components to make them disabled by default:

RoverExplorer 개체가 선택되고 구성 요소가 추가되고 사용하지 않도록 설정된 Unity

참고

경계 상자 시각화는 런타임에 생성되므로 게임 모드로 전환하기 전에는 보이지 않습니다.The Bounding Box visualization is created at runtime and, therefore, not visible before you enter Game mode.

참고

BoundingBox 구성 요소는 런타임에 NearInteractionGrabbable 구성 요소를 자동으로 추가합니다.The BoundingBox component will automatically add the NearInteractionGrabbable component at runtime. 따라서 추적 손으로 감싼 개체를 잡기 위해 이 구성 요소를 추가할 필요가 없습니다.Therefore, we do not need to add this component to grab the enclosed objects with tracked hands.

Hierarchy(계층 구조) 창에서 메뉴 > ButtonCollection 개체를 펼쳐서 단추 4개를 표시하고 3번째 단추의 이름을 BoundingBox_Enable 로 변경한 다음, Inspector(인스펙터) 창에서 Button Config Helper(스크립트) 구성 요소를 다음과 같이 구성합니다.In the Hierarchy window, expand the Menu > ButtonCollection object to reveal the four buttons and rename the third button to BoundingBox_Enable, then in the Inspector window, configure the Button Config Helper (Script) component as follows:

  • Main Label Text(기본 레이블 텍스트)를 Enable(사용)로 변경Change the Main Label Text to Enable
  • RoverExplorer 개체를 None (Object) 필드에 할당Assign the RoverExplorer object to the None (Object) field
  • No Function(함수 없음) 드롭다운에서 BoundingBox > bool Enabled 를 선택하여 이벤트가 트리거될 때 이 속성 값을 업데이트From the No Function dropdown, select BoundingBox > bool Enabled to update this property value when the event is triggered
  • 인수 확인란이 선택 되어 있는지 확인Verify that the argument checkbox is checked
  • 작은 + 아이콘을 클릭하여 또 다른 이벤트를 추가Click the small + icon to add another event
  • RoverExplorer 개체를 None (Object) 필드에 할당Assign the RoverExplorer object to the None (Object) field
  • No Function(함수 없음) 드롭다운에서 ObjectManipulator > bool Enabled 를 선택하여 이벤트가 트리거될 때 이 속성 값을 업데이트From the No Function dropdown, select ObjectManipulator > bool Enabled to update this property value when the event is triggered
  • 인수 확인란이 선택 되어 있는지 확인Verify that the argument checkbox is checked
  • 아이콘 을 'cube with bounding box'(경계 상자와 큐브) 아이콘으로 유지Leave the Icon as the 'cube with bounding box' icon

BoundingBox_Enable 단추 개체가 선택되고 Button Config Helper 구성 요소가 구성된 Unity

네 번째와 마지막 단추의 이름을 BoundingBox_Disable 로 바꾼 다음, Inspector(인스펙터) 창에서 Button Config Helper(스크립트) 구성 요소를 다음과 같이 구성합니다.Rename the forth and last button to BoundingBox_Disable, then in the Inspector window, configure the Button Config Helper (Script) component as follows:

  • Main Label Text(기본 레이블 텍스트)를 Disable(사용 안 함)로 변경Change the Main Label Text to Disable
  • RoverExplorer 개체를 None (Object) 필드에 할당Assign the RoverExplorer object to the None (Object) field
  • No Function(함수 없음) 드롭다운에서 BoundingBox > bool Enabled 를 선택하여 이벤트가 트리거될 때 이 속성 값을 업데이트From the No Function dropdown, select BoundingBox > bool Enabled to update this property value when the event is triggered
  • 인수 확인란이 선택 취소 되어 있는지 확인Verify that the argument checkbox is unchecked
  • 작은 + 아이콘을 클릭하여 또 다른 이벤트를 추가Click the small + icon to add another event
  • RoverExplorer 개체를 None (Object) 필드에 할당Assign the RoverExplorer object to the None (Object) field
  • No Function(함수 없음) 드롭다운에서 ObjectManipulator > bool Enabled 를 선택하여 이벤트가 트리거될 때 이 속성 값을 업데이트From the No Function dropdown, select ObjectManipulator > bool Enabled to update this property value when the event is triggered
  • 인수 확인란이 선택 취소 되어 있는지 확인Verify that the argument checkbox is unchecked
  • 아이콘 을 'cube with bounding box'(경계 상자와 큐브) 아이콘으로 변경Change the Icon to the 'cube with bounding box" icon

BoundingBox_Disable 단추 개체가 선택되고 Button Config Helper 구성 요소가 구성된 Unity

이제 게임 모드로 전환하여 Enable(사용) 단추를 클릭하여 경계 상자를 사용하도록 설정하면, 근거리나 원거리 상호 작용을 사용하여 경계 상자를 이동 및 회전하고 크기를 조정할 수 있으며 Disable(사용 안 함) 단추를 사용하여 경계 상자를 다시 사용하지 않도록 설정할 수 있습니다.If you now enter Game mode and enable the Bounding Box by clicking the Enable button, you can use near or far interaction to move, rotate, and scale the Bounding Box, and use the Disable button to disable the Bounding Box again:

경계 상자가 조작되고 있는 Unity 재생 모드 분할 보기

경계 상자 구성 요소 및 관련 속성에 대한 자세한 내용을 보려면 MRTK 설명서 포털에서 조작 처리기 가이드를 참조하세요.To learn more about the Bounding Box component and its associated properties, you can visit the Bounding box guide in the MRTK Documentation Portal.

축하합니다.Congratulations

이 자습서에서는 3D 개체에 대한 근거리 및 원거리 조작을 사용하도록 설정하는 방법과 허용되는 조작 유형을 제한하는 방법을 알아보았습니다.In this tutorial, you learned how to enable near and far manipulation for 3D objects and how to limit the allowed types of manipulation. 개체 조작을 보다 쉽게 제어할 수 있도록 3D 개체 주위에 경계 상자를 추가하는 방법도 알아보았습니다.You also learned how to add bounding boxes around 3D objects to make it easier to control the object manipulation.