

기본적으로 앱은 Shared Space에서 실행된다.

이 환경에서 앱들은 Mac desktop처럼 side-by-side로 존재하게 된다.
그리고 사람들은 그들의 passthrough를 통해 여전히 주변과 연결된다.
각각의 앱은 하나 이상의 window를 가진다.

이것은 SwiftUI scene이며 보통의 macOS window처럼 크기를 조정하거나 움직일 수 있다.
여기엔 3D 콘텐츠 뿐만 아니라 기존의 뷰와 컨트롤들을 추가할 수 있다.

볼륨은 다른 앱들과 공간을 함께 사용하며, 3D 콘텐츠를 정해진 범위 안에서 표시할 수 있다.
볼륨은 3D 콘텐츨르 보여주기에 최고다.
사람들은 볼륨의 위치를 조정할 수 있고, 다른 각도로 살펴 볼 수도 있다.
볼륨은 SwiftUI scene이고, 3D 콘텐츠를 그려내기 위해 RealityKit의 장점을 사용하고 있다.
비디오를 보거나 게임에 집중할 때와 같이 immersion 정도에 대한 더 많은 control을 가지고 싶을 수 있다.

이럴 때 윈도우, 볼륨, 3D 물체들이 뷰 전체에 나타나는 유일한 것들이 되는 Full Space를 열면 된다.
Full Space에서는 Hand Tracking을 더 정교하게 사용하는 등 ARKit을 사용할 수도 있다.
앱에서는 Full Space를 다양한 방법으로 사용 할 수 있다.

passthrough를 통해 콘텐츠를 실세계에 배치하고, 사용자가 여전히 주변과 연결되게 할 수 있다.
그리고 공간 음향이나 RealityKit을 통해 3D를 렌더링하면 Vision Pro가 계속해서 주변의 시각적인 요소와 소리를 사용자의 주변과 blend하기 위해 방의 구조를 이해하여 업데이트 하는 것에 대한 이점을 자동적으로 경험할 수 있고, 이를 통해 가장 물체가 실제 사용자의 방에 있는 것처럼 느끼게 만든다.
또한 전체 화면을 채우기 위해 fully-immersive space로 render하는 것을 선택할 수도 있는데, 이는 가상 물체에 대한 불빛을 조절하고 오디오 특성을 선택하는 등 앱에 창의적인 요소를 추가할 수 있는 유연함을 제공한다.

이들은 spatial computing의 foundational elements들이다.

visionOS에서는 눈과 손을 통해서 앱과 상호작용 할 수 있다.

또한 사람들은 직접 터치할 수도 있다.

tap, long press, drag, rotation, zoom 등과 같은 다양한 제스쳐들이 가능하다.
시스템은 자동적으로 제스처를 인지하며 앱에 touch event를 생성한다.
제스쳐는 SwiftUI와 잘 작동하며 같은 gesture API는 ReailityKit entity에 대해서도 잘 작동한다.
이는 사람들이 3D scene element와 쉽게 직접적으로 interact 할 수 있게 만든다.
사람들이 볼링 게임을 할 때, 가상의 장갑을 끼게 만들고 싶다면 ARKit의 Skeletal Hand Tracking을 이용 할 수도 있다.

Tap과 Direct Input으로 블럭 쌓고 무너뜨리는 영상
visionOS는 자동적으로 키보드, 트랙패드, accessibility hardware와 같은 wireless 장비의 입력을 받아들인다.
그리고 Game Controller framework는 무선 게임 컨트롤을 도와준다.
Collaborating과 exploring은 공간 컴퓨팅의 중요한 부분이고, 이것에는 SharePlay와 Group Activitites framework를 사용한다.
사람들은 visionOS에서 macOS처럼 모든 window를 공유할 수 있다.
사람들이 Quick Look 3D model을 공유할 때 방향, 크기, 애니메이션을 공유자들 간에 동기화 할 수 있다.

