경계 컨트롤 - MRTK2

Bounds control

BoundsControl 은 이전에 BoundingBox에 있는 조작 동작의 새로운 구성 요소입니다. 경계 컨트롤은 설정에서 여러 가지 개선 및 간소화를 수행하고 새로운 기능을 추가합니다. 이 구성 요소는 더 이상 사용되지 않는 경계 상자를 대체합니다.

이 스크립트는 BoundsControl.cs 혼합 현실에서 개체를 변환하기 위한 기본 기능을 제공합니다. 경계 컨트롤은 홀로그램 주위에 상자가 표시되어 상호 작용할 수 있음을 나타냅니다. 상자의 모서리와 가장자리에 있는 핸들을 사용하면 개체를 크기 조정, 회전 또는 변환할 수 있습니다. 경계 컨트롤은 사용자 입력에도 반응합니다. 예를 들어 HoloLens 2 경계 컨트롤은 손가락 근접에 응답하여 개체와의 거리를 인식하는 데 도움이 되는 시각적 피드백을 제공합니다. 모든 상호 작용 및 시각적 개체를 쉽게 사용자 지정할 수 있습니다.

예제 장면

장면에서 경계 컨트롤 구성의 예를 찾을 수 있습니다 BoundsControlExamples .

Bounds control Example

검사기 속성

대상 개체

이 속성은 경계 컨트롤 조작에 의해 변환될 개체를 지정합니다. 설정된 개체가 없으면 기본적으로 소유자 개체로 설정됩니다.

활성화 동작

경계 제어 인터페이스를 활성화하는 몇 가지 옵션이 있습니다.

  • 시작 시 활성화: 장면이 시작되면 경계 컨트롤이 표시됩니다.
  • 근접에 따라 활성화: 조인된 손이 개체에 가까우면 경계 컨트롤이 표시됩니다.
  • 포인터로 활성화: 경계 컨트롤이 손선 포인터의 대상이 되면 표시됩니다.
  • 근접 및 포인터로 활성화: 경계 컨트롤이 손선 포인터의 대상이 되거나 관절이 개체에 가까우면 표시됩니다.
  • 수동으로 활성화: 경계 컨트롤이 자동으로 표시되지 않습니다. boundsControl.Active 속성에 액세스하여 스크립트를 통해 수동으로 활성화할 수 있습니다.

경계 재정의

경계 계산을 위해 개체에서 상자 충돌체를 설정합니다.

상자 안쪽 여백

컨트롤의 익스텐트를 계산하는 데 사용되는 충돌기 경계에 패딩을 추가합니다. 이는 상호 작용뿐만 아니라 시각적 개체에도 영향을 줍니다.

축 평면화

컨트롤이 축 중 하나에서 평면화되어 2차원으로 만들어 해당 축을 따라 조작을 허용하지 않는지 여부를 나타냅니다. 이 기능은 슬레이트와 같은 얇은 개체에 사용할 수 있습니다. 평면 축이 자동 평면화 로 설정된 경우 스크립트는 가장 작은 범위의 축을 평면 축으로 자동으로 선택합니다.

다듬기

스무딩 섹션을 사용하면 컨트롤의 배율 및 회전에 대한 평활성 동작을 구성할 수 있습니다.

시각적 개체

경계 컨트롤의 모양은 해당 시각적 개체 구성 중 하나를 수정하여 구성할 수 있습니다. 시각적 구성은 연결되거나 인라인된 스크립트 가능 개체이며 구성 개체 섹션에서 자세히 설명합니다.

구성 개체

컨트롤에는 스크립트 가능한 개체로 저장하고 다른 인스턴스 또는 프리팹 간에 공유할 수 있는 구성 개체 집합이 함께 제공됩니다. 구성은 개별 스크립트 가능 자산 파일 또는 프리팹 내의 중첩된 스크립트 가능 자산으로 공유 및 연결할 수 있습니다. 외부 또는 중첩된 스크립트 가능 자산에 연결하지 않고 인스턴스에서 직접 추가 구성을 정의할 수도 있습니다.

