
51분까지 다양한 ARKit, RealityKit의 예시들 나옴.
Immersive Experience에서는 window와 3D content를 포함한 UI가 당신 주변 어디던 나타나게 된다.
주변 환경은 여전히 보임으로써 이 또한 경험의 일부가 된다.
그리고 이 Fully Immersive Experience도 있는데, 한단계 더 나아가서 전체 세상을 덮게 된다.

window와 volume 모두 콘텐츠를 display 할 수 있는 영역이 정해져있다.

그래서 완전한 몰입된 공간을 만드려면 window 공간을 넘어서 콘텐츠들을 배치해야 한다.

그래서 Space를 만들게 되었다.

Space는 새로운 scene type으로 SwiftUI에서 Immersive Space라고 부른다.
이렇게 정의하고 언제든 열고 닫을 수 있다.

전체 앱에서는 단 하나의 single Space만 구성할 수 있다. 하지만 window나 volume 옆에 하나 이상의 Space를 추가해 기존의 앱을 확장할 수도 있다.
앱은 하나의 Space만 한번에 열 수 있다. 다른 Space를 열기 전에, 지금 열려있는 것을 닫아야한다.
이렇게 구성하면 clipping boundary 없이 rendering 되게 된다.

Space를 여는 것은 다른 scene type과 구별되게 하는 몇 가지 특별한 동작을 가능하게 한다.
여러 앱을 실행하면 같은 공간에 표시되어서 이를 shared space라고 부른다.
앱이 Immersive Space scene을 그리게 되면 Full Space라고 불리는 곳으로 진입하게 된다.

그러면 해당 앱만 유저에게 보이게 되고 방해 없이 콘텐츠를 표시하기 위해 다른 응용 프로그램들은 사라지게 된다.


그 후 space를 dismiss하면, 다른 앱들은 다시 나타나게 된다.
Immersive Space는 scene이기 때문에 고유 좌표계를 암시적으로 정의한다.
따라서 Space에 배치한 모든 것들은 space의 원점에 상대적으로 위치하게 된다.

그리고 Space가 처음 열릴 때 space의 Origin은 user 발 근처인 user 아래쪽에 위치된다.
ImmersiveSpace는 scene의 종류이기 때문에 view hierachy에 위치시킬 수 있다.

ImmersiveSpace는 어떠한 SwiftUI view도 가질 수 있고 clipping bounds가 없지만 layout 경계 내에서 콘텐츠를 배치한다.
Space에 위치하는 어떤 것들도 이미 익숙한 layout system을 사용할 수 있다.
그러나 Space의 원점이 사용자의 발 가까이에 있기 때문에 컨텐츠를 아래로 내려놓는 것만 원하지는 않을 것이다.

SwiftUI, ARKit 및 RealityKit을 최대한 활용하고 싶다면, 새로운 RealityView의 강력한 기능과 함께 ImmersiveSpace를 사용하는 것이 좋다.
ImmersiveSpace와 RealityView는 함께 사용할 수 있으며, 탁월한 몰입감을 제공하는 데 필요한 모든 기능을 제공하도록 특별히 설계되었다.
예를 들어, RealityView는 asset을 비동기적으로 호출이 가능하다.

그리고 그 외에는
ARKit 앵커의 RealityView에 요소를 배치할 수도 있고,
앱은 space가 열려있는 동안 손과 머리 pose 데이터의 접근 권한을 얻기 때문에 이 데이터들을 RealityView내에서 entity를 배치하는데 사용할 수 있다.

RealityView는 콘텐츠를 표시하기 위해 RealityKit을 사용한다.
그래서 RealityView에 entity를 위치할 때, coordinate space 방향이 SwiftUI의 layout과 다름을 잘 인지하고 있어야 한다.
SwiftUI에서는 y가 아래, z가 당신쪽으로 나아간다. window, volume, Immersive Space에서 적용된다.

RealityKit에서는 y축이 위를 향한다.

RealityView와 관련해서는 이 영상을 봐라.

여기 Immersive를 더 추가해나갈 것이다.

일단 ImmersiveSpace를 정의한다.

