스트리밍은 대부분의 브라우저와
Developer 앱에서 사용할 수 있습니다.
-
iOS, macOS, visionOS용 RealityKit API 알아보기
RealityKit의 새로운 크로스 플랫폼 API로 iOS, macOS, visionOS를 위한 몰입감 넘치는 앱을 빌드하는 방법을 알아보세요. 새로운 호버 효과, 조명 및 그림자, 포털 크로스, 빌보드 기능을 살펴보고, 이러한 기능의 실제 예시를 선보입니다.
챕터
- 0:00 - Introduction
- 2:44 - Hover effects and input
- 9:05 - Force effects and joints
- 17:42 - Dynamic lights
- 20:17 - Portal enhancements
- 25:29 - Cross-platform capabilities
리소스
관련 비디오
WWDC24
WWDC23
WWDC21
-
다운로드Array
-
-
4:24 - Add a highlight HoverEffectComponent
// Add a highlight HoverEffectComponent let highlightStyle = HoverEffectComponent.HighlightHoverEffectStyle(color: .lightYellow, strength: 0.8) let hoverEffect = HoverEffectComponent(.highlight(highlightStyle)) spaceship.components.set(hoverEffect)
-
5:55 - Add a shader effect
// Add a shader effect let hoverEffect = HoverEffectComponent(.shader(.default)) spaceship.components.set(hoverEffect)
-
8:04 - Control acceleration with left hand
// Control acceleration with left hand class HandTrackingSystem: System { func update(context: SceneUpdateContext) { let indexTipPosition = indexTipEntity.position(relativeTo: nil) let thumbTipPosition = thumbTipEntity.position(relativeTo: nil) let distance = distance(indexTipPosition, thumbTipPosition) let throttle = computeThrottle(with: distance) let force = spaceship.transform.forward * throttle spaceship.addForce(force, relativeTo: nil) } }
-
10:50 - Adding a gravity force effect
// Adding a gravity force effect struct Gravity: ForceEffectProtocol { var parameterTypes: PhysicsBodyParameterTypes { [.position, .distance] } var forceMode: ForceMode = .force func update(parameters: inout ForceEffectParameters) { guard let distances = parameters.distances, let positions = parameters.positions else { return } for i in 0..<parameters.physicsBodyCount { let force = computeForce(distances[i], positions[i]) parameters.setForce(force, index: i) } } }
-
12:14 - Activating the gravity force effect
// Activating the gravity force effect let gravity = ForceEffect(effect: Gravity(), spatialFalloff: SpatialForceFalloff(bounds: .sphere(radius: 8.0)), mask: .asteroids) planet.components.set(ForceEffectComponent(effects: [gravity]))
-
13:11 - Using PhysicsMotionComponent
// Calculate initial velocity of the asteroid using radius and angle let velocity = calculateVelocity(radius, angle) let physicsMotion = PhysicsMotionComponent(linearVelocity: velocity) asteroid.components.set(physicsMotion)
-
16:19 - // Add a custom joint
// Add a custom joint guard let hookEntity = spaceship.findEntity(named: "Hook") else { return } let hookOffset: SIMD3<Float> = hookEntity.position(relativeTo: spaceship) let hookPin = spaceship.pins.set(named: "Hook", position: hookOffset) let trailerPin = trailer.pins.set(named: "Trailer", position: .zero) var joint = PhysicsCustomJoint(pin0: hookPin, pin1: trailerPin) joint.angularMotionAroundX = .range(-.pi * 0.05 ... .pi * 0.05) joint.angularMotionAroundY = .range(-.pi * 0.2 ... .pi * 0.2) joint.angularMotionAroundZ = .range(-.pi * 0.2 ... .pi * 0.2) joint.linearMotionAlongX = .fixed joint.linearMotionAlongY = .fixed joint.linearMotionAlongZ = .fixed try joint.addToSimulation()
-
19:12 - // Add a spotlight with shadow
// Add a spotlight with shadow guard let lightEntity = spaceship.findEntity(named: "HeadLight") else { return } lightEntity.components.set(SpotLightComponent(color: .yellow, intensity: 10000.0, attenuationRadius: 6.0)) lightEntity.components.set(SpotLightComponent.Shadow())
-
20:01 - Disable shadow
// Disable shadow let component = DynamicLightShadowComponent( castsShadow: false) entity.components.set(component)
-
21:36 - Enable portal crossing
// Enable portal crossing portal.components.set(PortalComponent(target: portalWorld, clippingMode: .plane(.positiveZ), crossingMode: .plane(.positiveZ))) spaceship.components.set(PortalCrossingComponent())
-
24:33 - Configure environmental lighting on the spaceship
// Configure environmental lighting on the spaceship var lightingConfig = EnvironmentLightingConfigurationComponent() let distance: Float = computeShipDistanceFromPortal() lightingConfig.environmentLightingWeight = mapDistanceToWeight(distance) spaceship.components.set(lightingConfig)
-
27:21 - World tracking camera
// World tracking camera RealityView { content in #if os(iOS) content.camera = .worldTracking #endif }
-
27:59 - Multi-touch control views
// Multi-touch control views #if os(iOS) struct MultiTouchControlView : View { var body: some View { HStack { ThrottleControlView() Spacer() PitchRollControlView() } } #endif
-
-
찾고 계신 콘텐츠가 있나요? 위에 주제를 입력하고 원하는 내용을 바로 검색해 보세요.
쿼리를 제출하는 중에 오류가 발생했습니다. 인터넷 연결을 확인하고 다시 시도해 주세요.