경계 컨트롤 검사기는 속성 검사기에서 메시지를 표시하여 구성이 현재 인스턴스의 일부로 공유되는지 또는 인라인으로 표시되는지 여부를 나타냅니다. 또한 공유 인스턴스는 경계 컨트롤 속성 창 자체에서 직접 편집할 수 없지만 대신 연결되는 자산은 공유 구성에서 실수로 변경되지 않도록 직접 수정해야 합니다.

현재 경계 컨트롤은 다음 기능에 대한 구성 개체 옵션을 제공합니다.

Box 구성

상자 구성은 충돌체 크기 및 상자 안쪽 여백을 통해 정의된 경계가 있는 단색 상자를 렌더링하는 작업을 담당합니다. 다음 속성을 설정할 수 있습니다.

  • 상자 재질: 상호 작용이 발생하지 않을 때 렌더링된 상자에 적용되는 재질을 정의합니다. 상자는 이 재질이 설정된 경우에만 렌더링됩니다.
  • 상자 잡기 재질: 사용자가 가까이 또는 먼 상호 작용을 통해 잡아 컨트롤과 상호 작용할 때 상자의 재질입니다.
  • 축 표시 배율 평면화: 축 중 하나가 평면화되면 상자 디스플레이에 적용되는 배율입니다.

크기 조정 핸들 구성

이 속성 서랍을 사용하면 경계 컨트롤의 크기 조정 핸들의 동작 및 시각화를 수정할 수 있습니다.

  • 핸들 재질: 핸들에 적용된 재질입니다.
  • 핸들 잡기 재질: 잡기 핸들에 적용된 재질입니다.
  • 핸들 프리팹: 배율 핸들에 대한 선택적 프리팹입니다. 설정되지 않은 경우 MRTK는 큐브를 기본값으로 사용합니다.
  • 핸들 크기: 배율 핸들의 크기입니다.
  • 충돌체 패딩: 핸들 충돌체에 추가할 패딩입니다.
  • 조작할 때 밧줄 그리기: 활성 상태일 때 상호 작용 시작 지점에서 현재 손 또는 포인터 위치로 밧줄을 그립니다.
  • 핸들은 충돌체 무시: 충돌체가 여기에 연결되면 핸들은 이 충돌체와의 충돌을 무시합니다.
  • 핸들 슬레이트 프리팹: 컨트롤이 평면화될 때 핸들에 사용할 프리팹입니다.
  • 배율 핸들 표시: 핸들의 표시 유형을 제어합니다.
  • 크기 조정 동작: 균일하거나 균일하지 않은 크기 조정으로 설정할 수 있습니다.

회전 핸들 구성

이 구성은 회전 핸들 동작을 정의합니다.

  • 핸들 재질: 핸들에 적용된 재질입니다.
  • 핸들 잡기 재질: 잡기 핸들에 적용된 재질입니다.
  • 핸들 프리팹: 핸들에 대한 선택적 프리팹입니다. 설정되지 않은 경우 MRTK는 구를 기본값으로 사용합니다.
  • 핸들 크기: 핸들의 크기입니다.
  • 충돌체 패딩: 핸들 충돌체에 추가할 패딩입니다.
  • 조작할 때 밧줄 그리기: 활성 상태일 때 상호 작용 시작 지점에서 현재 손 또는 포인터 위치로 밧줄을 그립니다.
  • 핸들은 충돌체 무시: 충돌체가 여기에 연결되면 핸들은 이 충돌체와의 충돌을 무시합니다.
  • 프리팹 충돌체 유형 처리: 생성된 핸들과 함께 사용할 충돌체 형식입니다.
  • X에 대한 핸들 표시: X축에 대한 핸들의 표시 유형을 제어합니다.
  • Y용 핸들 표시: Y축에 대한 핸들의 표시 유형을 제어합니다.
  • Z에 대한 핸들 표시: Z 축에 대한 핸들의 표시 유형을 제어합니다.

번역이 구성을 처리합니다.

