immersive2/src/objects/avatar.ts

87 lines
2.7 KiB
TypeScript

import {
AssetContainer,
Mesh,
MeshBuilder,
Observable,
PhysicsAggregate,
PhysicsMotionType,
PhysicsShapeType,
Scene,
SceneLoader,
Vector3
} from "@babylonjs/core";
export function buildAvatar(scene: Scene) {
const objectObservable = new Observable<AssetContainer>();
objectObservable.add((container) => {
try {
const data = container.instantiateModelsToScene(undefined, false, {doNotInstantiate: true});
const mesh = (data.rootNodes[0] as Mesh);
const body = scene.getMeshByName("Clone of avaturn_body");
/*body.simplify(
[
{quality: .7, distance: 5},
{quality: .1, distance: 10},
],
true,
SimplificationType.QUADRATIC,
function() {
const skel = scene.getSkeletonById("Clone of Armature");
body.parent.getChildMeshes().forEach((m) => {
if (m.name.indexOf("ecimated") > -1) {
m.skeleton = skel;
}
});
}
)
*/
const bounds = mesh.getHierarchyBoundingVectors(true);
const size = bounds.max.subtract(bounds.min);
const top = MeshBuilder.CreateBox("container", {width: size.x, height: size.y, depth: size.z}, scene);
top.position.y = 1.6;
top.metadata = {grabbable: true};
mesh.parent = top;
mesh.position.y = -size.y / 2;
top.position = new Vector3(-.6, size.y / 2 + 1, 0);
//top.scaling = new Vector3(.1, .1, .1);
top.visibility = 0;
//top.physicsBody = new PhysicsBody(top, PhysicsMotionType.DYNAMIC, false, this.scene);
data.animationGroups[0].play(true);
const physicsAggregate = new PhysicsAggregate(top,
PhysicsShapeType.BOX, {mass: 100, restitution: .02, friction: .3}, scene);
physicsAggregate.body.setMotionType(PhysicsMotionType.DYNAMIC);
physicsAggregate.body.setGravityFactor(1);
} catch (err) {
}
//physicsAggregate.body.setAngularDamping(.5);
//top.physicsBody.setLinearVelocity(Vector3.Up().scale(100));
//mesh.parent = top.physicsBody.transformNode;
});
loadObject(scene, objectObservable);
}
function loadObject(scene: Scene, observable: Observable<AssetContainer>) {
SceneLoader.LoadAssetContainer("/assets/models/",
"model.glb",
scene,
(container: AssetContainer) => {
observable.notifyObservers(container);
});
}