사람들이 뭔가 보이는 것으로 collaborate할 때 모두가 같은 경험을 가진다는 것은 SharePlay에서 매우 중요하다. 이를 통해 사람들은 물리적으로 같이 있는 것 같다는 느낌을 강화할 수 있다.

shared context라는 개념을 system에 추가했다.
이를 통해 system은 사용자를 위해 shared context를 관리하여 참가자들이 같은 경험을 가질 수 있게 해준다.

사람들이 콘텐츠를 더 개인화하여 사용할 수 있게 Spatial Persona Template를 사용할 수도 있다.
추가적인 학습이 필요하다면, 아래의 비디오를 보도록.

privacy는 visionOS design guide의 핵심 원칙이다. 또한 API를 통해 디바이스의 많은 기능을 이용할 수 있게도 해준다.
센서에서 직접 앱의 데이터에 접근하기 보다는 시스템이 앱에 event나 visual que를 통해 해당 정보를 제공해준다.
예를 들어, 시스템은 눈의 위치와 손의 제스쳐를 알지만 이를 터치 이벤트로만 전달한다.
또한, 시스템은 view를 볼 때 hover effec를 제공하지만, 그 위치를 알려주진 않는다.
대부분 시스템에서 제공된 행동들은 인터렉션에 반응하기에 충분할 거지만, 더 민감한 정보에 접근이 필요하다면 시스템은 사람들에게 permission을 먼저 받는다.
벽과 가구를 인식하거나 손을 인식하는 경우 등에 말이다.

그럼 앱은 어떻게 만드냐?
당연 Xcode 가지고 만든다.
preview canvas는 에니메이션과 custom code를 포함한 RealityKit 코드를 시각화 하기 위한 3D를 지원한다.

Xcode Preview는 3D layout을 빠르게 볼 수 있는 object mode를 가지고 있다.
이를 통해 object가 view의 bound안에 잘 들어가는지 확인 할 수 있다.

preview가 앱을 실행하기 전에 layout을 볼 수 있는 좋은 방법이라면, Simulator는 interactivity를 확인해보기 좋은 방법이다.
키보드나 마우스, 게임 컨트롤러를 통해 씬 안에서 움직이거나 주변을 둘러볼 수 있다. 그리고 simulated system gestur를 통해 앱과 쉽게 상호작용할 수 있다.
시뮬레이터에는 세가지 시뮬레이터 신이 있고 각각은 낮과 밤 모드가 있다.

또한 Xcode에서는 디버깅시에 볼 정보들을 선택할 수도 있다. 이 정보들은 시뮬레이터 뿐만 아니라 기기에서도 활용할 수 있다.

Xcode에 포함된 강력한 퍼포먼스 분석 툴이다.
Instruments15에는 RealityKit Trace가 포함되었다.

RealityKit Trace 템플릿에는 GPU, CPU, system power impact를 개발자가 이해하고 퍼포먼스 핫스팟을 식별할 수 있도록 하는 instruments가 있다.
frame 병목지점을 손쉽게 관찰하고 이해하여 시뮬레이션 된 RealityKit 엔티티의 숫자나 제출된 triangle 수와 같이 필수 지표까지 거슬러 추적할 수 있다.

이는 잠재적인 퍼포먼스 이슈를 쉽게 찾고 다루게 한다.
더 많은 정보는 여기서 보도록.

새로운 developer tool.
3D contents를 미리보고 준비할 수 있게 해준다.
Reality Composer Pro는 모든 어셋과 이게 scene에 어떻게 맞게 들어가는지 overview를 가능하게 해준다.
새롭게 RealityKit에 particle을 추가하여 Reality Composer Pro에서도 확인이 가능하다.

오디오를 추가하여 오브젝트와 연관 짓는 것도 매우 쉽다.
공간적으로 오디오를 미리 볼 수 있고 이는 전체 scene의 모양과 맥락을 고려한다.