경계 컨트롤에 대한 번역 핸들을 사용하도록 설정하고 구성할 수 있습니다. 번역 핸들은 기본값에 따라 사용하지 않도록 설정됩니다.

  • 핸들 재질: 핸들에 적용된 재질입니다.
  • 핸들 잡기 재질: 잡기 핸들에 적용된 재질입니다.
  • 핸들 프리팹: 핸들에 대한 선택적 프리팹입니다. 설정되지 않은 경우 MRTK는 구를 기본값으로 사용합니다.
  • 핸들 크기: 핸들의 크기입니다.
  • 충돌체 패딩: 핸들 충돌체에 추가할 패딩입니다.
  • 조작할 때 밧줄 그리기: 활성 상태일 때 상호 작용 시작 지점에서 현재 손 또는 포인터 위치로 밧줄을 그립니다.
  • 핸들은 충돌체 무시: 충돌체가 여기에 연결되면 핸들은 이 충돌체와의 충돌을 무시합니다.
  • 프리팹 충돌체 형식 핸들: 생성된 핸들과 함께 사용할 충돌체 형식입니다.
  • X에 대한 핸들 표시: X축에 대한 핸들의 표시 유형을 제어합니다.
  • Y에 대한 핸들 표시: Y축에 대한 핸들의 표시 유형을 제어합니다.
  • Z에 대한 핸들 표시: Z 축에 대한 핸들의 표시 유형을 제어합니다.

링크 구성을 사용하면 경계 컨트롤의 와이어프레임 기능을 사용할 수 있습니다. 다음 속성을 구성할 수 있습니다.

  • 와이어프레임 재질: 와이어프레임 메시에 적용되는 재질입니다.
  • 와이어프레임 가장자리 반경: 와이어프레임의 두께입니다.
  • 와이어프레임 모양: 와이어프레임의 모양은 입방형 또는 원통형으로 가능합니다.
  • 와이어프레임 표시: 와이어프레임의 표시 유형을 제어합니다.

근접 효과 구성

손까지의 거리에 따라 애니메이션으로 핸들을 표시하고 숨깁니다. 2단계 크기 조정 애니메이션이 있습니다. 기본값은 HoloLens 2 스타일 동작으로 설정됩니다.

Bounds control Proximity
  • 근접 효과 활성: 근접 기반 핸들 활성화 사용
  • 개체 중간 근접: 1단계 크기 조정을 위한 거리
  • 개체 근접: 2단계 크기 조정을 위한 거리
  • 원거리 크기 조정: 손이 경계 컨트롤 상호 작용의 범위를 벗어난 경우 핸들 자산의 기본 배율 값입니다('중간 근접 처리'로 위에서 정의한 거리). 0을 사용하여 기본적으로 핸들을 숨깁니다.
  • 중간 크기 조정: 손이 경계 컨트롤 상호 작용 범위 내에 있을 때 핸들 자산의 배율 값(위에서 '근접 핸들 처리'로 정의된 거리)입니다. 1을 사용하여 일반 크기 표시)
  • 닫기 눈금: 손이 잡기 상호 작용 범위 내에 있을 때 핸들 자산의 크기 조정 값(위에서 '근접 핸들'으로 정의된 거리)입니다. 1.x를 사용하여 더 큰 크기 표시)
  • 원거리 증가율: 손이 중간에서 먼 근접으로 이동할 때 근접 크기 조정된 개체 배율을 평가합니다.
  • 중간 증가율: 손이 중간에서 근접 근접으로 이동할 때 근접 크기 조정된 개체 배율을 평가합니다.
  • 증가율 닫기: 손이 가까이에서 개체 중심으로 이동할 때 근접 크기 조정된 개체 배율을 평가합니다.

제약 조건 시스템

경계 컨트롤은 제약 조건 관리자 를 사용하여 경계 컨트롤 핸들을 사용하는 동안 변환, 회전 또는 크기 조정 동작을 제한하거나 수정할 수 있도록 지원합니다.

속성 검사기에서는 선택한 제약 조건 관리자를 스크롤하고 강조 표시하는 옵션을 사용하여 드롭다운에서 동일한 게임 개체에 연결된 사용 가능한 모든 제약 조건 관리자를 표시합니다.

Bounds control Constraints

이벤트

경계 컨트롤은 다음 이벤트를 제공합니다. 이 예제에서는 이러한 이벤트를 사용하여 오디오 피드백을 재생합니다.

  • 회전 시작: 회전이 시작될 때 발생합니다.
  • 회전 중지됨: 회전이 중지될 때 발생합니다.
  • 크기 조정 시작: 크기 조정이 시작될 때 발생합니다.
  • 크기 조정 중지됨: 크기 조정이 중지될 때 발생합니다.
  • 번역 시작: 번역이 시작될 때 발생합니다.
  • 번역 중지됨: 번역이 중지될 때 발생합니다.
