Skip to content

Latest commit

 

History

History
201 lines (142 loc) · 5.04 KB

File metadata and controls

201 lines (142 loc) · 5.04 KB

VRMKit

VRM loader and VRM renderer

demo demo

For "VRM", please refer to this page.

Features

  • Load VRM file
  • Render VRM models on RealityKit (experimental)
  • Face morphing (blend shape)
  • Bone animation (skin / joint)
  • Physics (spring bone)

Requirements

  • Swift 6.0+
  • iOS 15.0+
  • macOS 12.0+
  • visionOS 2.0+
  • watchOS 8.0+ (Experimental)

Installation

Swift Package Manager

You can install this package with Swift Package Manager.

Carthage & CocoaPods (Deprecated)

If you want to use these package managers, please use https://github.com/tattn/VRMKit/releases/tag/0.4.2

Usage

Load VRM

import VRMKit

let vrm = try VRMLoader().load(named: "model.vrm")
// let vrm = try VRMLoader().load(withUrl: URL(string: "/path/to/model.vrm")!)
// let vrm = try VRMLoader().load(withData: data)

// VRM meta data
vrm.meta.title
vrm.meta.author

// model data
vrm.gltf.jsonData.nodes[0].name

Render VRM

import RealityKit
import VRMKit
import VRMRealityKit

let loader = try VRMEntityLoader(named: "model.vrm")
let vrmEntity = try loader.loadEntity()

let arView = ARView(frame: .zero, cameraMode: .nonAR, automaticallyConfigureSession: false)
let anchor = AnchorEntity(world: .zero)
anchor.addChild(vrmEntity.entity)
arView.scene.addAnchor(anchor)

Render VRM (SwiftUI)

import RealityKit
import RealityKitContent
import VRMKit
import VRMRealityKit

import SwiftUI

struct ContentView: View {
    var body: some View {
        RealityView { content in
            let loader = try VRMEntityLoader(named: "model.vrm")
            let vrmEntity = try loader.loadEntity()
            content.add(vrmEntity.entity)
        }
    }
}
Render VRM (SceneKit) — Deprecated

Note: VRMSceneKit is deprecated. Use VRMRealityKit instead.

import VRMKit
import VRMSceneKit

@IBOutlet weak var sceneView: SCNView!

let loader = try VRMSceneLoader(named: "model.vrm")
let scene: VRMScene = try loader.loadScene()
let node: VRMNode = scene.vrmNode

sceneView.scene = scene

Blend shapes

joy

vrmEntity.setBlendShape(value: 1.0, for: .preset(.joy))

angry

vrmEntity.setBlendShape(value: 1.0, for: .preset(.angry))

><

vrmEntity.setBlendShape(value: 1.0, for: .custom("><"))

Bone animation

Humanoid

vrmEntity.setBlendShape(value: 1.0, for: .preset(.fun))
let neckRotation = simd_quatf(angle: 20 * .pi / 180, axis: SIMD3<Float>(0, 0, 1))
let shoulderRotation = simd_quatf(angle: 40 * .pi / 180, axis: SIMD3<Float>(0, 0, 1))
vrmEntity.humanoid.node(for: .neck)?.transform.rotation *= neckRotation
vrmEntity.humanoid.node(for: .leftShoulder)?.transform.rotation *= shoulderRotation
vrmEntity.humanoid.node(for: .rightShoulder)?.transform.rotation *= shoulderRotation

Read the thumbnail image

let loader = VRMLoader()
let vrm = try loader.load(named: "model.vrm")
let image = try loader.loadThumbnail(from: vrm)

ToDo

  • VRM 1.0 support
    • Decoding VRM 1.0 file
    • Render an avatar by RealityKit (as VRM 0.x)
    • Render an avatar by RealityKit (as VRM 1.x)
  • VRM shaders support (MToon)
  • Improve rendering quality
  • Animation support (vrma)
  • VRM editing function
  • GLTF renderer support

Contributing

  1. Fork it!
  2. Create your feature branch: git checkout -b my-new-feature
  3. Commit your changes: git commit -am 'Add some feature'
  4. Push to the branch: git push origin my-new-feature
  5. Submit a pull request :D

Support this project

Donating to help me continue working on this project.

Donate

License

VRMKit is released under the MIT license. See LICENSE for details.

Author

Tatsuya Tanaka

Twitter GitHub