ストリーミングはほとんどのブラウザと
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
- Reality Composer Proにおけるインタラクティブな3Dコンテンツの作成
- RealityKitによる空間描画アプリの構築
- RealityKitオーディオで空間コンピューティングアプリの質を向上
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
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。