diff --git a/Example/Example/RealityKitViewController.swift b/Example/Example/RealityKitViewController.swift index 739b8a4..9d09091 100644 --- a/Example/Example/RealityKitViewController.swift +++ b/Example/Example/RealityKitViewController.swift @@ -100,19 +100,27 @@ final class RealityKitViewController: UIViewController, UIGestureRecognizerDeleg updateCameraTransform() let neck = vrmEntity.humanoid.node(for: .neck) - let leftShoulder = vrmEntity.humanoid.node(for: .leftShoulder) ?? vrmEntity.humanoid.node(for: .leftUpperArm) - let rightShoulder = vrmEntity.humanoid.node(for: .rightShoulder) ?? vrmEntity.humanoid.node(for: .rightUpperArm) + let leftArm: Entity? + let rightArm: Entity? + switch vrmEntity.vrm { + case .v1: + leftArm = vrmEntity.humanoid.node(for: .leftShoulder) + rightArm = vrmEntity.humanoid.node(for: .rightShoulder) + case .v0: + leftArm = vrmEntity.humanoid.node(for: .leftUpperArm) + rightArm = vrmEntity.humanoid.node(for: .rightUpperArm) + } let neckRotation = simd_quatf(angle: 20 * .pi / 180, axis: SIMD3(0, 0, 1)) - let shoulderRotation = simd_quatf(angle: 40 * .pi / 180, axis: SIMD3(0, 0, 1)) + let armRotation = simd_quatf(angle: 40 * .pi / 180, axis: SIMD3(0, 0, 1)) if let neck { neck.transform.rotation = neck.transform.rotation * neckRotation } - if let leftShoulder { - leftShoulder.transform.rotation = leftShoulder.transform.rotation * shoulderRotation + if let leftArm { + leftArm.transform.rotation = leftArm.transform.rotation * armRotation } - if let rightShoulder { - rightShoulder.transform.rotation = rightShoulder.transform.rotation * shoulderRotation + if let rightArm { + rightArm.transform.rotation = rightArm.transform.rotation * armRotation } vrmEntity.setBlendShape(value: 1.0, for: .preset(currentExpression.preset)) diff --git a/Example/Example/ViewController.swift b/Example/Example/ViewController.swift index 1fb4a42..c3375cb 100644 --- a/Example/Example/ViewController.swift +++ b/Example/Example/ViewController.swift @@ -114,8 +114,18 @@ class ViewController: UIViewController { node.setBlendShape(value: 1.0, for: .preset(currentExpression.preset)) node.humanoid.node(for: .neck)?.eulerAngles = SCNVector3(0, 0, 20 * CGFloat.pi / 180) - node.humanoid.node(for: .leftShoulder)?.eulerAngles = SCNVector3(0, 0, 40 * CGFloat.pi / 180) - node.humanoid.node(for: .rightShoulder)?.eulerAngles = SCNVector3(0, 0, 40 * CGFloat.pi / 180) + let leftArm: SCNNode? + let rightArm: SCNNode? + switch node.vrm { + case .v1: + leftArm = node.humanoid.node(for: .leftShoulder) + rightArm = node.humanoid.node(for: .rightShoulder) + case .v0: + leftArm = node.humanoid.node(for: .leftUpperArm) + rightArm = node.humanoid.node(for: .rightUpperArm) + } + leftArm?.eulerAngles = SCNVector3(0, 0, 40 * CGFloat.pi / 180) + rightArm?.eulerAngles = SCNVector3(0, 0, 40 * CGFloat.pi / 180) node.runAction(SCNAction.repeatForever(SCNAction.sequence([ SCNAction.rotateBy(x: 0, y: -0.5, z: 0, duration: 0.5), diff --git a/Example/MacExample/ContentView.swift b/Example/MacExample/ContentView.swift index 2338b3d..6e722f5 100644 --- a/Example/MacExample/ContentView.swift +++ b/Example/MacExample/ContentView.swift @@ -10,6 +10,7 @@ import SwiftUI import RealityKit internal import VRMRealityKit internal import Combine +internal import VRMKit struct ContentView: View { @State private var viewModel = ContentViewModel() @@ -73,19 +74,27 @@ final class ContentViewModel { // Adjust pose let neck = vrmEntity.humanoid.node(for: .neck) - let leftShoulder = vrmEntity.humanoid.node(for: .leftShoulder) ?? vrmEntity.humanoid.node(for: .leftUpperArm) - let rightShoulder = vrmEntity.humanoid.node(for: .rightShoulder) ?? vrmEntity.humanoid.node(for: .rightUpperArm) + let leftArm: Entity? + let rightArm: Entity? + switch vrmEntity.vrm { + case .v1: + leftArm = vrmEntity.humanoid.node(for: .leftShoulder) + rightArm = vrmEntity.humanoid.node(for: .rightShoulder) + case .v0: + leftArm = vrmEntity.humanoid.node(for: .leftUpperArm) + rightArm = vrmEntity.humanoid.node(for: .rightUpperArm) + } let neckRotation = simd_quatf(angle: 20 * .pi / 180, axis: SIMD3(0, 0, 1)) - let shoulderRotation = simd_quatf(angle: 40 * .pi / 180, axis: SIMD3(0, 0, 1)) + let armRotation = simd_quatf(angle: 40 * .pi / 180, axis: SIMD3(0, 0, 1)) if let neck { neck.transform.rotation = neck.transform.rotation * neckRotation } - if let leftShoulder { - leftShoulder.transform.rotation = leftShoulder.transform.rotation * shoulderRotation + if let leftArm { + leftArm.transform.rotation = leftArm.transform.rotation * armRotation } - if let rightShoulder { - rightShoulder.transform.rotation = rightShoulder.transform.rotation * shoulderRotation + if let rightArm { + rightArm.transform.rotation = rightArm.transform.rotation * armRotation } vrmEntity.setBlendShape(value: 1.0, for: .custom("><")) diff --git a/Example/VisionExample/ContentView.swift b/Example/VisionExample/ContentView.swift index 7f809b8..a6dcd1d 100644 --- a/Example/VisionExample/ContentView.swift +++ b/Example/VisionExample/ContentView.swift @@ -103,19 +103,27 @@ final class ImmersiveViewModel { // Adjust pose let neck = vrmEntity.humanoid.node(for: .neck) - let leftShoulder = vrmEntity.humanoid.node(for: .leftShoulder) ?? vrmEntity.humanoid.node(for: .leftUpperArm) - let rightShoulder = vrmEntity.humanoid.node(for: .rightShoulder) ?? vrmEntity.humanoid.node(for: .rightUpperArm) + let leftArm: Entity? + let rightArm: Entity? + switch vrmEntity.vrm { + case .v1: + leftArm = vrmEntity.humanoid.node(for: .leftShoulder) + rightArm = vrmEntity.humanoid.node(for: .rightShoulder) + case .v0: + leftArm = vrmEntity.humanoid.node(for: .leftUpperArm) + rightArm = vrmEntity.humanoid.node(for: .rightUpperArm) + } let neckRotation = simd_quatf(angle: 20 * .pi / 180, axis: SIMD3(0, 0, 1)) - let shoulderRotation = simd_quatf(angle: 40 * .pi / 180, axis: SIMD3(0, 0, 1)) + let armRotation = simd_quatf(angle: 40 * .pi / 180, axis: SIMD3(0, 0, 1)) if let neck { neck.transform.rotation = neck.transform.rotation * neckRotation } - if let leftShoulder { - leftShoulder.transform.rotation = leftShoulder.transform.rotation * shoulderRotation + if let leftArm { + leftArm.transform.rotation = leftArm.transform.rotation * armRotation } - if let rightShoulder { - rightShoulder.transform.rotation = rightShoulder.transform.rotation * shoulderRotation + if let rightArm { + rightArm.transform.rotation = rightArm.transform.rotation * armRotation } vrmEntity.setBlendShape(value: 1.0, for: .custom("><")) diff --git a/Example/WatchExample Watch App/ViewModel.swift b/Example/WatchExample Watch App/ViewModel.swift index 58577d7..5cc65ef 100644 --- a/Example/WatchExample Watch App/ViewModel.swift +++ b/Example/WatchExample Watch App/ViewModel.swift @@ -55,8 +55,19 @@ final class ViewModel: ObservableObject { let rotationOffset = model.initialRotation node.eulerAngles = SCNVector3(0, rotationOffset, 0) - node.humanoid.node(for: .leftShoulder)?.eulerAngles = SCNVector3(0, 0, 40 * CGFloat.pi / 180) - node.humanoid.node(for: .rightShoulder)?.eulerAngles = SCNVector3(0, 0, 40 * CGFloat.pi / -180) + let leftArm: SCNNode? + let rightArm: SCNNode? + switch node.vrm { + case .v1: + leftArm = node.humanoid.node(for: .leftShoulder) + rightArm = node.humanoid.node(for: .rightShoulder) + case .v0: + leftArm = node.humanoid.node(for: .leftUpperArm) + rightArm = node.humanoid.node(for: .rightUpperArm) + } + + leftArm?.eulerAngles = SCNVector3(0, 0, 40 * CGFloat.pi / 180) + rightArm?.eulerAngles = SCNVector3(0, 0, 40 * CGFloat.pi / -180) node.runAction(.repeatForever(.sequence([ .wait(duration: 3.0), diff --git a/README.md b/README.md index b218adb..a277112 100644 --- a/README.md +++ b/README.md @@ -149,10 +149,18 @@ vrmEntity.setBlendShape(value: 1.0, for: .custom("><")) ```swift vrmEntity.setBlendShape(value: 1.0, for: .preset(.fun)) let neckRotation = simd_quatf(angle: 20 * .pi / 180, axis: SIMD3(0, 0, 1)) -let shoulderRotation = simd_quatf(angle: 40 * .pi / 180, axis: SIMD3(0, 0, 1)) +let armRotation = simd_quatf(angle: 40 * .pi / 180, axis: SIMD3(0, 0, 1)) +let (leftArm, rightArm): (Entity?, Entity?) +switch vrmEntity.vrm { +case .v1: + (leftArm, rightArm) = (vrmEntity.humanoid.node(for: .leftShoulder), vrmEntity.humanoid.node(for: .rightShoulder)) +case .v0: + (leftArm, rightArm) = (vrmEntity.humanoid.node(for: .leftUpperArm), vrmEntity.humanoid.node(for: .rightUpperArm)) +} + vrmEntity.humanoid.node(for: .neck)?.transform.rotation *= neckRotation -vrmEntity.humanoid.node(for: .leftShoulder)?.transform.rotation *= shoulderRotation -vrmEntity.humanoid.node(for: .rightShoulder)?.transform.rotation *= shoulderRotation +leftArm?.transform.rotation *= armRotation +rightArm?.transform.rotation *= armRotation ``` ### Read the thumbnail image