Unity 에디터에는 프로젝트 환경에서 표면에 대한 정보를 수집하기 위한 낮은 레벨의 Script Ref API가 있습니다. 낮은 레벨의 Script Ref API를 통해 언제 표면 변화에 대해 디바이스에 쿼리하고 언제 상응하는 표면 게임 오브젝트를 생성하거나 업데이트하는지를 최대한 제어할 수 있습니다. Spatial Mapping 컴포넌트는 낮은 레벨의 Script Ref API를 직접 사용하지 않고 빠르게 혼합 현실(mixed reality)을 실행할 수 있게 해줍니다.
Spatial Mapping 컴포넌트에는 공간 매핑 렌더러와 공간 매핑 콜라이더의 두 가지가 있습니다. Component > Add… (또는 인스펙터 창에서 Add Component 를 클릭)로 이동하여 Add Component 메뉴를 엽니다. Spatial Mapping 컴포넌트는 Add Component 메뉴의 AR 카테고리에 있습니다.
컴포넌트는 함께 사용하거나 개별적으로 사용할 수 있습니다. 각각의 Spatial Mapping 컴포넌트는 물리 세계의 변화를 이해하기 위해 자신만의 표면 관찰자를 사용합니다. 컴포넌트가 설정된 방법에 따라 각각의 Spatial Mapping 컴포넌트가 순차적으로 시스템을 쿼리하여 물리 공간에 어떤 변화가 일어났는지를 이해합니다. 시스템이 컴포넌트에 관련된 변화를 알려주면, 컴포넌트는 다양한 표면 변화 베이킹을 우선 순위 지정합니다. 베이킹 프로세스에는 물리적 표면에 상응하는 메시로 메시 필터를 생성하는 과정이 포함됩니다. Spatial Mapping Renderer 와 Spatial Mapping Collider 컴포넌트는 메시 필터를 자신만의 특정한 방법으로 사용합니다.
Spatial Mapping Renderer 컴포넌트는 공간 매핑 표면을 시각적으로 나타냅니다. 표면을 시각적으로 디버깅하고 환경에 시각적 효과를 추가할 때 매우 유용합니다.
Spatial Mapping Renderer 컴포넌트는 주기적으로 시스템에 물리적 공간의 변화를 물어봅니다. 컴포넌트에 이러한 변화가 통지될 때마다 컴포넌트는 반환된 표면 데이터를 게임 오브젝트로 베이크합니다. 이러한 게임 오브젝트에는 메시 필터와 메시 렌더러가 포함됩니다. Spatial Mapping Renderer 컴포넌트는 표면 게임 오브젝트의 수명주기를 관리합니다. 이것은 Spatial Mapping Renderer 컴포넌트가 표면 게임 오브젝트의 생성, 업데이트 및 파괴를 처리함을 의미합니다.
컴포넌트는 모든 생성된 표면의 머티리얼을 동적으로 변경하는 쉬운 방법을 제공합니다. 컴포넌트는 다음의 두 가지 머티리얼 타입으로 전송됩니다.
투명해 보이지만 홀로그램이 숨겨진 오클루젼 머티리얼. 이 머티리얼은 예를 들어, 현실에 있는 책상 밑에 인게임 홀로그래픽 오브젝트를 숨기려고 할 때, 매우 유용하게 쓰일 수 있습니다.
모든 컴포넌트의 표면에 적용되는 와이어프레임 셰이더. 와이어프레임의 컬러는 거리를 나타냅니다. 다음은 거리에 따른 컬러 매핑입니다.
0 ~ 1미터 = 검은색
1 ~ 2미터 = 빨간색
2 ~ 3미터 = 초록색
3 ~ 4미터 = 파란색
4 ~ 5미터 = 노란색
5 ~ 6미터 = 시안색
6 ~ 7미터 = 자홍색
7 ~ 8미터 = 고동색
8 ~ 9미터 = 청록색
9 ~ 10미터 = 주황색
10미터 이상 = 하얀색
설정 | 프로퍼티 |
---|---|
Custom Render Setting | 표면을 렌더링하기 위해 세 가지 옵션 중 하나를 선택합니다. Occlusion Material - 게임 오브젝트를 현실 표면 뒤에 숨기는 투명한 머티리얼. 참고: 다른 모든 설정을 오버라이드하여 표면의 모든 메시 렌더러를 활성화합니다. Custom Material - 표면을 시각화하기 위한 사용자 고유의 머티리얼. 디버깅, 시각적 효과 또는 사용자 고유의 오클루전 머티리얼에 사용합니다. 다른 모든 설정을 오버라이드하며, 표면의 모든 메시 렌더러를 활성화합니다. None(Game Object) - 표면에 지정된 모든 메시 렌더러를 비활성화합니다. |
Custom Material | 렌더링에 사용할 머티리얼을 선택합니다. 기본 설정은 빌트인된 SpatialMappingWireframe 머티리얼입니다. 여기서 선택하는 옵션은 Custom Render Settings 에 적용되는 렌더 머티리얼입니다. Custom Render Settings(Occlusion Material 및 Custom Material 모두)의 두 활성 옵션 모두 여기에서 Custom Material 설정이 필요하다는 점에 유의하십시오. |
일반 설정에 대한 자세한 내용은 아래의 일반 설정을 참조하십시오.
참고:
모든 표면 게임 오브젝트는 머티리얼을 Custom Render Setting 에서 가져옵니다. Custom Render Setting 을 변경하면, 모든 표면 게임 오브젝트의 렌더 머티리얼이 Custom Render Setting 과 똑같이 변경됩니다. 이렇게 하면 드로우 콜의 숫자가 줄어들며, 결과적으로 렌더링 성능이 향상됩니다. 공유된 머티리얼을 사용하는 것 또한 렌더링이 사용하는 메모리의 양을 줄여줍니다.
Custom Material 설정에 새로운 머티리얼을 지정했을 때, 표면 게임 오브젝트의 표면 머티리얼이 자동으로 바뀌지 않습니다. Custom Render Setting 을 Custom Material 또는 Occlusion Material 로 설정해야 새로운 머티리얼을 모든 표면에 적용할 수 있습니다.
Custom Render Setting 의 Occlusion Material 또는 Custom Material 프로퍼티가 런타임 시점에 지정되지 않은 경우, Renderer 컴포넌트와 함께 파괴됩니다. 하지만 런타임 시점에 지정된 모든 Occlusion Material 또는 Custom Material 은 컴포넌트와 함께 파괴되지 않으므로 개별적으로 파괴해야 합니다.
다음 예제 스크립트는 런타임 시점에 모든 표면 게임 오브젝트에 적용된 머티리얼을 동적으로 변경하는 방법을 시연합니다.
SpatialMappingRenderer renderer = spatialMappingGameObject.AddComponent<SpatialMappingRenderer>();
renderer.customMaterial = new Material(Shader.Find("VR/SpatialMapping/Wireframe"));
renderer.currentRenderSetting = SpatialMappingRenderer.RenderSetting.CustomMaterial;
공간 매핑 Collider 컴포넌트는 홀로그래픽 콘텐츠가 물리 표면과 상호 작용할 수 있게 해줍니다. 표면 게임 오브젝트의 생성, 업데이트 및 파괴를 처리합니다.
컴포넌트는 주기적으로 물리 세계의 표면 변화를 시스템에 쿼리합니다. 시스템이 표면 변화를 보고하면 Spatial Mapping Collider 컴포넌트는 각각의 보고된 표면이 언제 베이크될지, 우선 순위를 정합니다. 표면이 베이크되면 메시 필터와 Mesh Collider 컴포넌트를 가진 새로운 게임 오브젝트가 생성됩니다. 표면에 메시 콜라이더가 생기면, 표면에 광선을 발사하고 충돌할 수 있습니다.
설정 | 프로퍼티 |
---|---|
Enable Collisions | 표면 메시 콜라이더를 켜려면 이 박스를 선택합니다. |
Mesh Layer | 모든 표면 메시 콜라이더의 레이어 프로퍼티를 설정합니다. 레이캐스트용으로 레이어를 설정해야 합니다. 레이캐스트를 실행할 때, 어느 레이어를 광선과 교차하여 시험할 것인지 지정해야 합니다. 기본적으로 모든 게임 오브젝트는 Default 레이어에 지정되어 있습니다. 하지만, 게임 오브젝트를 특정 레이어로 지정하는 것이 좋습니다. 아래의 성능 최적화를 참조하십시오. 자세한 내용은 레이어 페이지와 레이캐스트 페이지를 참조하십시오. 또한 아래의 예제 스크립트: SpatialSurface 레이캐스트를 참조하십시오. |
Physic Material | 메시 콜라이더에 지정할 Physic Material 을 지정합니다. 기본 설정은 None(Physic Material) 입니다. Physic Material 은 다른 Rigidbody 컴포넌트가 이와 상호 작용하는 방법을 지정합니다. 예를 들어, 표면은 얼음을 시뮬레이션할 수 있으므로, 표면 위를 움직이는 물체에 마찰력을 줄일 수 있습니다. Spatial Mapping Collider 컴포넌트는 해당 Physic Material 을 표면 게임 오브젝트에 있는 모든 메시 콜라이더에 적용합니다. 자세한 내용은 물리적 머티리얼 페이지를 참조하십시오. |
일반 설정에 대한 자세한 내용은 아래의 일반 설정을 참조하십시오.
다음 예제는 SpatialSurface Layer의 게임 오브젝트에 레이캐스트하는 방법을 시연합니다.
using UnityEngine;
using System.Collections;
public class CustomLayerCollision : MonoBehaviour
{
// Update is called once per frame.
void Update()
{
// When the user presses the left mouse button,
// Do a collision test. You could fire the
// DetectCollisions based on a gesture event.*
if(Input.GetMouseButtonDown(0))
{
DetectCollisions();
}
}
void DetectCollisions()
{
// Raycast against all game objects that are on either the
// spatial surface or UI layers.
int layerMask = 1 << LayerMask.NameToLayer("SpatialSurface");
// We use ScreenPointToRay to create a ray whose origin is the
// main camera's position and direction is from the position of the main
// camera to the position of where the mouse position would be in world space.
RaycastHit[] hits = Physics.RaycastAll(Camera.main.ScreenPointToRay(Input.mousePosition), 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.");
}
}
}
General Settings 는 공간 매핑 Renderer(Script) 및 __ 공간 매핑 Collider(Script)__ 컴포넌트에 대해 동일하게 작동합니다.
설정 | 프로퍼티 |
---|---|
Surface Parent | Spatial Mapping 컴포넌트에서 생성한 표면 게임 오브젝트가 이어받을 Surface Parent 게임 오브젝트를 선택합니다. 자동으로 표면 부모 게임 오브젝트를 생성하려면 None(Game Object) 으로 놔둡니다. |
Freeze Updates | 컴포넌트가 시스템에 표면 변화에 대한 쿼리를 멈추게 하려면 이 박스를 선택합니다. 참고: 각 Spatial Mapping 컴포넌트는 주기적으로 시스템에 물리 공간의 표면 변화에 대해 쿼리합니다. 쿼리와 표면 베이킹은 메모리, 성능, 전력을 소비합니다. 거의 정적일 것이라 기대하는 환경에서는 사용자가 업데이트 없이 일정 시간동안 주위를 둘러볼 수 있도록 합니다. |
Time Between Updates | 물리 공간의 표면 변화를 쿼리하는 시간 간격을 십분의 일초 단위(예: 3.7 또는 4.6)로 지정합니다. 기본 설정은 2.5초입니다. 쿼리가 규칙적일수록 메모리, 성능, 전력 소모가 더 높아집니다. |
Removal Update Count | 표면 게임 오브젝트가 제거되기 전에 업데이트 수를 지정합니다. 여기서 업데이트는 프레임과 똑같습니다. 기본 설정은 10업데이트(프레임)입니다. 참고: 제거 업데이트 카운트 다운은 시스템이 컴포넌트에 표면 게임 오브젝트가 더 이상 표면 관찰자의 바운딩 볼륨에 없다는 것을 알렸을 때 시작합니다. 예를 들어, 게임 오브젝트가 시스템이 보고하는 정의된 영역에서 없어졌을 때입니다. 여기서 이 이벤트 뒤에 표면 게임 오브젝트를 제거하기 전에 얼마나 많은 업데이트(프레임)가 따를지 지정합니다. |
Level of Detail | 컴포넌트에서 생성한 메시의 품질을 Low, Medium 또는 High 중 하나로 선택합니다. 기본 설정은 Medium 입니다. 품질이 높을수록, 콜라이더와 렌더링이 더욱 정확해지고, 품질이 낮을수록 성능과 전력에 드는 비용이 적어집니다. 세 개의 Level Of Detail 모드 예제를 보려면 아래 그림을 참조하십시오. |
Bounding Volume Type | 여기서 바운딩 볼륨 영역 모양(Sphere 또는 Axis Aligned Box) 중 하나를 선택합니다. 기본 설정은 Axis Aligned Box 입니다. 참고: 바운딩 볼륨은 시스템이 물리 표면 변화를 보고하는 정의된 영역입니다. |
Size In Meters | 바운딩 볼륨의 크기를 미터 단위로 설정합니다. 반지름으로 Sphere 를 설정합니다. 디폴트 반지름은 2미터입니다. Axis Aligned Box 를 해당 범위로 설정합니다. 기본 설정은 Vector3(4, 4, 4) 또는 4큐빅 미터입니다. 참고: 관찰자의 바운딩 볼륨은 시스템이 물리 표면 변화를 보고하는 정의된 영역입니다. |
Level Of Detail
각각의 Spatial Mapping 컴포넌트는 다른 Spatial Mapping 컴포넌트와 별개라는 점을 명심하십시오. 이는 각각의 컴포넌트가 고유의 표면 리스트를 유지함을 의미하며, 다수의 컴포넌트가 동일한 표면을 볼 때도 마찬가지입니다. 성능을 최적화하려면 사용할 Spatial Mapping 컴포넌트의 수를 제한합니다.
시뮬레이션의 환경이 비교적 정적이고 변화가 없을 것이라 기대한다면(예: 보드 게임), 필요한 만큼 미리 표면 데이터를 스캔할 수 있으며 프리즈 업데이트 프로퍼티를 false로 설정할 수 있습니다. 이렇게 하면 성능이 약간 향상되고 전력소비가 적어집니다.
Spatial Mapping 컴포넌트를 이동하기 위해서는 성능 면에서 약간의 비용이 듭니다. 되도록이면 Spatial Mapping 컴포넌트를 포함한 게임 오브젝트의 이동을 피해야 합니다.
Collider Settings > Level of Detail 에서 Low 설정을 사용합니다. 이렇게 하면 충돌 교차점을 계산할 때, 성능을 향상시키고 전력 소비가 줄어듭니다.
공간 매핑 메시 콜라이더는 업데이트할 때 공간 매핑 메시 렌더러보다 지연 시간이 적습니다. 이는 공간 매핑 메시 콜라이더가 공간 매핑 메시 렌더러보다 빠르게 업데이트됨을 의미합니다.
Collider Settings > Mesh Layer 에서 모든 게임 오브젝트는 기본적으로 Default 레이어에 지정됩니다. 하지만, 게임 오브젝트를 특정 레이어에 지정하는 것이 좋습니다. 레이캐스팅은 성능이 저하될 수 있다는 점에서 실행에 소모가 많은 연산입니다. 레이어를 사용하면 어느 게임 오브젝트에 대해 레이캐스트 연산을 수행할지 필터링할 수 있으며, 이로 인해 성능을 최적화합니다. Default 레이어에 복잡한 메시가 별로 없다면 충돌에 대한 레이캐스트 시험을 수행해도 성능이 크게 소비되지 않습니다. 하지만 게임 오브젝트를 레이어로 정리하여 충돌 시험 시 레이캐스트 시험의 복잡성을 줄이는 것이 좋습니다.