Bounds control Events

Elastics(실험적)

범위 컨트롤을 통해 개체를 조작할 때 탄력을 사용할 수 있습니다. 탄력적 시스템은 아직 실험 상태입니다. 탄력적 기능을 사용하도록 설정하려면 기존 Elastics Manager 구성 요소를 연결하거나 단추를 통해 Add Elastics Manager 새 탄력적 관리자를 만들고 연결합니다.

Bounds control Elastics

스타일 처리

기본적으로 스크립트를 할당 BoundsControl.cs 하면 HoloLens 1세대 스타일의 핸들이 표시됩니다. HoloLens 2 스타일 핸들을 사용하려면 적절한 핸들 프리팹과 재질을 할당해야 합니다.

Bounds Control Handle Styles 2

다음은 HoloLens 2 스타일 경계 컨트롤 핸들의 프리팹, 재질 및 크기 조정 값입니다. 이 예제는 BoundsControlExamples 장면에서 찾을 수 있습니다.

Bounds control HandleStyles

핸들(HoloLens 2 스타일 설정)

  • 핸들 재질: BoundingBoxHandleWhite.mat
  • 핸들 잡기 재질: BoundingBoxHandleBlueGrabbed.mat
  • 크기 조정 핸들 프리팹: MRTK_BoundingBox_ScaleHandle.prefab
  • 배율 핸들 슬레이트 프리팹: MRTK_BoundingBox_ScaleHandle_Slate.prefab
  • 배율 핸들 크기: 0.016(1.6cm)
  • 배율 핸들 충돌체 패딩: 0.016(잡기 가능한 충돌체를 핸들 시각적 개체보다 약간 크게 만듭니다.)
  • 회전 핸들 프리팹: MRTK_BoundingBox_RotateHandle.prefab
  • 회전 핸들 크기: 0.016
  • 회전 핸들 충돌체 패딩: 0.016(잡기 가능한 충돌체가 핸들 시각적 개체보다 약간 더 큽니다.)

개체 조작자를 사용하여 변환 변경

경계 컨트롤은 핸들을 사용하지 않고 특정 유형의 조작(예: 개체 이동)을 허용하는 데 함께 ObjectManipulator.cs 사용할 수 있습니다. 조작 처리기는 한 손과 양손 상호 작용을 모두 지원합니다. 손 추적 을 사용하여 개체와 가까이에서 상호 작용할 수 있습니다.

Bounds control Object Manipulator

경계 컨트롤 에지가 '원거리 상호 작용'을 사용하여 ObjectManipulator이동할 때 동일한 방식으로 동작하려면 위의 스크린샷에 표시된 것처럼 조작 시작 시 조작종료BoundsControl.HighlightWires / BoundsControl.UnhighlightWires / 해당 이벤트를 각각 연결하는 것이 좋습니다.

Unity 검사기를 사용하여 경계 컨트롤을 추가하고 구성하는 방법

  1. 개체에 Box Collider 추가
  2. 개체에 스크립트 할당 BoundsControl
  3. 'Activation' 메서드와 같은 옵션 구성(아래 검사기 속성 섹션 참조)
  4. (선택 사항) HoloLens 2 스타일 경계 컨트롤에 대한 프리팹 및 재질 할당(아래 스타일 처리 섹션 참조)

참고

검사기에서 대상 개체경계 재정의 필드를 사용하여 여러 자식 구성 요소가 있는 개체의 특정 개체 및 충돌체를 할당합니다.

Bounds Control

