Jump to content

[SOLVED] Вращение вектора, вокруг направления ноды


photo

Recommended Posts

Posted

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

Есть нода, которая является началом вектора, мне нужно получить веер новых векторов с определенным шагом угла. Эту часть решил.

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

Скрипт прилагаю, его просто надо назначить на любой примитив.

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("");
	}
}

И скриншоты, на первом все как бы в порядке, веер параллелен ноде.

image.thumb.png.d7c78bac0cf339d8e71a0e5bdbdfd755.png

 

А вот тут я просто повернул ноду на угол, но веер при этом остался ориентирован как на первом скрине

image.thumb.png.49176d23d17d6d2e58cb07208f7179b1.png

Ну и на всякий случай, готовый проект - 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

Posted

Привет) Немного потрудился над вашей задачей. Решение нашёл, но вращение корректно работает только если расположить лучи вертикально вниз, как и показано на скринах. Если же повернуть родительскую ноду, лучи будут отображаться некорректно. 

Собственно сам код:

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);
        }
    }
}

Надеюсь пригодится. Успехов!

 

  • Like 1
Posted

Юрий, в очередной раз спасибо!

Посмотрел ваш код, все работает так как нужно, причем даже если нода невертикальна, на видео видно как лучи наклоняются вместе с креном мотоцикла.Чтобы все в итоге крутилось как надо, вместо угла в кватернион записываю направление ноды по ее носу или по курсу мотоцикла.

a = node.GetWorldRotation().EulerZ;
dirVertical *= new quat(new vec3(MathLib.Cos(a), MathLib.Sin(a), 0), (float)rayAngle);

 

 

 
  • Like 1
Posted

Отлично Владимир! Хорошее продолжение моего решения. Может и мне в будущем пригодится)

  • Like 1
Posted (edited)

Я по воде со многим разобрался. Если по ней вдруг что-то будет интересовать, то обращайтесь.

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

Всех с наступающим!

Edited by sevas55
  • silent changed the title to [SOLVED] Вращение вектора, вокруг направления ноды
×
×
  • Create New...