대부분의 virtual object는 RealityKit의 Physically-based material을 실세상의 다양한 material을 표현하기 위해 사용한다.
RealityKit은 sensor data를 사용하여 실세계의 빛 정보를 이러한 material에 제공해주고 사람들의 주변 환경에 고정시킨다.
RealityKit에는 앱의 공통 시나리오에서 사용할 수 있는 표준 머터리얼 두 개를 가지고 있다.
특정 요구가 있을 때 창의적인 의도를 전달하기 위해 공개 표준 MaterialX와 함께 Reality Composer Pro에서 커스텀 머티리얼을 쓸 수 있다.
코드를 만지지 않고서도 노드 그래프를 사용하고, 빠르게 viewport에서 결과를 미리 볼 수도 있다.

더 학습하고 싶다면 아래 영상 보기.

3D 콘텐츠에 대해 좋다는 생각이 들면, 기기로 scene을 보내서 바로 테스트 할 수 있다.

더 많은 것은 아래 영상을 봐라.

또 다른 가능한 옵션은 Unity가 있다.
Unity에서는 공간 컴퓨팅을 위한 앱을 아무런 플러그인 추가 없이 친숙한 workflow로 만들 수 있다.
존재하는 콘텐츠를 가져와서 새로운 몰입 경험을 제공해 줄 수 있다.
더 학습하고 싶다면 아래의 영상을 봐라.

만드는 것에는 두 가지 방법이 있다.

새로운 앱 템플릿을 활용한다.

앱 템플릿에는 새로운 두가지 옵션이 존재하는데, 첫번재는 Initial Scene Type을 윈도우나 볼륨으로 고를 수 있다.

두번째 옵션은 immersive space의 진입 포인트에 대한 것이고, 기본 값은 Shared Space이다.
Immersive Scene Type을 Space로 선택하면 두번째 scene이 앱에 추가된다.

더 학습하고 싶다면 아래의 영상을 봐라.

3D 비디오와 공간 음향과 결합된 shared, immersive playback experience를 어떻게 만드는지에 대한 영상
custom hand gesture를 포함한 게임.
다른 visual mode에 따른 3D globe 전환을 보여준다.

아이패드와 아이폰 앱은 보기 좋게 적용된다.
앱이 아이패드를 지원한다면 아이폰 앱을 지원한다 하더라도 아이패드 지원 앱이 아이폰보다 선호 될 것이다.
아이폰과 아이패드와는 달리 이 플랫폼은 자체적인 다크 모드가 있다.

앱을 회전시킬 수도 있다.

더 학습하고 싶다면 아래 영상을 봐라.

destination 추가 매우 쉽다.

Hello world를 실행하면 Shared Space에서 윈도우 형태로 시작된다.

하나 이상의 윈도우를 Shared Space에 배치함으로써 사람들이 현존감을 느끼게 할 수 있다. passthrough를 볼 수 있으며 side by side로 다른 앱들을 선택할 수 있다.

혹은 immersion level을 높여서 앱이 모든 공간을 사용하게 만들 수 있다.

앱을 설계할 때 가장 적절한 element를 찾는 것은 가장 중요한 고려사항이다.
윈도우는 앱의 시작점의 역할을 한다.
SwiftUI의 scene을 이용하고, 기존의 뷰와 컨트롤을 사용한다.
2D와 3D 콘텐츠를 섞는 것을 지원하고, 윈도우는 공간 내에서 크기 조절과 위치 조절이 가능하다.

Window를 만드는 것은 매우 쉽다. scene에 WindowGroup을 추가하면 된다.

Model3D를 활용하여 3D 콘텐츠를 추가할 수 있다.
image와 비슷하며 쉽게 로딩할 수 있으며, RealityKit에 의해 랜더링 된다.

이 3D 콘텐츠에 인터랙션을 추가할 수 있다.
인터랙션은 기본적으로 내재되어 있고 SwiftUI를 통해 활용할 수 있다.
SwiftUI는 기존에 다른 플랫폼에서도 사용되었던 제스쳐 recognizer를 제공한다.

