animate award

This commit is contained in:
2025-11-30 14:01:59 +02:00
parent f7d6244fa5
commit 8cea89b7ff
3 changed files with 60 additions and 27 deletions
@@ -0,0 +1,49 @@
import { Vector3, AnimationMixer } from "three";
import { assignMaterial } from "@/lib/MeshUtils";
class GltfObject {
constructor(engine, obj) {
return new Promise(async(resolve, reject)=>{
let gltf = await engine.load(obj.value, obj.path);
let gltfObj = gltf.scene;
gltfObj.traverse(function (object) {
object.frustumCulled = false;
if (obj.name && obj.name == object.name) {
gltfObj = object;
}
});
assignMaterial(gltfObj, obj);
if (gltf.animations && gltf.animations.length) {
let mixer = new AnimationMixer(gltfObj);
engine.mixers.push(mixer);
let action = mixer.clipAction(gltf.animations[0]);
action.setLoop(LoopPingPong);
action.play();
}
this.object = gltfObj;
this.source = gltf;
if (obj.distance) {
const o = this.object;
let dstm = obj.distance;
var oldBR = o.onBeforeRender;
o.visible = false;
engine.addEventListener('beforeRender', function () {
oldBR && oldBR.apply(this, arguments);
var v = new Vector3();
o.getWorldPosition(v);
var dst = engine.camera.position.distanceTo(v);
if (dst <= dstm && !o.visible) {
o.visible = true;
}else if (dst > dstm && o.visible){
o.visible = false;
}
});
}
resolve(this)
})
}
}
export { GltfObject }
@@ -3,6 +3,7 @@ import { Group, EventDispatcher, MeshStandardMaterial, Mesh, SphereGeometry } fr
import { GenericObject } from "./GenenricObject";
import { TextObject } from "./TextObject";
import { ImageObject } from "./ImageObject";
import { GltfObject } from "./GltfObject";
import { CharacterObject } from "./CharacterObject";
import { VideoPlayer } from "./VideoPlayer";
import { PuzzleGame1 } from "./PuzzleGame1";
@@ -18,7 +19,7 @@ import { assignMaterial, assignParams, wrapInGroup, getBoundingBoxMaxLength } fr
import { GameEngine } from "@/lib/GameEngine";
const InteractiveObjectsImports = {
GenericObject, CharacterObject, TextObject, ImageObject, VideoPlayer, Particles,
GenericObject, CharacterObject, TextObject, ImageObject, GltfObject, VideoPlayer, Particles,
PuzzleGame1, PuzzleGame2, PuzzleGame4, MazeQuizGame, ClassicPuzzle
};
@@ -35,30 +36,7 @@ class InteractiveObject extends EventDispatcher{
this.object.add(gameMesh.object);
}
break;
case 'Gltf':
let gltf = await gameEngine.load(obj.value, '');
let gltfObj = gltf.scene;
gltfObj.traverse(function (object) {
object.frustumCulled = false;
if (obj.name && obj.name == object.name) {
gltfObj = object;
}
// object.castShadow = true;
// object.receiveShadow = true;
});
assignMaterial(gltfObj, obj);
if (gltf.animations && gltf.animations.length) {
let mixer = new AnimationMixer(gltfObj);
gameEngine.mixers.push(mixer);
let action = mixer.clipAction(gltf.animations[0]);
action.setLoop(LoopPingPong);
action.play();
}
this.object = gltfObj;
this.source = gltf;
break;
case 'GltfObject':
case 'TextObject':
case 'ImageObject':
case 'GenericObject':
@@ -84,6 +62,11 @@ class InteractiveObject extends EventDispatcher{
this.locker.lock();
}
assignParams(this.object, obj);
if (obj.motion){
gameEngine.motionQueue.add({
o: this.object, ...obj.motion
});
}
resolve(this);
});
}
@@ -102,9 +102,10 @@ class MazeQuizGame extends EventDispatcher {
userData: { finish: true },
objects:[
{
type: 'Gltf',
type: 'GltfObject',
position:[0,.22,len + .52], scale: [0.33, 0.33, 0.33], rotation: [0, Math.PI/4, 0],
value: '/static/meshes/quiz/trophy.glb'
value: 'trophy.glb', path: imgParams.path, distance: params.wallSize*2,
motion: { a:{rotation: { y: k=>k*Math.PI*2 }}, r: true, t: 4 }
}
]
};