본문 바로가기
Devices/ZED

ZED - Unity

by wenect 2023. 2. 27.

1단계: 호환성 확인

다음이 있는지 확인하십시오.

하드웨어:

  • ZED, ZED-M 또는 ZED2 카메라 (AR 패스스루에 ZED Mini 선호)
  • CUDA 기능 3.0 이상의 NVIDIA GPU(AR 패스스루에는 GTX 1060 이상 권장)
  • 2.3GHz 이상 클럭의 듀얼 코어 프로세서
  • 4GB RAM 이상
  • USB 3.0
  • 호환되는 VR 헤드셋 (패스스루 AR에 필요)

지원되는 VR 헤드셋:

  • 오큘러스 리프트
  • HTC 바이브
  • HTC 바이브 프로*
  • Windows Mixed Reality 헤드셋*(SteamVR을 통해서만)

* Stereolabs의 ZED Mini 마운팅 브래킷은 Oculus Rift 및 오리지널 HTC Vive용으로 설계되었습니다. Samsung Odyssey와 같은 일부 WMR 헤드셋에 맞을 수 있지만 Vive Pro 또는 다른 WMR 헤드셋에 대한 사용자 지정 첨부 파일을 만들어야 합니다.

소프트웨어:

 플러그인의 Linux 버전은 ZED SDK 2.8용 Linux_compatibility_beta 브랜치에서 사용할 수 있습니다. SDK 3.0부터 Windows 및 Linux 버전은 동일한 기본 분기에 있습니다. 

