Babylon.js - Bones demo source

Back to demo

main.ts

import { runDemo } from "../shared/demoRunner";
import { createBonesScene } from "./scene";

runDemo({ createScene: createBonesScene });

scene.ts

import type { Engine } from "@babylonjs/core/Engines/engine";
import { Scene } from "@babylonjs/core/scene";
import { ArcRotateCamera } from "@babylonjs/core/Cameras/arcRotateCamera";
import { DirectionalLight } from "@babylonjs/core/Lights/directionalLight";
import { ShadowGenerator } from "@babylonjs/core/Lights/Shadows/shadowGenerator";
import { StandardMaterial } from "@babylonjs/core/Materials/standardMaterial";
import { Color3 } from "@babylonjs/core/Maths/math.color";
import { Vector3 } from "@babylonjs/core/Maths/math.vector";
import { CreateGround } from "@babylonjs/core/Meshes/Builders/groundBuilder";
import { ImportMeshAsync } from "@babylonjs/core/Loading/sceneLoader";
import type { Mesh } from "@babylonjs/core/Meshes/mesh";
import "@babylonjs/core/Loading/Plugins/babylonFileLoader";
import "@babylonjs/core/Lights/Shadows/shadowGeneratorSceneComponent";
import "@babylonjs/core/Animations/animatable";

export async function createBonesScene(engine: Engine): Promise<Scene> {
    const scene = new Scene(engine);
    const light = new DirectionalLight("dir01", new Vector3(0, -0.5, -1.0), scene);
    const camera = new ArcRotateCamera("Camera", 0, 0, 10, new Vector3(0, 30, 0), scene);
    camera.setPosition(new Vector3(20, 70, 120));
    light.position = new Vector3(20, 150, 70);
    camera.minZ = 10.0;

    scene.ambientColor = new Color3(0.3, 0.3, 0.3);

    const ground = CreateGround("ground", { width: 1000, height: 1000, subdivisions: 1 }, scene);
    const groundMaterial = new StandardMaterial("ground", scene);
    groundMaterial.diffuseColor = new Color3(0.2, 0.2, 0.2);
    groundMaterial.specularColor = new Color3(0, 0, 0);
    ground.material = groundMaterial;
    ground.receiveShadows = true;

    const shadowGenerator = new ShadowGenerator(1024, light);

    const rabbitResult = await ImportMeshAsync("/Scenes/Rabbit/Rabbit.babylon", scene, { meshNames: "Rabbit" });
    const rabbit = rabbitResult.meshes[1] as Mesh;
    rabbit.scaling = new Vector3(0.4, 0.4, 0.4);
    shadowGenerator.getShadowMap()!.renderList!.push(rabbit);

    const rabbit2 = rabbit.clone("rabbit2", null)!;
    const rabbit3 = rabbit.clone("rabbit3", null)!;
    shadowGenerator.getShadowMap()!.renderList!.push(rabbit2);
    shadowGenerator.getShadowMap()!.renderList!.push(rabbit3);

    rabbit2.position = new Vector3(-50, 0, -20);
    rabbit2.skeleton = rabbit.skeleton!.clone("clonedSkeleton");

    rabbit3.position = new Vector3(50, 0, -20);
    rabbit3.skeleton = rabbit.skeleton!.clone("clonedSkeleton2");

    scene.beginAnimation(rabbitResult.skeletons[0], 0, 100, true, 0.8);
    scene.beginAnimation(rabbit2.skeleton, 73, 100, true, 0.8);
    scene.beginAnimation(rabbit3.skeleton, 0, 72, true, 0.8);

    const dudeResult = await ImportMeshAsync("/Scenes/Dude/Dude.babylon", scene, { meshNames: "him" });
    const dude = dudeResult.meshes[0] as Mesh;
    for (const mesh of dudeResult.meshes) {
        shadowGenerator.getShadowMap()!.renderList!.push(mesh);
    }
    dude.rotation.y = Math.PI;
    dude.position = new Vector3(0, 0, -80);
    scene.beginAnimation(dudeResult.skeletons[0], 0, 100, true, 1.0);

    return scene;
}