Как создать столкновение 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;
                }
            }
        }
    }

Но эта коллизия плохо работает, как можно улучшить её? Помогите пожалуйста.

Если что-то надо, то я могу записать видео о том что коллизия плохо работает

Заранее спасибо!


Ответы (0 шт):