Jump to content

[SOLVED] PathRoute обрывается на выпуклых углах


Recommended Posts

Здравствуйте

Осваиваю поиск пути. Никак не могу понять что не так. Обрывается именно когда таргет на самом угле, хотя если пойти дальше путь продолжится.

Думаю пока просто двигать вперед при обрыве, но не хочется использовать костыли.

 

Link to comment

Чтобы сказать что-то более конкретное нужно глянуть на тестовую сцену из движка. Можете подготовить и залить её куда-нибудь?

Спасибо.

How to submit a good bug report
---
FTP server for test scenes and user uploads:

Link to comment

Здравствуйте.

Такое поведение происходит из-за некорректной работы метода inside3d для NavigationMesh. Но можно попробовать обойти этот баг, располагая начальную и конечную точку маршрута в нижней плоскости navmesh'а. Это можно сделать следующим образом.nav_mesh_test.png

  1. Размещаем меш, который используется для навигации, в виде объекта в мире. Можно сделать его дочерним к NavigationMesh.
  2. Делаем его невидимым, убирая маски Viewport Mask и Shadow Mask.
  3. Включаем для него поиск пересечений.
  4. Создаём отдельную маску, которую будем использовать для корректировки точек.

Добавляем корректировку точек в компоненту:

public class PathRoute : Component
{
	Unigine.PathRoute _pathRoute;
	WorldIntersection _intersection;

	public Node point0, point1;

	[ParameterMask(MaskType = ParameterMaskAttribute.TYPE.INTERSECTION)]
	public int navMeshMask = 1 << 31;

	void Init()
	{
		_pathRoute = new Unigine.PathRoute();
		_intersection = new WorldIntersection();

		Console.Onscreen = true;
		Visualizer.Enabled = true;
	}

	void Update()
	{
		vec3 p0 = point0.WorldPosition;
		vec3 p1 = point1.WorldPosition;
		float randomOffset = Game.GetRandomFloat(-MathLib.EPSILON, MathLib.EPSILON);
		vec3 pointOffset = new vec3(randomOffset, randomOffset, MathLib.EPSILON);

		Object obj = World.GetIntersection(p0 + vec3.UP, p0 + vec3.DOWN, navMeshMask, _intersection);
		if (obj != null )
			p0 = _intersection.Point + pointOffset;

		obj = World.GetIntersection(p1 + vec3.UP, p1 + vec3.DOWN, navMeshMask, _intersection);
		if (obj != null)
			p1 = _intersection.Point + pointOffset;

		if (_pathRoute.IsReached)
		{
			_pathRoute.Create2D(p0, p1);
			Log.MessageLine("path route is reached");
			_pathRoute.RenderVisualizer(vec4.RED);
		}
		else
		{
			_pathRoute.Create2D(p0, p1);
			Log.MessageLine("path route is not reached");
			_pathRoute.RenderVisualizer(vec4.RED);
		}
	}
}

Тут просто пускаем луч с некоторым отступом, с помощью которого находим точку на меше. Далее добавляем небольшое смещение, чтобы избежать случаев попадания на ребро.

  • Thanks 1
Link to comment
  • silent changed the title to [SOLVED] PathRoute обрывается на выпуклых углах
×
×
  • Create New...