Есть ли способ получить точную точку внутри навигационной сети, чтобы навигатор мог работать должным образом?

#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);
  }
}