Version: 2017.4
아래 설정은 __공간 매핑 렌더러__ 및 __공간 매핑 콜라이더__ 컴포넌트 모두에 공통적으로 적용됩니다.
공간 매핑 렌더러

공간 매핑 콜라이더

공간 매핑 콜라이더(Spatial Mapping Collider) 컴포넌트는 홀로그래픽 콘텐츠와 실제 물리 표면과의 인터랙션을 구현합니다. 또한 씬에서 표면 게임 오브젝트 콜라이더의 생성, 업데이트 및 삭제를 처리합니다.

이 컴포넌트는 주기적으로 물리 월드의 표면 변화를 시스템에 쿼리합니다. 시스템이 표면 변화를 보고하면 공간 매핑 콜라이더(Spatial Mapping Collider) 컴포넌트는 각각의 보고된 표면이 Unity에서 베이크될 시간에 대해 우선 순위를 지정합니다. 표면이 시스템에서 베이크되면 Unity는 메시 필터(Mesh Filter)메시 콜라이더(Mesh Collider) 컴포넌트가 포함된 새 게임 오브젝트를 생성합니다. 메시 콜라이더가 포함된 표면을 이용하면 Unity의 여타 다른 메시와 마찬가지로 레이캐스트와 충돌하도록 만들 수 있습니다. 자세한 내용은 [카메라 레이캐스트(Camera Raycast) 문서를 참조하십시오.

참고: 이 컴포넌트는 메시 렌더러가 아니라 표면 게임 오브젝트의 메시 콜라이더 컴포넌트만 업데이트합니다.

참고: 공간 매핑 콜라이더(Spatial Mapping Colliders)공간 매핑 메시 렌더러(Spatial Mapping Mesh Renderer) 보다 업데이트 지연 시간이 짧습니다. 즉, 공간 매핑 콜라이더가 공간 매핑 메시 렌더러보다 빠르게 업데이트됩니다.

Unity 에디터에 표시되는 공간 매핑 콜라이더 컴포넌트
Unity 에디터에 표시되는 공간 매핑 콜라이더 컴포넌트

콜라이더 설정

Setting Description
Enable Collisions 이 체크박스를 선택하면 표면 메시 콜라이더(Mesh Collider)가 활성화되어 홀로그래픽 콘텐츠가 표면과 충돌할 수 있습니다.
Mesh Layer 모든 표면 메시 콜라이더의 레이어 프로퍼티를 설정합니다. 단, 레이캐스트에 대한 레이어를 설정해야 합니다. 레이캐스트를 수행할 때는 광선 교차를 테스트할 레이어를 표시해야 합니다. 자세한 내용은 카메라 레이캐스트 문서와 아래의 예제 스크립트: SpatialSurface 레이캐스트를 참조하십시오.

기본적으로 Unity는 모든 게임 오브젝트를 기본(Default) 레이어에 할당합니다. 하지만 게임 오브젝트는 특정 레이어에 할당하는 것이 더 바람직합니다. 공간 매핑 표면을 위한 새로운 레이어를 생성한 후 이 레이어를 메시 레이어 프로퍼티에 할당하기를 권장드립니다.
Physic Material 각 표면 게임 오브젝트의 메시 콜라이더에 할당할 물리 머티리얼(Physic Material) 을 지정합니다. 기본 설정은 없음(물리 머티리얼)(None(Physic Material)) 입니다.

물리 머티리얼 은 다른 리지드바디 컴포넌트가 이와 상호 작용하는 방법을 지정합니다. 예를 들어 얼음을 시뮬레이션하는 표면을 생성한 경우 표면 위를 움직이는 물체에 적용되는 마찰력을 줄여야 합니다.

공간 매핑 콜라이더 컴포넌트는 해당 물리 머티리얼 을 표면 게임 오브젝트에 있는 모든 메시 콜라이더에 적용합니다. 자세한 내용은 물리 머티리얼 관련 문서를 참조하십시오.

일반 설정

아래 설정은 공간 매핑 렌더러공간 매핑 콜라이더 컴포넌트 모두에 공통적으로 적용됩니다.

Setting Description
Surface Parent 공간 매핑 컴포넌트에서 생성한 표면 게임 오브젝트가 이어받을 표면 부모(Surface Parent) 게임 오브젝트를 선택합니다. 자동으로 표면 부모 게임 오브젝트를 생성하려면 없음(게임 오브젝트)(None(Game Object)) 으로 둡니다.
Freeze Updates 이 박스를 선택하면 컴포넌트가 시스템에 표면 변화에 대한 쿼리를 하지 않습니다.

참고: 각 공간 매핑 컴포넌트는 주기적으로 물리 공간의 표면 변화에 대한 공간 매핑 데이터를 쿼리합니다. 표면 쿼리 및 베이킹은 메모리, 성능, 전력을 소비합니다. 거의 정적일 것으로 예상되는 환경에서는 표면 게임 오브젝트를 업데이트하는 대신 사용자가 일정 시간 동안 주위를 둘러볼 수 있도록 하는 것이 좋습니다.

시뮬레이션의 환경이 보드 게임처럼 거의 정적이고 변화가 없다고 예상되면 애플리케이션이 시작될 때 표면 데이터를 가능한 많이 스캔한 후 프리즈 업데이트(Freeze Updates) 프로퍼티를 true 로 설정하여 추가 업데이트를 막을 수 있습니다. 이렇게 하면 성능이 약간 향상되고 전력 소모가 감소합니다.
Time Between Updates 물리 공간의 표면 변화를 쿼리하는 시간 간격을 지정하는 10진수 포맷의 시간(단위: 초)(예: 3.7 또는 4.6)입니다. 기본 설정은 2.5초입니다. 쿼리가 규칙적일수록 메모리 사용량, 성능, 전력 소모가 더 높아집니다.
Removal Update Count 시스템이 표면 게임 오브젝트를 제거하기 전에 수행하는 업데이트 수입니다. 이 경우 업데이트를 프레임으로 간주해도 좋습니다. 기본 설정은 10업데이트입니다.

참고: 제거 업데이트 카운트 다운은 공간 매핑이 컴포넌트에 표면 게임 오브젝트가 더 이상 SurfaceObserver의 바운딩 볼륨에 없다는 것을 알렸을 때 시작합니다. 표면 게임 오브젝트가 시스템에서 보고하는 정의된 영역에 더 이상 존재하지 않을 때를 예로 들 수 있습니다. 이 설정을 이용하면 공간 매핑이 표면 게임 오브젝트를 제거하기 전에 이 이벤트 이후 발생해야 할 업데이트 수를 지정할 수 있습니다.
Level of Detail 컴포넌트가 생성하는 메시의 품질(낮음(Low), 중간(Medium), 높음(High))입니다. 기본 품질은 중간(Medium) 입니다. 품질이 높을수록 생성되는 콜라이더 또는 렌더링되는 메시의 정밀도와 정확도가 향상됩니다. 저품질 설정을 사용하면 성능 및 전력 소모가 줄어듭니다. 세 가지 디테일 수준(LOD) 모드에 대한 예제는 이 테이블 아래의 이미지를 참조하십시오.
Bounding Volume Type 컴포넌트의 바운딩 볼륨 영역 모양으로, 여기에서 애플리케이션이 공간 매핑 데이터를 받습니다. 구체(Sphere) 또는 축 정렬 상자(Axis Aligned Box) 중에서 선택할 수 있습니다. 기본 설정은 축 정렬 상자(Axis Aligned Box) 입니다.

참고: 바운딩 볼륨은 시스템이 물리 표면 변화를 보고하고 공간 매핑 메시의 범위를 제한하도록 정의된 영역입니다.
Size In Meters 컴포넌트에서 사용하는 바운딩 볼륨의 크기(단위: 미터)입니다. 반지름으로 구체(Sphere) 를 설정합니다. 기본 반지름은 2미터입니다. 축 정렬 상자(Axis Aligned Box) 를 해당 범위로 설정합니다. 기본 설정은 Vector3(4,4,4)입니다.

참고: 관찰자의 바운딩 볼륨은 공간 매핑이 물리 표면 변화를 보고하도록 정의된 영역입니다.

디테일 수준(LOD)

아래 이미지에서 설명된 것처럼 두 Spatial Mapping 컴포넌트 모두 각 컴포넌트의 생성 공간 메시에 대해 세 가지 디테일 수준(LOD)(낮음, 중간, 높음) 중 하나를 지정할 수 있습니다.

공간 매핑 메시를 위한 세 가지 디테일 수준(LOD) 모드
공간 매핑 메시를 위한 세 가지 디테일 수준(LOD) 모드

가능한 경우 Spatial Mapping Colliders 에 대한 디테일 수준(LOD) 설정을 Low로 설정하십시오. 이렇게 하면 충돌 교차를 계산할 때 성능이 향상되고 전력 소모가 감소합니다. 하지만 Level of DetailLow 로 설정하면 애플리케이션의 시각 효과가 저하될 수 있습니다.

공간 매핑 콜라이더 사용

표면 게임 오브젝트

씬의 게임 오브젝트에 공간 매핑 콜라이더 컴포넌트를 추가하면 런타임 동안 별도의 표면 게임 오브젝트 세트가 생성됩니다. 이 표면 게임 오브젝트는 표면 부모 게임 오브젝트에 연결된 씬에 나타납니다.

공간 매핑 콜라이더 에서 생성한 표면 게임 오브젝트에는 다음 컴포넌트가 포함되어 있습니다.

공간 매핑 콜라이더(Spatial Mapping Collider) 에서 생성된 표면 게임 오브젝트의 컴포넌트
공간 매핑 콜라이더(Spatial Mapping Collider) 에서 생성된 표면 게임 오브젝트의 컴포넌트

씬에 여러 개의 공간 매핑 콜라이더 컴포넌트를 추가하는 경우 각 컴포넌트는 별도의 표면 게임 오브젝트 세트를 생성합니다. 예를 들어, 씬에 있는 두 개의 게임 오브젝트에 공간 매핑 콜라이더 가 포함되어 있다면 씬에 두 세트의 표면 게임 오브젝트가 포함됩니다. 각 세트는 런타임 시점에 각 컴포넌트에 의해 생성됩니다. 최적화를 위해 이 점을 잘 기억해두는 것이 좋습니다. 참고: 공간 매핑 시스템에서 처음 생성될 때 모든 표면 게임 오브젝트기본 레이어 에 할당됩니다. 하지만 레이캐스트 계산은 성능 소모가 크기 때문에 게임 오브젝트를 특정 레이어에 할당하는 것이 더 좋습니다. 레이어를 사용하면 레이캐스트 계산을 수행할 게임 오브젝트를 필터링할 수 있습니다. 기본(Default) 레이어에 복잡한 메시가 많지 않은 경우에는 충돌을 위한 레이캐스트 테스트를 수행해도 성능 소모가 적습니다. 하지만 충돌 수행 시 레이캐스트 테스트의 복잡성을 줄이려면 게임 오브젝트를 레이어에 할당하는 것이 좋습니다. 특정 공간 매핑 콜라이더 컴포넌트에서 생성한 모든 표면 게임 오브젝트에 할당된 레이어를 바꾸려면 콜라이더 설정(Collider Settings) > 메시 레이어(Mesh Layer) 프로퍼티를 변경하십시오.

예제 스크립트: 탭 제스처 이벤트에 대한 SpatialSurface 레이캐스트

다음 예제는 표면 공간(SpatialSurface) 레이어의 게임 오브젝트에 대해 레이캐스트를 수행하고 GestureRecognizer를 사용하여 탭 제스처 이벤트 감지 시 이 레이캐스트를 시작하는 방법을 보여줍니다.


using UnityEngine;
using System.Collections; 

//Required for Gesture Recognizer
using UnityEngine.XR.WSA.Input;


public class CustomLayerCollision : MonoBehaviour
{

    //use this to capture gesture events

    private GestureRecognizer GR_recognizer;

    void Start()
    {
        //Initialise the GestureRecognizer

        GR_recognizer = new GestureRecognizer();

        //Initiate gesture capture

        GR_recognizer.StartCapturingGestures();

        //Tell the GestureRecognizer which events to listen for

        GR_recognizer.SetRecognizableGestures(GestureSettings.Tap);

        //Subscribe the Tapped event to the DetectCollisions method

        //This makes this method be called any time the GestureRecognizer detects a tap event

        GR_recognizer.Tapped += DetectCollisions;

        //When the user initiates a tap gesture, the DetectCollisions   

        //method is called by the Tapped event delegate to do a collision test using Raycasting

        //See [GestureRecognizer API reference](../ScriptReference/XR.WSA.Input.GestureRecognizer.html) for more details
    }
    //Method to fire a raycast on a Tap event
    public void DetectCollisions(TappedEventArgs tapEvent)
    {
        // Raycast against all GameObjects that are on either the
        // spatial Surface or UI layers.

        int layerMask = 1 << LayerMask.NameToLayer("SpatialSurface");

        //construct a Ray using the position and forward direction of the User’s head
        Ray GazeRay = new Ray(tapEvent.headPose.position, tapEvent.headPose.forward);

        //Raycast using constructed Ray from Gaze and store collisions in array hits

        RaycastHit[] hits = Physics.RaycastAll(GazeRay, float.MaxValue, layerMask);

        if (hits.Length > 0)
        {
            foreach (RaycastHit hit in hits)
            {
                Debug.Log(string.Format("Hit Object **\"**{0}**\"** at position **\"**{1}**\"**", hit.collider.gameObject, hit.point));
            }
        }
        else
        {
            Debug.Log("Nothing was hit.");
        }
    }
}

자세한 내용은 레이어카메라 레이캐스팅에 대한 문서를 참조하십시오.

  • 2018–05–01 편집 리뷰를 거쳐 페이지 게시됨

  • Unity 2017.3에서 HoloLens 공간 매핑에 대한 설명이 업데이트됨

아래 설정은 __공간 매핑 렌더러__ 및 __공간 매핑 콜라이더__ 컴포넌트 모두에 공통적으로 적용됩니다.
공간 매핑 렌더러