튜토리얼 보기( https://github.com/stereolabs/zed-unity/tree/master/ZEDCamera/Assets/ZED/Doc/Tutorials )

2단계: 설치

  • 필요한 NVIDIA CUDA 버전을 설치 하고 컴퓨터를 다시 시작하십시오. 현재 ZED SDK와 호환되지 않는 기존 버전의 CUDA가 설치되어 있는 경우 먼저 해당 버전을 제거하십시오.
  • ZED SDK를 설치 하고 컴퓨터를 다시 시작하십시오.

3단계: 유니버설 렌더 파이프라인 사용

URP를 사용하려면 URP를 사용하는 새 프로젝트를 생성하거나 기존 프로젝트를 업그레이드해야 합니다.

새 URP 프로젝트 만들기

Unity Hub를 사용하여 프로젝트와 Unity 버전을 관리하는 것이 좋습니다 .

  • Unity Hub를 열고 New 버튼을 클릭합니다.
  • 템플릿 섹션에서 범용 프로젝트 템플릿 을 선택합니다 .
  • 만들기 를 클릭합니다 . Unity는 자동으로 URP 패키지를 설치하고 URP를 사용하도록 프로젝트를 설정합니다.

URP로 업그레이드

  • Window -> Package Manager 로 이동합니다 . Universal RP를 찾아 설치합니다 .

이제 URP를 구성해야 합니다. 이렇게 하려면 스크립터블 렌더 파이프라인 에셋을 생성해야 합니다.

  • 프로젝트 창을 마우스 오른쪽 버튼으로 클릭하고 만들기 -> 렌더링 -> 유니버설 렌더 파이프라인 -> 파이프라인 자산을 선택합니다 . Assets -> Create -> Rendering -> Universal Render Pipeline -> Pipeline Asset 으로 이동할 수도 있습니다 .

이 렌더 파이프라인 자산을 그래픽 설정에 추가하십시오.

  • 편집 -> 프로젝트 설정 -> 그래픽 으로 이동합니다 . 스크립터블 렌더 파이프라인 설정 에서 방금 생성한 유니버설 렌더 파이프라인 에셋을 추가합니다.

모든 자료를 HDRP로 업그레이드:

  • 편집 -> 렌더 파이프라인 -> 유니버설 렌더 파이프라인으로 이동하여 Upgrade Project Materials To URP Materials 또는 Upgrade Selected Materials to URP Materials 중 하나를 선택합니다 . 이러한 변경 사항은 취소할 수 없습니다. 업그레이드하기 전에 프로젝트를 백업하십시오.

또한 모든 프리팹을 URP로 업그레이드해야 합니다.

  • 이를 위해 ZED -> URP로 ZED 플러그인 업그레이드를 클릭합니다 .

URP 설정 방법에 대한 자세한 내용은 유니버설 렌더 파이프라인 문서를 참조하십시오 .

3-2단계: 고화질 렌더 파이프라인 사용

HDRP를 사용하려면 HDRP를 사용하는 새 프로젝트를 생성하거나 기존 프로젝트를 업그레이드해야 합니다.

새 HDRP 프로젝트 생성

Unity Hub를 사용하여 프로젝트와 Unity 버전을 관리하는 것이 좋습니다 .

  • Unity Hub를 열고 New 버튼을 클릭합니다 .
  • 템플릿 섹션에서 고화질 RP를 선택합니다 .
  • 만들기 를 클릭합니다 . Unity는 자동으로 HDRP 패키지를 설치하고 HDRP를 사용하도록 프로젝트를 설정합니다.

HDRP로 업그레이드

  • Window -> Package Manager 로 이동합니다 . 고화질 렌더 파이프라인을 찾아 설치합니다 .
  • 프로젝트를 설정하려면 렌더 파이프라인 마법사 를 사용하십시오 . Window -> Render Pipeline -> HD Render Pipeline Wizard 로 이동합니다 .
  • HDRP 섹션 에서 모두 수정 버튼을 클릭합니다 . 이제 HDRP가 프로젝트에 설정되었습니다.

또한 모든 프리팹을 HDRP로 업그레이드해야 합니다.

  • 이를 위해 ZED -> ZED 플러그인을 HDRP로 업그레이드를 클릭합니다 .

HDRP 설정 방법에 대한 자세한 내용은 고해상도 렌더 파이프라인 문서를 참조하세요 .

4단계: 플러그인 가져오기

  • Unity를 열고 새 프로젝트를 만듭니다.
  • 자산 -> 패키지 가져오기 -> 사용자 지정 패키지 로 이동합니다 . ZED Unity 플러그인을 다운로드한 위치로 이동하여 가져옵니다.
  • 모든 파일을 선택한 상태로 두고 가져오기 를 클릭합니다 . (가져올 때 예제 폴더를 선택 취소하면 공간을 절약할 수 있지만 처음 사용자에게는 예제를 권장합니다.)
  • 스크립트를 업그레이드하라는 메시지가 표시되면 "백업했습니다. 진행하세요!"를 클릭합니다. (우리는 말하지 않을 것입니다)
  • 일부 설정을 변경하라는 메시지가 표시되면 "모두 수락"을 클릭합니다 .

예시 장면

플러그인을 가져온 후 몇 가지 예시 장면을 선택하여 사용해 보세요. 각각은 ZED의 주요 기능을 보여주기 위해 설계되었습니다. 일부는 프로젝트용으로 용도를 변경할 수 있는 프리팹 및 ​​예제 스크립트를 포함합니다.

별자리 투영기

헤드셋을 사용하거나 사용하지 않고 볼 수 있는 ZED 플러그인의 기본 혼합 현실 기능의 아름다운 디스플레이. 행성이 실제 세계에 의해 적절하게 가려지는 것을 지켜보십시오. 태양 아래에서 손을 움직이면 따뜻한 빛이 피부를 비추는 것을 볼 수 있습니다. Oculus 통합 또는 SteamVR 플러그인을 사용하는 경우 키보드 또는 VR 컨트롤러를 사용하여 행성을 이동, 회전 및 크기 조정합니다.

https://user-images.githubusercontent.com/113181784/202200233-ff0a6777-ab02-4896-aad5-8904b9318443.mp4

영화 화면

천문관 샘플과 유사하지만 이제 이동 가능하고 확장 가능한 3D 화면에서 2D 영화를 재생합니다. 2D 콘텐츠를 3D 혼합 현실 장면에 쉽게 표시할 수 있는 방법을 보여줍니다.

https://user-images.githubusercontent.com/113181784/202200467-e66876ea-7bfd-4996-a31c-b6922a1653ea.mp4

드론 배틀

방 주변에 생성되어 당신을 쏘는 공격 드론으로부터 자신을 방어하세요. 손으로 레이저를 차단하고 스페이스바 또는 Oculus 통합 또는 SteamVR 플러그인을 사용하는 경우 VR 컨트롤러로 반격하십시오. 이 스크립트는 ZEDSupportFunctions.cs 를 사용하여 빈 영역( DroneSpawner.cs )에 개체를 생성하고 실제 또는 가상 세계에 충돌할 수 있는 발사체( Projectile.cs )를 쏘는 방법을 보여줍니다.

https://user-images.githubusercontent.com/113181784/202200580-78c327a4-7899-4162-adbb-d8318f313519.mp4

암실

당신의 사무실은 이제 나이트 클럽입니다! 이 장면은 현실 세계를 어둡게 한 다음 음악과 디스코 볼로 완성된 레이저 조명 쇼를 벽과 바닥에 투사합니다. ZEDManager 의 카메라 밝기 기능 의 유용성 과 ZEDLight.cs를 사용하는 창의적인 방법을 보여줍니다 .

https://user-images.githubusercontent.com/113181784/202200729-966c34de-654e-4c4c-a977-941af3c854b7.mp4

단순 평면 감지

장면을 실행하고 스페이스바를 누른 상태에서 토끼가 서 있을 수 있는 유효한 표면을 보고 있는지 확인합니다. 스페이스바를 놓으면 토끼가 하늘에서 떨어져 적절한 물리학으로 해당 표면에 착지합니다.

https://user-images.githubusercontent.com/113181784/202201108-e17debfa-175d-44b3-8be9-afab8c9007b2.mp4

VR 전용 평면 감지(VR HMD 및 Oculus/SteamVR 플러그인 필요)

컨트롤러를 바닥에 대고 방아쇠를 당겨 토끼를 배치하세요. 그러면 손에 야구 방망이가 나타납니다. 토끼를 때리고 최대한 멀리 날아가게 하세요. 토끼가 착지하면 거리를 볼 수 있습니다. 평면 감지가 적절한 게임에 어떻게 적합하고 ZEDSupportFunctions 의 HitTestOnRay를 사용하여 세계 공간을 사용하는 평면을 확인하는 방법을 보여줍니다.

https://user-images.githubusercontent.com/113181784/202201329-ac25cb5c-0d8e-4042-b273-5788252731cd.mp4

ArUco 마커 감지(Unity 패키지용 OpenCV 필요)

ArUco 마커를 출력하여 ZED의 시야에 놓고 전투를 시작하십시오. 포함된 다양한 스크립트를 사용하여 마커 감지를 위해 ZED를 OpenCV와 쉽게 인터페이스하는 방법을 보여줍니다. 사용하려면 Unity용 OpenCV 패키지(평가판 또는 정식 버전) 를 가져와야 합니다 .

https://user-images.githubusercontent.com/113181784/202201640-ff353944-0adb-4eba-a672-564d5d475f97.mp4

녹색 화면

녹색 화면에서 ZED를 조준하고 재생을 눌러 피사체가 사막의 작은 마을에 서 있는 것을 확인하세요. 가까운 상자에 여전히 적절한 폐색이 모두 있지만 녹색 화면 배경이 가상 배경으로 대체된 것을 볼 수 있습니다. ZED를 컨트롤러 또는 Vive 트래커에 연결하고 ZEDControllerTracker 에서 지정하여 추적된 VR 공간에서 ZED를 이동합니다.

https://user-images.githubusercontent.com/113181784/202203983-01d323ce-4f57-4ce5-b8cf-f22d891c6319.mp4

혼합 현실 보정

대화형 VR 내 앱을 사용하여 컨트롤러 또는 Vive 트래커와 같은 추적 개체로 ZED를 보정하여 그 어느 때보다 쉽게 ​​혼합 현실 비디오를 캡처할 수 있습니다.

https://user-images.githubusercontent.com/113181784/202201972-7e199704-1057-4a40-a7ac-ca82a5f2ce53.mp4

첫 번째 프로젝트 만들기

  • 새 장면을 만들고 기본 카메라를 삭제합니다.
  • 프로젝트 탭에서 Assets -> ZED -> Prefabs 로 이동합니다 .
  • 통과 AR을 수행할 계획이라면 ZED_Rig_Stereo를 장면으로 끌어다 놓습니다. 그렇지 않으면 대신 ZED_Rig_Mono를 사용하여 성능을 절약하십시오.

  • 계층 구조를 마우스 오른쪽 버튼으로 클릭하고 3D 개체 -> 구를 클릭하여 기본 구를 장면에 넣습니다. ZED 카메라 장비 앞에 약 1미터 정도 위치시킵니다.
  • 장면에서 디렉셔널 라이트를 선택합니다 . ZED Light 구성 요소를 추가합니다 .
  • Transform 컴포넌트 에서 X Rotation을 90으로 설정하여 Directional Light가 똑바로 아래를 향하도록 설정합니다 .
  • 장면을 실행합니다. 현실 세계에 떠 있는 구체와 그 아래 그림자를 드리우는 것을 볼 수 있습니다.

 

https://user-images.githubusercontent.com/113181784/202202116-8180e1f9-2824-4770-a9b8-5950047c09c8.mp4

AR 패스스루 추가

ZED Mini가 전면에 장착된 VR 헤드셋(Oculus Rift, HTC Vive, HTC Vive Pro 또는 Windows Mixed Reality 헤드셋)이 있다고 가정합니다.

  • 마지막 장면에서 ZED_Rig_Mono를 사용한 경우 ZED_Rig_Stereo 로 교체합니다 .
  • 편집 -> 프로젝트 설정 -> 플레이어 로 이동합니다 .
  • 가상 현실 지원을 활성화합니다 . Unity 2017.1 또는 2017.2에서는 기타 설정 섹션 에 있습니다 . 2017.3 이상에서는 XR 설정 에 있습니다 .
  • 장면을 실행하고 헤드셋을 착용합니다.

WMR 헤드셋을 사용하는 경우:

ZED Unity 플러그인은 SteamVR을 통해서만 WMR 헤드셋을 지원하며 Unity의 WMR 빠른 시작 가이드 에 설명된 것과 다른 설정이 필요합니다 . 실행하는 데 문제가 있는 경우 다음을 확인하세요.

  • 귀하의 플랫폼(빌드 설정에서)이 PC, Mac 및 Linux 독립형(유니버설 Windows 플랫폼 아님)으로 설정되어 있습니다.
  • OpenVR은 가상 현실 SDK 목록에 나열되며, 이상적으로는 목록 맨 위에 있습니다.
  • SteamVR용 Windows Mixed Reality가 PC에 설치되어 있습니다.

ZED_Rig_Mono 및 ZED_Rig_Stereo 이해

ZED Rig 프리팹은 Unity 장면에서 일반 카메라를 대체하고 실제 및 가상 모두에서 사용자가 보는 모든 것을 처리합니다. 가상 세계를 캡처하는 동시에 실제 세계를 3D로 투사하여 최종 출력이 적절한 폐색과 그림자가 있는 두 가지의 조합이 되도록 합니다. 장면에서 ZED 또는 ZED Mini를 사용할 때 거의 항상 이 두 프리팹 중 하나를 원할 것입니다.

두 리그는 계층 구조가 약간 다르지만 세 가지 주요 부분이 있습니다.

  • 루트 개체 : ZEDManager 구성 요소를 보유하여 인스펙터를 통해 다양한 카메라 설정(다음 섹션에 나열됨)을 변경할 수 있습니다. AR 패스스루 모드가 아닌 경우 이 개체는 추적이 활성화되었을 때 움직이는 개체입니다.
  • Camera object(s) : Unity 카메라와 카메라 렌더링 방법을 처리하는 ZEDRenderingPlane 구성 요소를 보유합니다. 또한 적절한 변환, 재질 및 재질 설정으로 프레임 개체를 설정합니다. AR 패스스루 모드에서는 이것이 움직입니다.
  • 프레임 개체(들) : 카메라 앞에 위치한 쿼드(들)는 실제 ZED의 비디오로 질감 처리됩니다. ZED SDK에서 계산한 깊이를 기반으로 각 픽셀의 깊이를 상쇄하는 재질로 렌더링되어 실시간 오클루전 및 조명 효과를 허용합니다.

사용할 프리팹은 AR 패스스루를 수행하는지 여부에 따라 다릅니다. 그렇다면 ZED_Rig_Stereo를 선택하십시오. 그렇지 않은 경우 ZED_Rig_Mono를 선택합니다. (ZED_Rig_Stereo도 작동하지만 사용하지 않는 두 번째 Unity 카메라는 성능이 저하됩니다.) ZED 리그 프리팹 ​​중 하나를 드롭하기 전에 장면에서 기본 Unity 카메라를 항상 삭제하십시오.

ZED_Rig_Mono

모노 리그는 3인칭 혼합 현실 또는 헤드셋을 사용하지 않는 모든 종류의 증강 현실에 적합합니다. 최종 비디오 스트림을 다른 것과 마찬가지로 기본 디스플레이에 출력하는 단일 Unity 카메라가 있습니다. 비디오 피드의 "실제" 부분은 ZED의 왼쪽 카메라에서 나옵니다.

ZED_Rig_Stereo

스테레오 리그는 AR 패스스루에 필요하지만 헤드셋을 사용하지 않는 경우 모노 리그와 동일한 동작을 합니다. 각 눈에 하나씩 두 개의 Unity 카메라와 두 개의 프레임 개체가 있습니다. 두 카메라는 사용자 머리의 중심을 나타내는 빈 "Camera_eyes" 개체의 자식 개체입니다.

플레이어 설정에서 VR을 활성화하면 카메라를 장면으로 드래그하여 실행할 수 있습니다. 헤드셋이 감지되면 프리팹은 Unity의 내장 VR/XR 기능을 사용하여 Camera_eyes를 배치합니다. 따라서 컨트롤러 지원을 추가하려는 경우가 아니면 패스스루 AR을 사용하기 위해 다른 플러그인이 필요하지 않습니다.

주요 스크립트

ZEDManager.cs

ZEDManager 는 플러그인의 중심 스크립트이며 귀하와 같은 사용자가 Unity 내에서 ZED와 상호 작용하는 기본 방법입니다. ZED에 대한 연결을 설정 및 종료하고, 사용자 설정에 따라 매개변수를 조정하고, 추적과 같은 기능을 활성화/비활성화/처리하고, 개발자가 유용하다고 생각할 수 있는 수많은 속성, 메서드 및 콜백을 보유합니다. ZEDManager는 두 ZED 리그 프리팹의 루트 오브젝트에 연결됩니다.

입력:

  • 카메라 ID: 한 대의 PC에 ZED 또는 ZED Mini 카메라를 최대 4대까지 동시에 연결할 수 있습니다. 이 값은 연결할 카메라를 결정합니다. 카메라의 순서는 Windows가 장치를 인식하는 순서로 정의됩니다.
  • 깊이 모드: 깊이 계산의 정확도. 설정이 높을수록 오클루전과 조명이 더 정확해지지만 성능이 저하됩니다. QUALITY 모드와 ULTRA 모드 사이에는 성능 비용이 크게 증가합니다.
  • 입력 유형: ZED SDK는 다음 세 가지 방법 중 하나에서 입력을 받을 수 있습니다.
    • USB: ZED에 연결된 라이브 카메라에서 입력합니다. 해당 카메라의 해상도와 FPS를 지정할 수 있습니다. 720p 및 60FPS는 AR 통과를 위한 최상의 균형입니다.
    • SVO: 라이브 ZED로 이전 세션에서 촬영한 기록된 SVO 파일을 로드합니다. 이 파일은 라이브 ZED가 첨부된 것처럼 작동합니다. .SVO 파일의 경로, 완료된 후 반복할지 여부, 각 프레임을 타임스탬프를 기반으로 또는 순차적으로 재생할지 여부를 지정합니다.
    • 스트림: 카메라 입력을 능동적으로 스트리밍하는 원격 장치의 ZED에서 입력합니다. 접속할 IP와 Port를 설정합니다. 스트림을 브로드캐스트하려면 ZEDManager의 스트리밍 섹션을 참조하십시오.

움직임 추적:

  • 추적 활성화: 활성화되면 ZED는 HMD 부착 여부와 관계없이 자체 내부 추적을 사용하여 자체적으로 이동/회전합니다. AR 통과 모드에서는 추적을 HMD와 결합하고 대기 시간 보상을 위한 타임워프 기능을 허용합니다.
  • Enable Spatial Memory(공간 메모리 활성화): 이 기능과 추적이 활성화되면 ZED는 추적 드리프트가 있을 때 장면의 지점을 기억하여 재위치화합니다. 추적이 더 정확하지만 재지역화할 때 "점프"할 수 있습니다.
  • 경로 공간 메모리: 공간 메모리를 사용하는 경우 이미 로드된 일부 메모리로 시작하도록 기존 .area 파일에 대한 경로를 지정할 수 있습니다. .area 파일은 공간 매핑을 사용할 때 생성됩니다(ZEDSpatialMapping.cs 참조).

표현:

  • Depth Occlusion: 활성화하면 가상 픽셀을 실제 픽셀로 덮을 수 있으므로 예를 들어 가상 큐브가 실제 테이블 뒤에 있을 수 있습니다. 가상 개체가 항상 실제 세계 위에 나타나도록 하려면 끕니다.
  • AR 후처리: 통과 경험을 보다 사실적으로 느끼도록 추가 후처리 효과를 적용할지 여부입니다. 추가 성능이 필요하지만 일반적으로 그만한 가치가 있습니다.
  • 카메라 밝기: 현실 세계를 더 어둡게 만들려면 낮춥니다. 이것은 카메라의 실제 입력을 변경하는 것이 아니라 실제 세계를 다시 조명하면 현실적으로 더 밝게 만들 것임을 의미하는 최종 재료를 변경한다는 점에 유의하십시오(Dark Room 샘플 참조).

공간 매핑

참고: 플러그인 버전 2.7.1 및 이전 버전에서 공간 매핑 인터페이스는 ZEDSpatialMappingManager라는 독립 실행형 클래스에 있었습니다.

환경을 메시로 스캔할 수 있습니다. 지오메트리가 지속되어야 하는 충돌, AI가 탐색에 사용할 수 있는 내비메시 구축, 나중에 사용할 수 있도록 메시 저장에 유용합니다. ZEDManager 의 공간 메모리 기능에서 사용하는 .area 파일을 생성하는 방법이기도 합니다 .

런타임 중에 공간 매핑 시작을 클릭하여 스캔을 시작합니다. 충분히 스캔했으면 "Stop Spatial Mapping(공간 매핑 중지)"을 눌러 메시를 완료합니다(필요한 경우 저장).

  • 해상도는 메시의 세부 사항을 제어합니다. 중간은 성능뿐만 아니라 사소한 깊이 오류를 평균화하는 경향이 있기 때문에 권장됩니다.
  • 범위는 표면이 스캔될 수 있는 거리를 제어합니다. 중간은 성능뿐만 아니라 정확도를 보장하기 위해 권장됩니다.
  • 메시 필터링은 완료 시 메시가 얼마나 부드럽게 처리되는지 제어합니다. 일반적으로 낮음이 가장 좋지만 높으면 스캔하기 어려운 일부 표면에 도움이 될 수 있습니다.
  • 텍스처링은 지오메트리 외에 표면 텍스처를 저장합니다. 이렇게 하면 메시를 마무리하는 데 걸리는 시간이 크게 늘어납니다.
  • Save Mesh는 메쉬가 최종 경로에 .obj, .bin 또는 .ply 파일로 저장되도록 합니다. 또한 ZEDManager에서 Enable Tracking 및 Spatial Memory가 모두 활성화된 경우 공간 메모리에 사용되는 .area 파일을 저장합니다.

여기에서 자세한 내용을 읽 거나 포함된 공간 매핑 샘플 장면을 사용해 보십시오.

녹음:

런타임 시 ZED 입력의 .SVO 비디오 파일을 녹화하여 나중에 재생하여 라이브 ZED에서 입력된 것처럼 사용할 수 있습니다.

  • SVO 파일: 녹화된 파일이 저장되는 곳입니다. .svo로 끝나는 파일 이름을 지정합니다.
  • SVO 압축: 사용할 압축 방법입니다. AVCHD_BASED는 파일 크기가 작고 일반적으로 권장됩니다.
  • 기록 시작/중지: 런타임에 이 버튼을 누르면 지정된 파일에 기록이 시작됩니다.

참고: 플러그인 v2.7.1 및 이전 버전에서 이 기능은 현재 사용되지 않는 ZEDSVOManager 구성 요소에 의해 처리되었습니다.

스트리밍:

다른 장치가 입력으로 사용할 수 있도록 ZED의 비디오를 브로드캐스트할 수 있습니다.

  • 스트리밍 출력 활성화 : 스트리밍을 활성화하려면 체크합니다. 앱을 실행하면 자동으로 시작됩니다.
  • 코덱 : 출력 비디오를 인코딩하는 데 사용되는 압축입니다.
  • Port : 스트림을 브로드캐스트할 포트입니다.
  • Bitrate : 한 번에 보낼 정보의 양. 설정이 낮으면 비디오 품질이 낮아지지만 네트워크에서는 더 쉽습니다.
  • GOP : 코덱의 최대 GOP 크기입니다. -1로 설정하면 제한이 제거됩니다.
  • 적응형 비트 전송률 : 성능에 따라 비트 전송률을 자동으로 높이거나 낮춥니다.

고급 설정:

  • 시작 시 페이드 인: ZED가 처음 연결되었을 때 나타나는 페이드 인 효과를 제거하려면 비활성화합니다.
  • 시작 시 스카이박스 회색: AR 장면에서 비현실적인 조명 효과를 유발할 수 있는 스카이박스에서 색상 및 색상 방출을 제거합니다. 통과형 AR과 같이 실제 환경이 가상 환경보다 더 두드러지는 경우 이 항목을 선택된 상태로 두십시오. 그린스크린 VR 캡처와 같은 가상 요소가 우세한 경우에는 이 기능을 끕니다.
  • Don't Destroy On Load: ZED 리그의 DontDestroyOnLoad 값을 설정하려면 활성화하여 장면을 변경할 때 파괴를 방지합니다.
  • 최종 AR 리그 표시: 통과 AR 모드에서 플러그인은 두 번째 숨겨진 AR 리그를 사용하여 헤드셋으로 전송되기 전에 이미지를 최종 조정합니다. 보기에 상당히 혼란스러울 수 있기 때문에 기본적으로 숨겨져 있지만 이 설정을 사용하면 고급 사용자가 이 리그를 관찰하고 수정할 수 있습니다. 자세한 내용은 아래의 ZEDMixedRealityPlugin을 참조하십시오 .
  • AR 레이어: 두 번째 AR 장비는 앞에 있는 캔버스만 ​​볼 수 있어야 합니다. 사용자가 쉽게 이해할 수 있도록 하기 위해 AR 리그의 쿼드 오브젝트를 여기에 지정된 레이어에 할당합니다. 이 레이어는 해당 리그의 카메라가 볼 수 있는 유일한 레이어입니다. 이것을 사용하지 않는 레이어에 할당하고 다른 개체를 넣지 않도록 합니다.

ZEDManager.cs 의 유용한 공용 멤버는 다음과 같습니다.

  • public event OnZEDManagerReady OnZEDReady: ZED 초기화가 완료된 후 실행되는 콜백입니다. 사용자가 무언가를 하기 전에 세상을 볼 수 있을 때까지 스크립트를 대기시키는 데 유용합니다.
  • public static ZEDManager GetInstance(sl.ZED_CAMERA_ID): 지정된 카메라 ID(1 - 4)에 연결된 장면의 ZEDManager 인스턴스를 반환합니다.
  • public static List<ZEDManager> GetInstances(): 장면의 모든 활성 ZEDManager 인스턴스를 반환합니다.
  • public Transform GetLeftCamera(): 리그의 왼쪽 카메라 구성 요소를 반환합니다. 오른쪽 카메라 대응물도 있지만 두 ZED 리그 프리팹(ZED_Rig_Mono 및 ZED_Rig_Stereo) 모두 왼쪽 카메라를 사용하므로 이 방법을 사용하는 것이 가장 좋습니다.

ZEDRenderingPlane.cs

ZEDRenderingPlane은 실제 세계를 표시하는 카메라 리그의 프레임 개체를 구성 및 업데이트하고 실제 이미지와 가상 이미지를 실제로 혼합하는 역할을 합니다. 일반적으로 상호 작용할 필요는 없지만 플러그인 기능의 중심이므로 역할을 아는 것이 유용할 수 있습니다. 그것이 하는 일의 세부 사항은 길고 복잡하지만 그 책임 중 일부는 다음과 같습니다.

  • 프레임/캔버스 개체의 적절한 크기 조정 및 위치 지정
  • ZED 카메라의 이미지/깊이 및 ZEDManager의 속성에서 프레임에 할당된 재료 생성
  • 사후 처리 적용
  • 이미지, 깊이 및 조명 정보를 실시간으로 업데이트

ZEDCamera.cs

ZEDCamera는 Unity와 ZED SDK 간의 기본 인터페이스이며 기본적으로 기본 Unity 래퍼에 대한 외부 호출로 구성됩니다. C++ SDK의 Camera.cpp 클래스를 기반으로 합니다. 단일 동작이 아니며 GameObject에 연결할 수 없습니다. 그것은 대부분 ZEDManager에 의해 처리되며 개발자는 일반적으로 그것과 상호 작용할 필요가 없습니다. 그러나 고급 사용자에게 유용할 수 있는 몇 가지 기능이 있습니다.

  • public int ImageWidth/ImageHeight: ZED 이미지의 해상도를 얻기 위해 사용합니다.
  • public Matrix4x4 Projection: 실제 카메라 자체의 프로젝션 매트릭스를 나타내는 프로젝션 매트릭스. ZEDRenderingPlane은 이를 Unity 카메라에 적용하여 ZED의 입력과 일치하도록 만들고, 미러링된 카메라를 추가로 만들기 위해 동일한 작업을 수행할 수 있습니다.
  • public Vector3 GetGravityEstimate(): ZED Mini를 사용하는 경우 IMU를 사용하여 다운된 방향을 추정합니다.
  • public sl.ERROR_CODE RetrieveImage((sl.ZEDMat mat, sl.VIEW view, sl.ZEDMat.MEM mem, sl.Resolution resolution): 고급의. 사용자가 볼 수 있도록 지정된 보기의 "이미지" 버전으로 ZEDMat 인스턴스를 생성합니다. 예를 들어 VIEW.DEPTH를 전달하면 정밀도가 부족하지만 쉽게 볼 수 있는 그레이스케일 깊이 맵이 반환됩니다. ZEDMat의 IntPtr과 일부 변환을 사용하여 Unity 친화적인 Texture2D를 얻어야 합니다.
  • public sl.ERROR_CODE RetrieveMeasure(sl.ZEDMat mat, sl.MEASURE measure, sl.ZEDMat.MEM mem, sl.Resolution resolution): 고급의. RetrieveImage와 유사하지만 부정확하고 사용자가 볼 수 있는 버전 대신 측정된 값이 있습니다. 예를 들어 VIEW.DEPTH를 전달하면 뷰의 각 픽셀에 대한 깊이에 대한 float 배열이 반환됩니다. ZEDSupportFunctions.cs 의 정적 함수를 사용하여 개별 깊이 값을 검색하는 것이 종종 더 간단합니다 .

ZEDMixedRealityPlugin.cs

ZEDMixedRealityPlugin.cs 는 AR 통과 모드일 때 사용됩니다. 카메라가 보는 최종 이미지에 비디오 타임워프 대기 시간 보정을 추가하는 두 번째 카메라 리그(기본적으로 숨겨져 있음)를 생성하고 업데이트합니다. ZEDManager 는 자동으로 생성하며 변경할 이유가 거의 없지만 최종 출력을 이해하거나 사용자 지정 효과를 추가하기 위해 때때로 액세스할 수 있습니다.

ZED 리그와 마찬가지로 두 대의 카메라와 두 개의 쿼드로 구성됩니다. 쿼드는 리그에서 카메라의 출력을 유지합니다. 그러나 리그와 달리 쿼드는 카메라의 자식이 아닙니다. 머리를 돌리면 쿼드가 카메라 회전에 "고정"되는 대신 스크립트에서 ZED의 대기 시간에 따라 뒤를 따라갑니다. 최종 결과는 대기 시간에도 불구하고 현실 세계에서 보는 객체의 위치가 현실과 동기화된 상태를 유지한다는 것입니다. 이것은 불편 함을 크게 줄입니다.

런타임에 이 리그를 보려면 ZEDManager의 고급 설정에서 Show Final AR Rig를 활성화하십시오.

기타 유용한 스크립트

ZEDLight.cs

포인트, 스폿 또는 디렉셔널 라이트에 이 구성 요소를 추가하여 실제 세계를 비추도록 합니다. 방향성 조명의 경우 조명에서 활성화된 경우 실제 세계에 그림자도 추가합니다. 포워드 렌더링(기본 및 권장 설정)에서는 이러한 조명을 한 번에 8개만 가질 수 있습니다. 디퍼드 렌더링에서는 조명이 작동하기 위해 ZEDLight 구성 요소를 연결할 필요가 없으며 보유 개수에 제한이 없습니다.

자세한 내용은 여기를 참조하십시오 .

ZEDGreenScreenManager.cs

실제 세계에서 녹색 픽셀(또는 다른 지정된 색상의 픽셀)을 제거하여 깊이에 관계없이 배경이 보이도록 합니다. 3인칭에서 VR 사용자를 촬영하는 데 유용합니다.

ZEDGreenScreenManager는 ZED 리그 내의 카메라와 동일한 개체에 추가되어야 합니다. 그러나 작동하려면 리그에 대한 몇 가지 다른 변경 사항이 필요하므로 ZED_Rig_Mono를 수정하는 대신 ZED -> 예제 -> GreenScreen -> 프리팹 에서 리그 프리팹을 사용하는 것이 좋습니다.

  • 보기를 사용하면 렌더링 단계의 여러 단계를 볼 수 있으므로 다른 설정을 조정하는 데 도움이 될 수 있습니다.
  • 색상 은 빼는 색상을 정의합니다.
  • 범위는 제거하기 위해 선택한 색상과 픽셀이 얼마나 유사해야 하는지를 결정합니다.
  • 매끄러움으로 인해 모든 픽셀이 100% 또는 0%로 표시되는 대신 색상 범위 가장자리의 픽셀이 희미해집니다.
  • Clip White는 해당 설정보다 높은 알파 값을 가진 픽셀을 100% 알파로 설정하여 평활도 설정에서 노이즈를 줄이는 데 유용합니다.
  • Clip Black 은 Clip White와 반대이며 값보다 알파가 낮은 픽셀이 완전히 보이지 않게 합니다.
  • 침식은 전경과 배경 사이의 가장자리에서 픽셀을 잘라냅니다.
  • Despill은 전경 이미지에서 색상 값을 빼서 예를 들어 "덜 녹색"으로 보이게 합니다. 밝은 조명으로 인해 그린스크린의 색상이 실제 피사체에 번질 수 있기 때문에 유용합니다.
  • Enable Garbage Matte는 실제 픽셀이 표시되지 않는 테두리를 정의할 수 있는 새 창을 엽니다. 그린스크린이 전체 화면을 채울 만큼 충분히 크지 않은 경우에 유용합니다.
  • 구성 저장을 사용하면 인스펙터에서 설정을 저장 및 로드하여 다른 프로젝트에 로드하거나 다른 스튜디오 설정 간에 전환할 수 있습니다. 상대 경로(예: 기본값)는 에디터에서는 작동하지만 빌드에서는 작동하지 않을 수 있습니다.

여기에서 더 많은 문서를 찾아보고 여기 에서 ZED를 사용한 그린스크린 캡처에 대한 자세한 가이드를 확인하십시오 . 포함된 GreenScreen 샘플 장면도 참조하십시오.

ZEDPlaneDetectionManager

화면을 클릭하거나 화면 공간 좌표를 지정하여 실제 세계에서 평평한 표면을 감지할 수 있습니다. 하나를 찾으면 보이는 전체 표면을 물리학적으로 완성된 평면으로 즉시 전환합니다.

공간 매핑과 달리 평면 감지는 실시간으로 작동하므로 종종 실제 세계에 개체를 배치하거나 충돌하는 데 더 좋습니다.

사용하려면 빈 GameObject를 생성하고 여기에 ZEDPlaneDetectionManager 구성 요소를 추가합니다. 런타임에 창을 클릭하여 비행기가 있는지 확인합니다. 감지를 클릭하여 장면에서 바닥을 나타내는 평면을 확인할 수도 있습니다 .

  • 장면에서 볼 수 있음은 장면 창에서 평면을 볼 수 있는지 여부를 결정합니다.
  • 게임에서 볼 수 있음은 게임 보기에서 비행기를 볼 수 있는지 여부를 결정합니다. 비활성화는 충돌을 위한 평면만 원하는 경우에 유용할 수 있습니다.
  • 재질 재정의는 기본 와이어프레임 재질을 대체합니다.

지정한 재질로 생성된 평면에서.

  • Add Collider는 관리자가 생성된 평면에 Mesh Collider를 추가하여 충돌을 가능하게 합니다.

더 자세히 알아보려면 포함된 두 개의 평면 감지 샘플을 참조하세요.

ZEDControllerTracker

Oculus 통합 또는 SteamVR 플러그인이 설치되어 있는 경우 ZEDControllerTracker는 조정 가능한 작은 지연 후에 지정된 컨트롤러, 헤드셋 또는 Vive 트래커에 연결된 게임 오브젝트를 이동합니다. 이 지연은 ZED 이미지의 대기 시간과 일치하기 위한 것입니다. 이 구성 요소를 추가하면 Oculus/Vive 추적 시스템이 ZED보다 대기 시간이 짧기 때문에 가상 컨트롤러 개체가 실제 손보다 앞서 움직이는 효과가 수정됩니다.

  • 데이터 로드는 가져온 Oculus 또는 SteamVR 플러그인에 대한 정보를 검색하고 로드합니다. 이를 통해 두 가지에 불가지론적일 수 있습니다.
  • Device To Track은 실제 GameObject에 대한 참조 없이 연결할 추적 대상 개체를 지정합니다.
  • 대기 시간 보상은 추가된 대기 시간의 길이를 관리합니다.
  • SN Holder를 사용 하면 추적하려는 개체의 정확한 일련 번호를 지정할 수 있습니다. 이것은 자동으로 채워지지만 이를 사용하여 감지된 설정을 재정의할 수 있습니다.

예제는 DroneBattle 샘플의 레이저 총 또는 GreenScreen 샘플의 ZED 리그 홀더 오브젝트를 참조하십시오.

ZEDSupportFunctions.cs

ZED와의 여러 상호 작용을 단순화하는 많은 정적 기능을 포함하는 정적 클래스입니다. 기능은 다양하고 자세히 알아볼 가치가 있습니다. 몇 가지 주목할만한 예는 다음과 같습니다.

  • public static bool GetNormalAtPixel(Vector2 pixel, sl.REFERENCE_FRAME reference_frame, Camera cam, out Vector3 normal)지정된 화면 공간 지점이 주어진 실제 세계의 법선(방향)을 반환합니다.
  • public static bool GetForwardDistanceAtWorldLocation(Vector3 position, Camera cam, out float depth)현실 세계에서 단일 3D 포인트의 깊이를 확인할 수 있습니다.
  • public static bool HitTestAtPoint(Camera camera, Vector3 point, bool countinvalidascollision, float realworldthickness)가상 포인트가 실제 포인트와 "콜딩"되는지 확인합니다. 기본적으로 이것은 포인트가 실제 세계 뒤에 있다는 것을 의미하지만, realworldthickness를 지정하면 일정량만큼 실제 세계 뒤에 있는 충돌을 무시할 수 있습니다. 실제 세계에 대해 가상 발사체를 확인하는 데 유용합니다.
  • public static bool HitTestOnRay(Camera camera, Vector3 startpos, Quaternion rot, float maxdistance, float distbetweendots, out Vector3 collisionpoint)지정된 간격으로 라인을 따라 HitTestOnPoint()를 호출하여 Unity의 레이캐스트 기능을 에뮬레이트합니다. 개체 배치 및 빠르게 움직이는 발사체에 유용합니다.
  • public static bool SaveImage(RenderTexture rt, string path)지정된 RenderTexture를 .png 파일에 저장합니다. ZEDRenderingPlane 또는 Frame 개체에 RenderTexture를 지정하여 실제 세계의 사진을 찍습니다.

ZEDToOpenCVRetriever

Unity 패키지용 OpenCV를 사용하는 경우 장면에 이 구성 요소를 배치하면 ZED와 OpenCV의 인터페이스가 크게 간소화됩니다.

대부분의 공간 OpenCV 기능에 필요한 ZED의 수정된 카메라 매개변수에 대한 OpenCV 매트릭스를 자동으로 생성합니다. 그런 다음 이름이 지정된 다양한 이벤트를 구독할 수 있습니다 OnImageUpdated_<imagetype>. 여기서 는 <imagetype>ZED가 제공할 수 있는 이미지 형식(예: LeftRGBA또는 ) 입니다 LeftGrayscale. 그런 다음 새 ZED 이미지가 도착할 때마다 이 구성 요소는 ZED의 왼쪽 카메라 참조, 카메라 매트릭스 및 해당 이미지의 OpenCV 매트릭스가 있는 리스너와 함께 모든 이벤트를 배포합니다.

ArUco 샘플 장면에서 사용되는 ZEDToOpenCVRetriever의 예를 볼 수 있습니다. 여기서 ZEDArUcoDetectionManager는 GameObject를 보이는 ArUco 마커로 이동하기 위해 이를 구독합니다.

 

참고:

https://github.com/stereolabs/zed-unity

'Devices > ZED' 카테고리의 다른 글

ZED-X vs ZED  (3) 2023.04.27
ZED-Unity-Skeleton  (0) 2023.03.02
ZED - Study  (0) 2023.02.23
ZED - Get Started with ZED  (1) 2023.02.20
ZED installation  (0) 2023.02.20

댓글