2024.02.14
macbook m1 air sonoma14.3.1 Updated
xcode 15.2 Updated
Product Name : 프로젝트 이름
Initial Scene : Window / Volume
( 윈도우는 2D평명 / 볼륨은 3D 입체 )
RealityKit : 3D AR 렌더러를 포함
Apple에서 개발한 고수준 3D 렌더링 프레임워크
Metal 렌더러를 기반으로 하지만, 사용하기 더 쉽고 빠르게 3D 씬을 만들 수 있도록 설계
AR 애플리케이션 개발에 특화
물리 기반 렌더링, 애니메이션, 사용자 상호 작용 등을 지원
초보 3D 개발자에게 적합, 빠르게 프로토타입을 제작하거나 간단한 AR 경험
Metal : GPU 가속
Apple에서 개발한 저수준 그래픽 API
GPU를 직접 제어하여 높은 성능을 제공
더 많은 제어권과 유연성을 제공하지만, 더 복잡하고 전문 지식이 필요
3D 그래픽, 게임, AR/VR 애플리케이션에 적합
Mixed: 가상 가구 시뮬레이션, 실내 탐색 AR 앱, 교육용 AR 경험
Progressive: 간단한 3D 게임, 제품 시각화 앱, 프로토타입 제작
Full: 고품질 3D 게임, VR 체험, 몰입형 시뮬레이션
Mixed Immersive Space는 가장 강력하고 유연한 옵션이지만, 개발 과정이 가장 복잡
Progressive Immersive Space는 초보 개발자에게 적합하지만, Mixed Immersive Space만큼 몰입감이 높지는 않음
Full Immersive Space는 가장 몰입감 있는 경험을 제공하지만, 높은 수준의 기술적 전문 지식이 필요
기본 코드를 보면서...
ContentView() : 2D 공간
ImmersiveView() : 3D 공간
< ContentsView 코드를 살펴보기 >
Button("Of course") {
//perform action
}
//원하는 버튼의 이름을 적고 만들 수 있음 심플함.
xcode 상에서 미리보기가 상당히 빠르군 ( 즉각 반응 함 )
토글 내용 분석
Toggle("Show Immersive Space", isOn:
$ShowImmersiveSpace)
.toggleStyle(.button)
.padding(.top, 50)
// 이런식으로 쓰는데 점으로 속성값 입력하는 방식인거 같구
// 토글에 isOn 속성에 $로 실행할 함수 연결하는거 같고
// 토글의 스타일은 버튼의 스타일로 하는거 같구
// 토글 주변으로 특히 위쪽으로 50정도 공간을 띄우는 방식임
// 직관적인듯
.onchange(of: showImmersiveSpace ) {_, newValue in Task { ... } }
// 위의 호출로 onchange 여기에 함수가 반응하는 것으로 보임
// 아... 그안에 openImmersiveSpace 와 dismissImmersiveSpace 가 있군
// immersiveSpaceIsShown 이라는 변수를 true, false로 토글해주는 거군
// .onchange 를 @State 마크가 된 어떤 변수의 변화를 관찰하고 싶을때
// 사용하면 되는구만 ( 아.... setState 같은 효과 구만 )
// 상태변수는 @State 이거만 붙여주면 되는겨? 재밌군 ㅎ
VStack { Model3D(...) Text(...) Toggle(...) }
// VStack 이라는 위젯 안에 쌓는 느낌이구만 vertical Stack 이겠지...
// 처음쓴거가 위쪽에 위치하고 차례대로 아래로 쌓인다.
// 중앙정렬 됨
// Flutter 의 Column 같은 느낌
VStack { }.padding().onChange(...)
// 구조를 좀 파악해보자
import RealityKitContent
struct ContentView: View {
var body: View {
VStack {
Model3D()
Text()
Toggle()
}
}
}
// 이런 식인거 같다.
시뮬레이터를 작동시킨 후 Show Immersive Space 를 누르면 창 공간에 2개의 스피어가 생겨남 심플함
비전OS앱을 실행하고 최초의 뷰는 ContentView 대신에 내가 만든 View 를 넣으면된다.
body안에는 ContentView 와 ImmersiveView 가 정의됨
imort SwiftUI
import RealityKit
import RealityKitContent
//load in a Entity named Immersive from realityKitContentBundle
// entity is just an object in a game
// ( GameObject in Unity, Actor in Unreal )
// ContentView 에서의 Model3D와 같은 결과이지만 다른점은??
// Model3D 는 RealityKit 을 사용하지 않음
struct ImmersiveView: View{
var body: some View {
RelityView { content in
if let scene = try? await Entity(named: "Immersive",
in: realityKitContentBundle) {
content.add(scene)
}
}
}
}
#Preview {
ImmersiveView()
.previewLayout(.sizeThatFits)
}
xcode > open developer tool > Reality Composer Pro
Open existing, 현재 프로젝트를 찾아서
Packages > RealitikyContent > Package.realitycomposerpro 를 엽니다.
거의 유니티 같은 창이 뜸
2개의 스피어가 나란히 놓은 그리드가 보임 ( immersive 에 보일 오브젝트들 )
material 폴더에 GridMaterial.usda
Scene.usda : 이건 ContentView() 에서 로드한건가
Immersive.usda : 이건 ImmersiveView() 에서 로드한건가
이렇게 구성되어있음
언리얼 처럼 WASD + QE(상하) 다 됨
아 named 로 이름으로 Entity 와 Model3D 로 부르는거구나