#javascript #three.js #path-finding #a-star #raycasting
Вопрос:
Я делаю шутер от первого лица в Three.js и я хотел использовать алгоритм поиска пути Дона Маккарди для моего вражеского ИИ. Для навигационной системы я последовал за Тремя Ником Левером.Учебник по поиску путей JS. Чтобы использовать навигатор, и игрок, и враги должны находиться на поверхности навигационной сетки. Проблема в том, что, поскольку навигационная сетка немного оторвана от земли (как поднять ее на ту же высоту, что и уровень), и я хочу, чтобы игрок мог прыгать, я не могу позволить им просто придерживаться навигационной сетки и смещать модели. Я попытался исправить это, переключив передачу с игрока/противника на навигатор и используя точку пересечения, но из-за арифметики с плавающей запятой точка пересечения всегда немного выключена.
В моем проекте много кода, поэтому я делюсь только тревожными фрагментами. Если потребуется больше кода, я добавлю его.
Entity.js
rayCaster-это глобальная программа Three.js Райкастер
update(map, navmesh) {
// ...some code...
rayCaster.set(new THREE.Vector3(this.pos.x, this.pos.y 10, this.pos.z), new THREE.Vector3(0, -1, 0));
var hits = rayCaster.intersectObject(navMesh);
if(hits amp;amp; hits[0]) this.point = hits[0].point;
}
Game.js
this.pathfinder = new Pathfinding();
this.pathfinder.setZoneData("lvl1", Pathfinding.createZone(this.navmesh.geometry, 3));
update() {
// ...more code...
for(var i = this.enemies.length - 1; i >= 0; i--) {
var group = this.pathfinder.getGroup("lvl1", this.enemies[i].point), path = 0;
if(group != null amp;amp; group != undefined) path = this.pathfinder.findPath(this.enemies[i].point, player.point, "lvl1", group);
// Path is always null
this.zombies[i].update(this.map, this.navmesh);
}
}