WindowGroup과 동일하게 identifier, value type 혹은 둘 다를 할당할 수 있다. 이번에는 identifier를 할당하고, 나중에 Space를 열 때 이 identifier를 사용할 것이다.

SolarSystem view를 Space안에 위치시킨다.

앱에 시작화면 용으로 간단한 window도 추가했다.
이 window에는 버튼으로 만들어진 space를 열기위한 control도 포함되었다.


버튼을 누르면 title을 바꾸고 space를 열고 싶다.

window를 control하기 위해 SwiftUI는 openWindow와 dismissWindow를 environment action으로 제공하고 있다.
Immersive Space에 대해서는 openImmersiveSpace와 dismissImmersiveSpace가 추가되었다.
environment로 부터 두 action을 얻는다.

그리고 이 action들을 버튼이 불릴 때 사용한다.

Space를 Open할 때, 이전에 정의한 Identifier를 사용한다.

한번에 하나의 Space 밖에 열지 못하기 때문에 dimiss action은 아무 argument가 필요하지 않다.

시스템은 space에 들어가고 나갈 때 자동적으로 animation을 특정 duration동안 실행한다.
이 environment action은 async하기 때문에 animation의 완료에 대해 대응 할 수 있다.
Immersive space를 여는 것은 실패할 수도 있고, openImmersiveSpace는 result를 통해 fail인지 sucess인지 알려준다.

다시 app 정의 부분으로 돌아가서 window도 추가해준다.
이 두 scene의 순서를 보면 LaunchWindow가 scene들 중 첫번째로 위치해 있다. 따라서 SwiftUI는 launch window를 앱이 시작할 때 보여주고 Immersive Space는 시작할 때 보여지지 않고 버튼이 눌릴 때만 보이게 된다.

시뮬레이터로 보면 이렇게 된다.
지금까지 standard window를 포함한 Multiscene app를 만들었다.

최상의 유저 경험을 위해서 새로운 Model3D와 RealityView API들을 활용해서 3D asset들을 비동기적으로 호출할 수 있게 해라.

이 경우에는 모델이 로딩 중일 때 텍스트를 표시해줬다.

그리고 무언가가 잘못되었을 때 에러케이스를 보여준다.

앱을 Immersive Environment로 전환하려면 scene phase를 통해 시스템과 함께 공간을 관리하고 공간과 다른 장면 간의 융합을 조정하며 다양한 스타일로 표시해야 한다.

SwiftUI의 다른 scene type과 유사하게, Immersive Space도 시스템에 의해 handle되는 scene phase를 지원한다. 이것은 또한 Space는 SwiftUI의 scene phase 중 하나라는 것을 의미한다.
Space를 열게됨으로써 active phase가 된다. 그리고 언제든지 비활성 단계로 변경될 수 있다.

예를 들어, 시스템이 정의한 경계 밖으로 나가게 되거나 시스템 경고가 뜨면 Space와 Window가 일시적으로 숨겨지고 비활성 상태로 옮겨진다.

유저가 다시 experience로 들어가게 되면 space와 window들은 다시 보여지게 되고 다시 활성 상태로 업데이트 된다.

state가 변경된 걸 나타낼 수 있게 비활성 상태일 때 모델의 크기를 줄여보자.

alert이 나올 때 비활성화 상태를 확인 할 수 있다.

alert을 제거하면 다시 이전 상태로 돌아온다.

space을 관리하는 또 다른 좋은 방법은 다른 창의 콘텐츠를 space와 통합하는 것이다.
예를 들어, 지구 모델의 위치를 main window 옆으로 조정하고 싶다면 우리는 Immersive Space 좌표 시스템에서의 window의 위치를 알아야 한다.


하지만 두개의 물체는 그들의 좌표 시스템을 정의하고 있다.

그래서 이를 해결하기 위해서 SwiftUI는 Immersive Space라고 불리는 새로운 좌표 공간을 제공한다.
그리고 이는 Immersive Space의 좌표 시스템을 나타낸다.
이 좌표 시스템에 접근하기 위해서는 window의 Geometry Reader를 3D context로 캡슐화해야한다.
그러면 transform과 같은 coordinate 공간을 가지고 있는 기존 API를 이용하여 Immersive Space 타입을 제공하면 새로운 좌표계에서 proxy.transform을 얻을 수 있다.
이 transform을 사용해서, tap을 하면 지구의 위치를 바꿀 것이다.

