sevas55 Posted December 28, 2024 Posted December 28, 2024 Создаю в учебных целях демонстрацию работы эхолота бокового обзора и столкнулся с недостатком понимания как правильно вращать вектор. Есть нода, которая является началом вектора, мне нужно получить веер новых векторов с определенным шагом угла. Эту часть решил. Но столкнулся с тем, что при повороте ноды в мире, созданный веер векторов не поворачивается вместе с нодой, будто вращение происходит только вокруг мировых осей, хотя скрипт привязан к ноде. Скрипт прилагаю, его просто надо назначить на любой примитив. using System.Collections; using System.Collections.Generic; using Unigine; [Component(PropertyGuid = "53c8b1eaafc3bc6063b20990b5d33c2a98579bad")] public class MyRotation : Component { float startAngle = 0; float endAngle = 60; float rayAngle = 0; public const int raysCount = 60; float stepAngle = 0; dvec3 p0, p1; int rayLength = 100; WorldIntersectionNormal intersection = new WorldIntersectionNormal(); void Init() { stepAngle = (endAngle-startAngle)/raysCount; Visualizer.Enabled = true; } void Update() { p0 = node.WorldPosition;//координаты излучателя dvec3 dirVertical = node.GetWorldDirection(MathLib.AXIS.NZ);//направление вниз от излучателя for (int i = 0; i < raysCount; i++) { rayAngle = startAngle + i*stepAngle*MathLib.DEG2RAD;//текущий угол вектора в завимисоти от номера dirVertical *= new quat(new vec3(1, 0, 0), rayAngle) ;//доворот текущего вектора на угол dvec3 p1 = p0 + dirVertical*rayLength; Unigine.Object obj = World.GetIntersection(p0, p1, 1, intersection); double d = MathLib.Distance(p0, intersection.Point); Visualizer.RenderPoint3D(intersection.Point,0.01f,vec4.YELLOW); Visualizer.RenderLine3D(p0,p1,vec4.RED); } // Log.MessageLine(""); } } И скриншоты, на первом все как бы в порядке, веер параллелен ноде. А вот тут я просто повернул ноду на угол, но веер при этом остался ориентирован как на первом скрине Ну и на всякий случай, готовый проект - https://cloud.mail.ru/public/aZqT/yCAwb4hUX Подскажите, в чем ошибка и как исправить? Эту статью перечитал много раз и использовал как раз оттуда варианты поворота, но пока безуспешно https://developer.unigine.com/ru/docs/future/learn/06_implementing_app_logic/4_2?rlang=cs MyRotation.cs
yurickon Posted December 28, 2024 Posted December 28, 2024 Привет) Немного потрудился над вашей задачей. Решение нашёл, но вращение корректно работает только если расположить лучи вертикально вниз, как и показано на скринах. Если же повернуть родительскую ноду, лучи будут отображаться некорректно. Собственно сам код: float Speed_rot = 1f; //скорость вращения float _t_rot = 0;//угол поворота от 0 до 360 void Update() { p0 = node.Position;//координаты излучателя dvec3 dirVertical = node.GetDirection(MathLib.AXIS.NZ);//направление вниз от излучателя if (Input.IsKeyPressed(Input.KEY.F1))//удерживаем F1 для визуализации и вращения { _t_rot += Game.IFps * Speed_rot; for (int i = 0; i < raysCount; i++) { rayAngle = startAngle + i * stepAngle * MathLib.DEG2RAD;//текущий угол вектора в зависимости от номера if(_t_rot < 360) dirVertical *= new quat(new vec3(MathLib.Cos(_t_rot), MathLib.Sin(_t_rot), 0), rayAngle);//доворот текущего вектора на угол else _t_rot = 0; dvec3 p1 = p0 + dirVertical * rayLength; Visualizer.RenderPoint3D(intersection.Point, 0.01f, vec4.YELLOW); Visualizer.RenderLine3D(p0, p1, vec4.RED); } } } Надеюсь пригодится. Успехов! 1
sevas55 Posted December 28, 2024 Author Posted December 28, 2024 Юрий, в очередной раз спасибо! Посмотрел ваш код, все работает так как нужно, причем даже если нода невертикальна, на видео видно как лучи наклоняются вместе с креном мотоцикла.Чтобы все в итоге крутилось как надо, вместо угла в кватернион записываю направление ноды по ее носу или по курсу мотоцикла. a = node.GetWorldRotation().EulerZ; dirVertical *= new quat(new vec3(MathLib.Cos(a), MathLib.Sin(a), 0), (float)rayAngle); 1
yurickon Posted December 28, 2024 Posted December 28, 2024 Отлично Владимир! Хорошее продолжение моего решения. Может и мне в будущем пригодится) 1
sevas55 Posted December 28, 2024 Author Posted December 28, 2024 (edited) Я по воде со многим разобрался. Если по ней вдруг что-то будет интересовать, то обращайтесь. Например, я сообразил как сделать бесконечную физическую воду, для плавучих объектов, а не ограниченным прямоугольником. Думаю напишу пост про это. Всех с наступающим! Edited December 28, 2024 by sevas55
Recommended Posts