목차
- visionOS만의 다양한 인풋들
- SwiftUI와 RealityKit
- visionOS 에서의 2D 앱 -> 3D 앱
- 몰입감을 위한 SharePlay 경험 만들기
- 세션에 참여하면서 느낀 점
visionOS만의 다양한 인풋들
visionOS는 공간컴퓨팅을 위한 OS로 다양한 인풋 유형이 있었습니다. 기존에 웹 개발이나 모바일 어플리케이션을 개발하면서 사용하던 인풋 외에 제스처, 트랙패드, 호버 이펙트 등 많은게 생겨서 신기하네요
3D Entity와 상호작용하는 방법
제스처를 통해 3D 엔터티를 제어할 수 있는데, .targetedToAnyEntity() 라는 API를 통해 대상으로 하는 엔터티를 정할 수 있었습니다.
드래그앤 드롭
서로 다른 윈도우에 떠있는 내 앱과 다른 앱 사이에 데이터를 주고 받을 수 있었습니다.
DropDelegate와 Transferable 를 채택하여 구현한다고 합니다.
한번 상상해보면 눈에 보이는 클립보드 앱을 만들어 다른 앱에서 링크를 복사하거나 텍스트를 복사해 내 클립보드 앱에 가져올 수 있겠네요
호버 이펙트
상호작용이 가능한 콘텐츠는 호버이펙트를 통해서 하이라이트 시킬 수 있습니다. 이는 사용자의 반응성을 이끌어내기에 매우 중요합니다.
따라서 모든 시스템 컨트롤에는 추가되어 있습니다. 만약 커스텀 UI 컴포넌트를 만든다고 하면 호버 이펙트를 추가하는 것을 적극 추천한다고 합니다.
호버 이펙트 없이 사용하는 것을 비유하자면 마우스 포인터가 안보이는 상태로 웹을 탐색하는 것과 같다고 하네요ㅋㅋㅋ
아 그리고 사용자의 시선을 모두 트래킹하는 건 개인정보 침해에 해당되어 모두 트래킹 할 수는 없다고 합니다!
SwiftUI와 RealityKit
SwiftUI와 RealityKit 통합하기
SwiftUI 와 RealityKit을 통합하려면 RealityView라는 API를 통해 전달해주어야 합니다.
import SwiftUI
import RealityKit
struct ContentView: View {
var body: some View {
RealityView { content in
// ...
}
}
}
좌표계의 차이
SwiftUI와 RealityKit의 다른 점중 하나로 좌표계가 다르다는 게 있습니다.
SwiftUI에선 Y가 증가하면 아래로 가지만, RealityKit에선 Y가 증가하면 현실세계와 같이 위로 올라갑니다.
아무래도 기존엔 모바일이나 웹 환경을 위해 개발을 하니까 편의상 Y가 증가하면 아래로 내려갔지만, RealityKit은 현실세계를 기준으로 한게 느껴졌습니다.
update 방식
import SwiftUI
import RealityKit
struct ContentView: View {
@Environment(ViewModel.self) var viewModel
var body: some View {
RealityView { content in
// RealityView가 생성될 때 한번만 호출
} update: { content in
// SwiftUI State가 변경될 때 업데이트. 매 프레임 호출되는 것이 아님!
}
}
}
attachments
attachments는 SwiftUI View를 3D공간에 띄우는 걸 말하는 것 같습니다.
import SwiftUI
import RealityKit
struct ContentView: View {
@Environment(ViewModel.self) var viewModel
var body: some View {
RealityView { content in
// ...
} update: { content in
// ...
} attachments: {
// 여기서 추가할 수 있습니다
}
}
}
visionOS 에서의 2D앱 -> 3D 앱
이 파트에선 모범 사례들을 설명해주었는데요.
2D앱을 3D앱으로 컨버팅하려면 Volume이란 것을 추가해야 한다고 합니다.
그리고 3D앱을 만들 때 너무 어렵게 생각하지 말고 필요한 부분에만 3D를 적용해도 괜찮다고 합니다.
예를들어 쇼핑몰 앱을 개발한다고 했을때, 모든 부분을 3D로 만들 필요는 없이 상품을 보여준다거나 필요한 부분에만 3D를 적용해도 임팩트를 줄 수 있다고 하네요.
아래 예시는 발표 자료를 공유할 수 없어 기본 환경으로 보여드리지만, 바둑판 오브젝트를 3D공간에 맞게 배치하고 싶다면 transform3DEffect() API를 사용해 오브젝트를 회전 시켜 공간에 맞게 배치할 수 있다는 점을 보여드리고 싶었습니다.
import SwiftUI
import RealityKit
import RealityKitContent
struct ContentView: View {
var body: some View {
VStack {
Model3D(named: "Scene", bundle: realityKitContentBundle)
.padding(.bottom, 50)
Text("Hello, world!")
}
.padding()
}
}
import SwiftUI
import RealityKit
import RealityKitContent
struct ContentView: View {
var body: some View {
VStack {
Model3D(named: "Scene", bundle: realityKitContentBundle)
.padding(.bottom, 50)
Text("Hello, world!")
}
.padding()
.transform3DEffect(AffineTransform3D(
rotation: Rotation3D(angle: .degrees(90),
axis: .x)))
}
}
모델링을 가져오기
RealityComposer 라는 프로그램을 통해 .usd 확장자의 모델링 파일을 만들어 SwiftUI View Hierachy에 추가할 수 있다고 합니다.
몰입감을 위한 SharePlay 경험 만들기
SharePlay의 좋은 예시는 아래 사진처럼 친구나 연인과 함께 내가 보고 있는 화면을 공유해 영화나 컨텐츠를 같이 보면서 즐기는 경험이 있습니다.
가장 신기하고 재밌던 부분은 사용자간의 시각적인 일관성을 위해 Templates 라는 API를 적용한 부분이었습니다.
단순하게 화면 공유의 개념이 아니라 실제로 내옆에서 같이 윈도우 또는 오브젝트를 보고 있다는 느낌을 주기에, visionOS에서 강조하고 있는 '몰입'과 딱 맞아 떨어지는 경험이지 않을까 싶습니다.
세션에 참여하면서 느낀 점
올해 2월 Apple Vision Pro 가 출시 되면서 시장 관심도도 높았고, 애플 생태계에 있는 개발자로서 내 미래 플랫폼이 될수 있지 않을까? 라는 생각이 들어 관심이 많았습니다. 그러던 중 파트 1, 2는 놓쳤지만 파트 3를 알게 되었고, 듣고 나니 '생각보다 쉽게 개발할 수 있겠는데?' 싶었습니다.
SwiftUI로 공간 컴퓨팅을 할 수 있다니.. 그저 빛
확실히 애플답게 SwiftUI로 3D환경을 구성할 수 있도록 API들을 잘 정의해둔 것 같았고, 다른 걸 떠나서 너무 재밌어보였습니다. 세션 자료는 비공개라서 비록 위 내용에는 못 담았지만, 태양계 앱, 3D 바둑 앱, 공간에 단풍이 흩날리는 효과 까지 화면 너머로 보는데도 몰입감이 장난 아니었습니다.
갖고싶네요 비전프로.. 약 4시간의 꽤 긴 세션이었지만 시간 가는 줄 모르게 본 것 같습니다.
다음 세션들도 기대가 되네요! 시간이 된다면 무조건 참여해야겠습니다ㅎㅎ