코드에서 경계 컨트롤을 추가하고 구성하는 방법

  1. 큐브 GameObject 인스턴스화

    GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
    
  2. AddComponent<>()를 사용하여 충돌체가 있는 개체에 스크립트 할당 BoundsControl

    private BoundsControl boundsControl;
    boundsControl = cube.AddComponent<BoundsControl>();
    
  3. 컨트롤에서 직접 또는 스크립트 가능한 구성 중 하나를 통해 옵션을 구성합니다(아래 검사기 속성구성 섹션 참조).

    // Change activation method
    boundsControl.BoundsControlActivation = BoundsControlActivationType.ActivateByProximityAndPointer;
    // Make the scale handles large
    boundsControl.ScaleHandlesConfig.HandleSize = 0.1f;
    // Hide rotation handles for x axis
    boundsControl.RotationHandlesConfig.ShowRotationHandleForX = false;
    
  4. (선택 사항) HoloLens 2 스타일 경계 컨트롤에 대한 프리팹 및 재질을 할당합니다. 재질과 프리팹을 동적으로 로드해야 하므로 검사기를 통해 할당해야 합니다.

참고

셰이더 순열이 런타임에 누락될 수 있으므로 셰이더를 동적으로 로드하기 위해 Unity의 'Resources' 폴더 또는 Shader.Find 를 사용하지 않는 것이 좋습니다.

BoxDisplayConfiguration boxConfiguration = boundsControl.BoxDisplayConfig;
boxConfiguration.BoxMaterial = [Assign BoundingBox.mat]
boxConfiguration.BoxGrabbedMaterial = [Assign BoundingBoxGrabbed.mat]
ScaleHandlesConfiguration scaleHandleConfiguration = boundsControl.ScaleHandlesConfig;
scaleHandleConfiguration.HandleMaterial = [Assign BoundingBoxHandleWhite.mat]
scaleHandleConfiguration.HandleGrabbedMaterial = [Assign BoundingBoxHandleBlueGrabbed.mat]
scaleHandleConfiguration.HandlePrefab = [Assign MRTK_BoundingBox_ScaleHandle.prefab]
scaleHandleConfiguration.HandleSlatePrefab = [Assign MRTK_BoundingBox_ScaleHandle_Slate.prefab]
scaleHandleConfiguration.HandleSize = 0.016f;
scaleHandleConfiguration.ColliderPadding = 0.016f;
RotationHandlesConfiguration rotationHandleConfiguration = boundsControl.RotationHandlesConfig;
rotationHandleConfiguration.HandleMaterial = [Assign BoundingBoxHandleWhite.mat]
rotationHandleConfiguration.HandleGrabbedMaterial = [Assign BoundingBoxHandleBlueGrabbed.mat]
rotationHandleConfiguration.HandlePrefab = [Assign MRTK_BoundingBox_RotateHandle.prefab]
rotationHandleConfiguration.HandleSize = 0.016f;
rotationHandleConfiguration.ColliderPadding = 0.016f;

예: MinMaxScaleConstraint를 사용하여 최소, 최대 범위 컨트롤 배율 설정

최소 및 최대 배율을 설정하려면 컨트롤에 MinMaxScaleConstraint 연결합니다. 경계 컨트롤이 제약 조건 관리자를 자동으로 연결하고 활성화하면 MinMaxScaleConstraint가 연결되고 구성되면 변환 변경 내용에 자동으로 적용됩니다.

MinMaxScaleConstraint를 사용하여 최소 및 최대 크기를 ObjectManipulator설정할 수도 있습니다.

GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
bcontrol = cube.AddComponent<BoundsControl>();
// Important: BoundsControl creates a constraint manager on start if one does not exist.
// There's no need to manually attach a constraint manager.
MinMaxScaleConstraint scaleConstraint = bcontrol.gameObject.AddComponent<MinMaxScaleConstraint>();
scaleConstraint.ScaleMinimum = 1f;
scaleConstraint.ScaleMaximum = 2f;

예: 게임 개체 주위에 경계 컨트롤 추가

개체 주위에 경계 컨트롤을 추가하려면 구성 요소를 추가 BoundsControl 하기만 하면 됩니다.

private void PutABoundsControlAroundIt(GameObject target)
{
   target.AddComponent<BoundsControl>();
}

경계 상자에서 마이그레이션

경계 상자를 사용하는 기존 프리팹 및 인스턴스는 MRTK 도구 패키지의 일부인 마이그레이션 창을 통해 새 경계 컨트롤로 업그레이드할 수 있습니다.

경계 상자의 개별 인스턴스를 업그레이드하는 경우 구성 요소의 속성 검사기 내에 마이그레이션 옵션도 있습니다.

Bounds control Migrate

참고 항목