Kolnest Posted August 26 Share Posted August 26 Здравствуйте Осваиваю поиск пути. Никак не могу понять что не так. Обрывается именно когда таргет на самом угле, хотя если пойти дальше путь продолжится. Думаю пока просто двигать вперед при обрыве, но не хочется использовать костыли. Link to comment
silent Posted August 26 Share 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 Link to comment
Kolnest Posted August 26 Author Share Posted August 26 Я попробовал залить через FTP сервер. Вы получили? Link to comment
silent Posted August 26 Share 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 Link to comment
karpych11 Posted August 28 Share 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 Link to comment
Kolnest Posted August 29 Author Share Posted August 29 @karpych11 Здравствуйте! Благодарю, теперь работает так как задумано! Link to comment
Recommended Posts