This commit is contained in:
2025-10-19 19:19:00 +03:00
parent 953a7c22f7
commit 192a900a96
7 changed files with 113 additions and 137 deletions
@@ -11,130 +11,116 @@ class MazeObject {
const scale = 5;
context.wallSize = params.wallSize || .65*scale;
context.wallSize = params.wallSize || 1.2*scale; //half
context.tubeSize = params.tubeSize || 1.2*scale;
context.wallDepth = params.wallDepth || .1*scale;
context.fontPath = params.fontPath || '/static/fonts/ZapfChanceryC.otf';
const cameraNear = .2;
context.wallDepth = params.wallDepth || 0*scale;
context.fontPath = params.fontPath || '/static/fonts/Jura-SemiBold.ttf';
this.context = context;
let _tf = {
rotation: {
r: 3 * Math.PI / 2, f: 0, l: Math.PI / 2, b: Math.PI
},
position: {
r: [-context.wallSize, context.wallSize],
f: [0, 2 * context.wallSize],
l: [context.wallSize, context.wallSize]
},
pNext: {
r: [-context.wallSize - (context.wallSize + context.wallDepth) / 2, context.wallSize],
f: [0, 2 * context.wallSize + context.wallSize / 2],
l: [context.wallSize + (context.wallSize + context.wallDepth) / 2, context.wallSize]
r: [-context.wallSize/2, context.wallSize/2],
f: [0, context.wallSize / 2],
l: [context.wallSize/2, context.wallSize/2]
}
};
let o = {};
let areas = [], mazeMeshes = [];
function addPhysics(matrix, position, size, placement = 'side'){
let quat = new Quaternion().setFromRotationMatrix(matrix);
let v = new Vector3(...position).applyMatrix4(matrix);
let po = engine.phy.add(
{position: v}, 'fixed', false, undefined, 'cuboid',{ width: 0.01, height:1, depth:size/2 }
)
if (placement == 'front') {
quat.multiply(new Quaternion(0, 0.7071068, 0, 0.7071068)) //rotate by 90deg
}
po.rigidBody.setRotation(quat, true)
}
this.mazeObject = function(def, room, step = 0) {
if (!def.matrix){
def.matrix = new Matrix4();
}
let offsetZ = 0, e;
def.len = def.len || 0;
if (step == 0) {
e = o.door.clone();
e.rotateY(_tf.rotation.f);
mazeMeshes.push(e);
}
// if (step == 0) {
// e = o.door.clone();
// e.rotateY(_tf.rotation.f);
// mazeMeshes.push(e);
// }
for (let i = 0; i < def.len; i++) {
let t = o.tunnel.clone();
t.position.set(0, 0, i * context.tubeSize + context.wallDepth / 2);
t.position.set(0, 0, i * context.tubeSize);
def.matrix && t.applyMatrix4(def.matrix);
mazeMeshes.push(t);
}
offsetZ = context.wallDepth + def.len * context.tubeSize - context.tubeSize / 2;
if (!def.len) offsetZ = -.275;
areas.push({
a: [
room.localToWorld(new Vector3(-context.tubeSize / 2 + cameraNear, 0, -context.tubeSize / 2 - cameraNear)),
room.localToWorld(new Vector3(context.tubeSize / 2 - cameraNear, 0, offsetZ + cameraNear))
]
});
offsetZ = def.len * context.tubeSize;
//if (!def.len) offsetZ = -.275;
//room.getWorldQuaternion(quat);
// const geometry = new BoxGeometry(2, 2, offsetZ);
// const cube = new Mesh(geometry, o.tunnel.material)
// cube.position.set(context.tubeSize / 2, 0.6, offsetZ/2)
// root.add(cube);
let quat = new Quaternion();
room.getWorldQuaternion(quat);
// console.log(offsetZ, room.localToWorld(new Vector3(context.tubeSize / 2, 0.6, offsetZ/2)))
console.log('adding!!!', room.localToWorld(new Vector3(context.tubeSize / 2, 0.6, offsetZ/2)), quat)
let ofZ = def.len * context.tubeSize
addPhysics(def.matrix, [context.tubeSize / 2, 0.6, offsetZ/2], offsetZ)
addPhysics(def.matrix, [-context.tubeSize / 2, 0.6, offsetZ/2], offsetZ)
// const geometry = new BoxGeometry(2, 2, offsetZ);
// const cube = new Mesh(geometry, o.tunnel.material)
// cube.position.set(context.tubeSize / 2, 0.6, offsetZ/2)
// root.add(cube);
e = [
o.floor.clone(),
o.door.clone(),
o[def.r ? 'door' : 'wall'].clone(),
o[def.f ? 'door' : 'wall'].clone(),
o[def.l ? 'door' : 'wall'].clone()
];
// console.log(offsetZ, room.localToWorld(new Vector3(context.tubeSize / 2, 0.6, offsetZ/2)))
e[0].position.set(0, 0, offsetZ + context.wallSize/2);
let left = engine.phy.add(
{position: room.localToWorld(new Vector3(context.tubeSize / 2, 0.6, offsetZ/2))},
'fixed', false, undefined, 'cuboid',{ width: 0.01, height:1, depth:offsetZ/2 }
)
left.rigidBody.setRotation(quat, true)
e[1].rotateY(_tf.rotation.b);
let right = engine.phy.add(
{position: room.localToWorld(new Vector3(-context.tubeSize / 2, 0.6, offsetZ/2))},
'fixed', false, undefined, 'cuboid',{ width: 0.01, height:1, depth:offsetZ/2 }
)
right.rigidBody.setRotation(quat, true)
e[2].rotateY(_tf.rotation.r);
e[3].rotateY(_tf.rotation.f);
e[4].rotateY(_tf.rotation.l);
e[1].position.set(0, 0, offsetZ + 0);
if (def.type == 'area') {
def.area.forEach(ar => {
areas.push({
a: [
room.localToWorld(new Vector3(ar[0] + cameraNear, 0, offsetZ + ar[1] - cameraNear)),
room.localToWorld(new Vector3(ar[2] - cameraNear, 0, offsetZ + ar[3] + cameraNear))
]
});
});
} else {
if (def.noRoom) {
// e = o.wall.geometry.clone();
// e.rotateY(_tf.rotation.f);
// e.translate(0,0,offsetZ + 0);
// def.matrix && e.applyMatrix4(def.matrix);
// mazeGeometries.push(e);
} else {
e = [o.floor.clone(), o.door.clone(), o[def.r ? 'door' : 'wall'].clone(),
o[def.f ? 'door' : 'wall'].clone(), o[def.l ? 'door' : 'wall'].clone()];
e[0].position.set(0, 0, offsetZ + context.wallSize);
e[2].position.set(-context.wallSize/2, 0, offsetZ + context.wallSize/2);
e[3].position.set(0, 0, offsetZ + context.wallSize);
e[4].position.set(context.wallSize/2, 0, offsetZ + context.wallSize/2);
e[1].rotateY(_tf.rotation.b);
e[2].rotateY(_tf.rotation.r);
e[3].rotateY(_tf.rotation.f);
e[4].rotateY(_tf.rotation.l);
e[1].position.set(0, 0, offsetZ + 0);
e[2].position.set(-context.wallSize, 0, offsetZ + context.wallSize);
e[3].position.set(0, 0, offsetZ + context.wallSize * 2);
e[4].position.set(context.wallSize, 0, offsetZ + context.wallSize);
e.forEach(g => {
def.matrix && g.applyMatrix4(def.matrix);
mazeMeshes.push(g);
});
areas.push({
a: [
room.localToWorld(new Vector3(-context.wallSize + cameraNear, 0, offsetZ + cameraNear)),
room.localToWorld(new Vector3(context.wallSize - cameraNear, 0, offsetZ + context.wallSize * 2 - cameraNear))
]
});
}
if (!def.r){
addPhysics(def.matrix, [-context.wallSize/2, 0, offsetZ + context.wallSize/2], context.wallSize)
}
if (!def.f){
addPhysics(def.matrix, [0, 0, offsetZ + context.wallSize], context.wallSize, 'front')
}
if (!def.l){
addPhysics(def.matrix, [context.wallSize/2, 0, offsetZ + context.wallSize/2], context.wallSize)
}
e.forEach(g => {
def.matrix && g.applyMatrix4(def.matrix);
mazeMeshes.push(g);
});
def.objects && def.objects.forEach(obj => {
obj.room = room;
// let go = new GameObject(obj, context);
let go = new TextObject(obj, context)
room.add(go.mesh);
go.mesh.scale.multiplyScalar(scale)
go.mesh.position.multiply(new Vector3(scale, scale, context.wallSize))
go.mesh.applyMatrix4(def.matrix);
root.add(go.mesh);
// go.ready.then(mesh => {
// room.add(mesh);
// });
@@ -148,7 +134,7 @@ class MazeObject {
mtx.setPosition(_tf.pNext[d][0], 0, _tf.pNext[d][1] + offsetZ);
let rr = new Group();
root.add(rr);
def[d].matrix = mtx.premultiply(def.matrix || new Matrix4());
def[d].matrix = mtx.premultiply(def.matrix);
rr.applyMatrix4(def[d].matrix);
rr.updateMatrixWorld();
this.mazeObject(def[d], rr, step + 1);
@@ -159,8 +145,10 @@ class MazeObject {
let mazeAsset = await engine.load('/static/meshes/maze-reed.gltf');
['tunnel', 'wall', 'door', 'floor'].forEach(e => {
o[e] = mazeAsset.scene.getObjectByName(e);
o[e].frustumCulled = false;
//o[e].frustumCulled = false;
o[e].scale.set(scale, scale, scale)
// o[e].geometry.computeBoundingBox();
// console.log(e, o[e].geometry.boundingBox)
});
this.mazeObject(def, room);
mazeMeshes.forEach(mesh=>{