Jump to content

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


Recommended Posts

Posted

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

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

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

 

Posted

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

Спасибо.

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

Posted

Я попробовал залить через FTP сервер. Вы получили?

Posted

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

Такое поведение происходит из-за некорректной работы метода 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
Posted

@karpych11

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

Благодарю, теперь работает так как задумано!

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