Kolnest Posted August 26 Posted August 26 Здравствуйте Осваиваю поиск пути. Никак не могу понять что не так. Обрывается именно когда таргет на самом угле, хотя если пойти дальше путь продолжится. Думаю пока просто двигать вперед при обрыве, но не хочется использовать костыли.
silent Posted August 26 Posted August 26 Чтобы сказать что-то более конкретное нужно глянуть на тестовую сцену из движка. Можете подготовить и залить её куда-нибудь? Спасибо. How to submit a good bug report --- FTP server for test scenes and user uploads: ftp://files.unigine.com user: upload password: 6xYkd6vLYWjpW6SN
silent Posted August 26 Posted August 26 Да, файл есть. Посмотрим как будет возможность (постараемся на этой неделе). 1 How to submit a good bug report --- FTP server for test scenes and user uploads: ftp://files.unigine.com user: upload password: 6xYkd6vLYWjpW6SN
karpych11 Posted August 28 Posted August 28 Здравствуйте. Такое поведение происходит из-за некорректной работы метода inside3d для NavigationMesh. Но можно попробовать обойти этот баг, располагая начальную и конечную точку маршрута в нижней плоскости navmesh'а. Это можно сделать следующим образом. Размещаем меш, который используется для навигации, в виде объекта в мире. Можно сделать его дочерним к NavigationMesh. Делаем его невидимым, убирая маски Viewport Mask и Shadow Mask. Включаем для него поиск пересечений. Создаём отдельную маску, которую будем использовать для корректировки точек. Добавляем корректировку точек в компоненту: 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); } } } Тут просто пускаем луч с некоторым отступом, с помощью которого находим точку на меше. Далее добавляем небольшое смещение, чтобы избежать случаев попадания на ребро. 1
Kolnest Posted August 29 Author Posted August 29 @karpych11 Здравствуйте! Благодарю, теперь работает так как задумано!
Recommended Posts