새롭게 추가된 제스쳐는 아래와 같다.

인공위성에 제스쳐를 추가해보자.

값을 update closure로 전달하여 인공 위성을 움직일 수 있게 된다.

볼륨은 window의 확장이며, 새로운 스타일의 윈도우다.
2D와 3D 콘텐츠를 포함한 다양한 SwiftUI 뷰를 호스트 할 수 있다.
비록 볼륨을 Full Space에서 사용할 수도 있지만, 실제로는 Shared Space에 구축되어 콘텐츠는 볼륨 영역 내에 위치되어야 한다.
Shared Space에 있기 때문에 윈도우와 함께 존재할 수 있다.

volume을 추가하려면 새로운 windowgroup을 생성하고 윈도우 스타일을 volumetric으로 설정해야 한다.
그리고 defaultSize를 줘야할 수도 있다.

볼륨의 단위는 point나 meter로 설정할 수 있다.

볼륨은 사람 바로 앞에 위치하게 된다.
더 많은 콘텐츠를 추가하고 다양한 행동들을 추가하고 싶다면 RealityView를 활용해라
RealityView는 새로운 뷰이며, 몇 개의 entity던 SwiftUI 내에서 직접 관리를 가능하게 한다.
SwiftUI와 RealityView는 SwiftUI의 managed state와 entity property와 연결되며 쉽게 통합 가능하다.
이를 통해 앱의 데이터 모델의 source of truth과 함께 3D 모델의 동작을 이글어내는게 쉬워진다.
RealityView에는 변환 함수가 있어 좌표 공간 사이의 전환이 쉽다.
또한 RealityView의 Attachment를 통해 SwiftUI 요소를 3D 씬에 배치할 수 있는 방법을 제공한다.

사용하려고 하는 RealityView initializer는 세가지 매개변수가 있다.
make closure, update closure, attachments viewbuilder.
make closure에서는 entity를 만들고 해당 entity를 root entity에 붙일 수 있다.

update closure는 뷰의 state가 바뀔 때 마다 호출된다.

Attachment clousre에서는 RealityView가 뷰를 entity로 translate 하게 해주는 tag 프로퍼티가 있는 SwiftUI 뷰를 추가할 수 있다.

Attachment를 추가할 때는 SwiftUI를 RealityView의 Attachment clousre에 넣어주기만 하면 된다.

각각의 Attachment에는 이름을 부여하는 tag를 추가해야 한다.

Attachment를 표시하기 위해서는 update closure를 이용하여 추가해준다.

이처럼 RealityKit을 활용하면 강력한 기능을 사용할 수 있다.

RealityKit에 대해 더 알고 싶다면 아래의 영상을 봐라


앱이 완전한 Full Space로 오픈 된다면, 시스템은 모든 다른 앱들을 숨기고 your app만 보여주게 된다.
앱의 윈도우, 볼륨 등의 콘텐츠를 당신 주변 어느곳에나 배치가능하다.
ARKit과 RealityKit을 통해 virtual content는 주변과 상호작용이 가능해진다.
그리고 Hand tracking을 통해 커스텀된 제스쳐와 인터렉션을 만들거나 사람들의 손 위에 콘텐츠를 배치할 수도 있다.

더 알고 싶다면 아래 영상 고고

Space에서는 만들 때 어떤 스타일을 선택했는지에 따라 몰입 정도를 다르게 제공할 수 있다.

Immersion Style은 Full Space로 전달되는 매개변수다.

기본적으로 .mixed와 .full이 있다.

mixed sytle은 passthrough위에 app content를 layering한다. 이것이 immersion space의 기본 값이다.
full style은 passthrough를 숨겨 콘텐츠만 보여준다.
.progressive를 사용하면 두 가지를 결합할 수도 있다.

이 스타일은 초기에는 passthrough를 허용하지만, 디바이스 상단의 digital crown을 통해 완전한 몰입이 될 수도 있다.
mixed일 때

Full일 때