tap하면 window 앞에 지구가 배치된다.

coordinate conversion을 통해 우리는 Space와 window 사이에서 쉽게 원하는 곳에 콘텐츠를 위치시키고 움직일 수 있다.
coordinate conversion을 사용하는 다른 경우는 SharePlay의 Emmersive Spaces가 포함된다. 이를 통해 개인 Immersive Space 뿐만 아니라 그룹 Immersive Space에서도 콘텐츠의 위치를 관리할 수 있다.


만약 앱이 SharePlay와 Group Immersive Space를 지원한다면, 다른 참가자가 합류하면 시스템은 spatial template에 의해 정의된 shared location으로 원점을 움직인다.
더 많은 정보는 아래의 영상을..

Immersion Style은 space 콘텐츠가 주변 환경을 어떻게 장악할 수 있는지에 대한 다양한 프레젠테이션을 제공한다.

지금은 defaut style인 mixed인 상태이다.

스타일을 변경하는 것은 쉬우며 이를 다이나믹하게 할 수 있다.

scene의 modifier로 immersion style을 추가하고, Space가 제공했으면 하는 것들의 list를 제공한다.
current style을 참조하기 위해 state 변수를 binding으로 넘긴다.

binding으로 넘기면 current style을 읽는 것도 가능해지고 컨트롤이 가능해진다.

그래서 이런 식으로 maginfy gesture를 추가하는 것도 가능해진다.

어떻게 나타나는지 보여주기 위해 이번에는 실기기로 보여주겠다.
mixed 스타일로 기본적으로 space를 open 한 상태다.

Maginfy를 통해 콘텐츠가 커지면 Progressive style로 바뀐다. 이 스타일은 passthrough와 fully immersive experience의 중간 상태이다.
앞에 있는 포털 내의 Immersive Space 콘텐츠와 주변 환경을 볼 수 있다. 이 스타일은 꽤 몰입감이 느껴질 뿐 아니라 자신을 둘러싼 것을 알 수 있게 해wns다. 또한 주변 사람들과 대화할 수 있고, 편안하기 위해 어디에 앉아야 하는지 알 수 있으며, 주변 환경과 상호 작용할 수도 있다.

그리고 디지털 크라운을 돌려서 몰입도를 조절할 수도 있다.

하지만 만약 full immersion을 항상 경험한다면 다른 세상으로 잠깐 다녀온 듯한 경험을 주기에 너무 좋다.

디지털 크라운을 눌러서 experience를 떠나 passthrough로 언제든 돌아갈 수 있다.

장치의 공간 컴퓨팅 기능은 공간을 더욱 흥미롭게 만들기 위해 공간을 쉽게 확장할 수 있게 해준다.

앱을 시작함과 동시에 immersive experience를 제공하고 싶다면 scene manifest를 configure하는게 필요하다.

이렇게 셋팅하면 된다.

평소처럼 Space 컨텐츠를 첨부하면 바로 열리고 사용자가 Space를 닫는 경우 앱을 다시 창으로 돌아가도록 할 수 있다.

surronding effect preference는 passthrough를 어둡게 만들 수 있다.
이렇게 하면 주변을 자동적으로 어둡게 만들 수 있다.

upperLimbVisibility modifer를 통해서는 space가 fully immersive 상태에서 손을 숨길 수 있다.

또한 upperLimbVisibility preference도 바꿔서 가짜 손을 추가할 수도 있다.

entity를 정확히 위치시키기 위해 ARKit과 HandTracking API를 사용한다.

그리고 hand tracking system도 사용한다.

그리고 손 위치에 asset들을 정확히 위치시킨다.


SpaceGlove도 포함 시킨다.

ARKit에 대해 더 많은 정보가 필요하다면 Evolve your ARKit app for spatial experiences를 봐라.
가상 장갑 추가됨.

