Как создать столкновение 3D объекта в JavaScript (p5.js)?
Сама карта:
{"name":"first_map_test","date":"12.12.2023","type":"objects","map":[{"name":"Red spawn","type":"spawn","data":"red","position":[3,0,2],"rotation":[0,0,0],"scale":[1,1,1],"colision":false,"texture":"red","scripts":[]},{"name":"Blue spawn","type":"spawn","data":"blue","position":[-3,0,2],"rotation":[0,0,0],"scale":[1,1,1],"colision":false,"texture":"blue","scripts":[]},{"name":"Plane","type":"plane","position":[0,0,0],"rotation":[0,0,0],"scale":[1,1,1],"colision":true,"texture":null,"scripts":[],"model":null},{"name":"trojin","type":"box","position":[-10.599999999999994,0,-9.599999999999998],"rotation":[0,0,0],"scale":[1,1,1],"colision":true,"texture":"2_20231129121848.png","scripts":[],"model":null},{"name":"lumik2","type":"box","position":[9.799999999999997,0,-9.599999999999998],"rotation":[0,0,0],"scale":[2.300000000000001,2.3000000000000003,1],"colision":true,"texture":"Безымянный.png","scripts":[],"model":null},{"name":"lumik","type":"box","position":[-6.400000000000002,0,-9.599999999999998],"rotation":[0,0,0],"scale":[1,1,1],"colision":true,"texture":"Бsезымянный.png","scripts":[],"model":null}],"bomb":[0,0],"spawns":{"red":[0,0],"blue":[0,0]},"version":"1.0","textures":["2_20231129121848.png","Бsезымянный.png","Безымянный.png"],"models":[]}
cgame.previousX|Y|Z = {oldx, oldy, oldz} - это старая позиция игрока (для коллизии)
cgame.my = {x, y, z} - это позиция игрока
Функция рисования карты
cgame.drawMap = function(map) {
if(!map) return;
for(let i = 0; i < map.length; i++){
let obj = map[i];
push();
translate(cgame.my_camera_x, cgame.my_camera_z, -cgame.my_camera_y);
rotateX(map[i].rotation[0]);
rotateY(map[i].rotation[1]);
rotateZ(map[i].rotation[2]);
translate(map[i].position[0] * 20, map[i].position[2] * 20, map[i].position[1] * 20);
scale(map[i].scale[0],map[i].scale[1],map[i].scale[2]);
if(map[i].texture) {
texture(window.images[map[i].texture]);
} else if(cgame.selected === i) {
fill(0, 188, 232);
}
if(map[i].type === 'box') {
box(50);
} else if(map[i].type === 'plane') {
plane(500);
}
pop();
if(obj.colision) {
let playerPos = createVector(cgame.my.x, cgame.my.y, cgame.my.z);
let objectPos = createVector(obj.position[0] * 20, obj.position[1] * 20, obj.position[2] * 20);
let playerSize = 50;
let objectSize = createVector(obj.scale[0], obj.scale[1], obj.scale[2]);
if (playerPos.dist(objectPos) < playerSize + objectSize.mag() / 2) {
cgame.my.x = cgame.previousX;
cgame.my.y = cgame.previousY;
cgame.my.z = cgame.previousZ;
}
}
}
}
Но эта коллизия плохо работает, как можно улучшить её? Помогите пожалуйста.
Если что-то надо, то я могу записать видео о том что коллизия плохо работает
Заранее спасибо!