Уравнение луча в пространстве и на плоскости?

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

Re: Уравнение луча в пространстве и на плоскости?

Сообщение NOVA 17 фев 2018, 09:35

Cr0c писал(а):
NOVA писал(а):То есть соответствующие X,y,z этих векторов попарно равны.

Тэк-с, не понял. Второй объект на таком же угле к той плоскости, что и первый?

Нет же никакой плоскости. Все лучи второй системы должны быть повёрнуты на неизвестный угол и и смещены по одним и тем же x,y,z. Вот этот угол и смещение и нужно найти. Но при этом лучи попарно должны пересечься.
И так. Уравнение самого первого луча.
Левый у нулевого объекта. Который выходит из нуля в точку (-1,0,1).
x=(-1-0)*t+0
y=(0-0)*t+0
z=(1-0)*t+0

Временный вектор нужного положения Левого у первого объекта. Начало координат смещено на неизвестную нам delta
x=(-1-deltaX)*t+deltaX
y=(-1-deltaY)*t+deltaY
z=(-1-deltaY)*t+deltaY
Если решать только это уравнение, то в результате получится что вектора равны.
А нам нужно вектор из ГО1 сделать равным этому временному вектору. Значит надо ввести параметры кватерниона.
И всё равно должно многое посокращаться.
Дальше надо вводить другие вектора в общую систему. И выводится на параметры delta и параметры кватерниона. Ведь X,Y,Z у векторов будут равны.
А и я тут вектора не нормаировал. Вобщем система должна громоздкая получиться.
Аватара пользователя
NOVA
Адепт
 
Сообщения: 1741
Зарегистрирован: 17 май 2011, 11:45
Откуда: Дядя Саша from Mother Russia

Re: Уравнение луча в пространстве и на плоскости?

Сообщение Cr0c 17 фев 2018, 15:01

Ещё больше запутал. Точки пересечения лучей образуют плоскость?
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 3035
Зарегистрирован: 19 июн 2015, 13:50
Skype: cr0c81

Re: Уравнение луча в пространстве и на плоскости?

Сообщение NOVA 17 фев 2018, 18:38

Cr0c писал(а):Ещё больше запутал. Точки пересечения лучей образуют плоскость?

Нет. Подскажите мне как получить чёртов кватернион просто между двумя векторами и я всё разрулю за неделю. Вернее за две. В интернетах с этим серьёзная беда. Никто не может дать правильный ответ. Либо формулы с википедии цитируют, либо больные товарищи.
Аватара пользователя
NOVA
Адепт
 
Сообщения: 1741
Зарегистрирован: 17 май 2011, 11:45
Откуда: Дядя Саша from Mother Russia

Re: Уравнение луча в пространстве и на плоскости?

Сообщение Cr0c 17 фев 2018, 18:55

Вектор оси поворота - Vector3.Cross(vector1, vector2)
Угол поворота - Vector3.Angle(vector1, vector2)
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 3035
Зарегистрирован: 19 июн 2015, 13:50
Skype: cr0c81

Re: Уравнение луча в пространстве и на плоскости?

Сообщение NOVA 17 фев 2018, 19:01

Да ну если бы это было так, я бы за 2 часа всё сделал.
Уже и вручную кватернионы перемножал. И что только не делал.
Формула кроссвектора давала двойной результат, пришлось прибегать к модульным мерам. Уже и на парентинг грешил и на последовательность переменных в unity, на всё подряд вобщем.
Синтаксис:
Используется csharp
void Update () {

        float x0 = GO0.transform.TransformDirection(Ray0Dir).x;
        float y0 = GO0.transform.TransformDirection(Ray0Dir).y;
        float z0 = GO0.transform.TransformDirection(Ray0Dir).z;

        float x1 = GO1.transform.TransformDirection(Ray1Dir).x;
        float y1 = GO1.transform.TransformDirection(Ray1Dir).y;
        float z1 = GO1.transform.TransformDirection(Ray1Dir).z;

        //Debug.Log(new Vector3(x0, y0, z0) + "V1=" +new Vector3(x1, y1, z1));
        //CrossVector
        float px = y0 * z1 - z0 * y1;
        float py = Mathf.Sqrt(Mathf.Pow(z0 * x1 - x0 * z1,2));
        float pz = x0 * y1 - y0 * x1;
        //Debug.Log(new Vector3(px, py, pz));
        //CrossVectorLenght

        float pl = Mathf.Sqrt(Mathf.Pow(px, 2) + Mathf.Pow(py, 2) + Mathf.Pow(pz, 2));

        //CrossVectornormalized

        float pnx = px / pl;
        float pny = py / pl;
        float pnz = pz / pl;
        //Debug.Log(new Vector3(pnx, pny, pnz));
        //Debug.Log(new Vector3(pnx, pny, pnz).magnitude);

        //Dot

        float d = x0 * x1 + y0 * y1 + z0 * z1;

        //Magnitude0

        float m0 = Mathf.Sqrt(Mathf.Pow(x0, 2) + Mathf.Pow(y0, 2) + Mathf.Pow(z0, 2));

        //Magnitude1

        float m1 = Mathf.Sqrt(Mathf.Pow(x1, 2) + Mathf.Pow(y1, 2) + Mathf.Pow(z1, 2));

        //Angle
        float angle = Mathf.Acos((x0*x1 + y0*y1 + z0*z1)/m0* m1);

        //Debug.Log("dot = " + d + "   realdot=" + Vector3.Dot(new Vector3(x0, y0, z0), new Vector3(px, py, pz)) + "    magV0=" + m0 + "   realmagV0=" + new Vector3(x0, y0, z0).magnitude + "    magV1=" + m1 + "   realmagV1=" + new Vector3(x1, y1, z1).magnitude);
        //Debug.Log(angle);

        Quaternion quat = new Quaternion(Mathf.Cos(angle / 2),Mathf.Sin(angle / 2) * pnx, Mathf.Sin(angle / 2) * pny, Mathf.Sin(angle / 2) * pnz);
        Quaternion invquat = new Quaternion(quat.w, -quat.x, -quat.y, -quat.z);


        float quatl = Mathf.Sqrt(Mathf.Pow(quat.w, 2) + Mathf.Pow(quat.x, 2) + Mathf.Pow(quat.y, 2) + Mathf.Pow(quat.z, 2));
        Quaternion quatn = new Quaternion(quat.w / quatl, quat.x / quatl, quat.y / quatl, quat.z / quatl);
        Quaternion invquatn = new Quaternion(invquat.w / quatl, invquat.x / quatl, invquat.y / quatl, invquat.z / quatl);

        //Debug.Log(quatn);

        //Quaternion product1 quatn*vector

        //Quaternion quatproduct1 = new Quaternion(quatn.w * 0 - quatn.x * x1 - quatn.y * y1 - quatn.x * x1, quatn.w * x1 + quatn.x * 0 + quatn.y * z1 - quatn.z * y1 ,),

        //GO1.transform.rotation = quatn;
        Debug.DrawRay(GO1.transform.position, new Vector3( quatn.x, quatn.y, quatn.z), Color.yellow);
        Debug.DrawRay(GO0.transform.position, new Vector3(x0, y0, z0), Color.white);
        //Debug.DrawRay(GO1.transform.position, new Vector3(x1, y1, z1), Color.yellow);
        Debug.DrawRay(GO0.transform.position, new Vector3(pnx, pny, pnz), Color.red);
Аватара пользователя
NOVA
Адепт
 
Сообщения: 1741
Зарегистрирован: 17 май 2011, 11:45
Откуда: Дядя Саша from Mother Russia

Re: Уравнение луча в пространстве и на плоскости?

Сообщение Cr0c 17 фев 2018, 22:10

NOVA писал(а):Формула кроссвектора давала двойной результат

Потому что направление векторов тоже влияет, нормаль к векторам может смотреть в любую сторону, в зависимости от направления.
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 3035
Зарегистрирован: 19 июн 2015, 13:50
Skype: cr0c81

Re: Уравнение луча в пространстве и на плоскости?

Сообщение NOVA 17 фев 2018, 22:59

Cr0c писал(а):
NOVA писал(а):Формула кроссвектора давала двойной результат

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

Ну конечно, господин crock я ведь отделался от этого с помощью возведения в квадрат пэигрек и извлечением корня. Но кватернион то не получается никак. Все действия заранее предсказуемы, кроме кватерниона.
Аватара пользователя
NOVA
Адепт
 
Сообщения: 1741
Зарегистрирован: 17 май 2011, 11:45
Откуда: Дядя Саша from Mother Russia

Re: Уравнение луча в пространстве и на плоскости?

Сообщение Cr0c 18 фев 2018, 07:44

NOVA писал(а):отделался от этого с помощью возведения в квадрат пэигрек и извлечением корня

Это вместо Mathf.Abs(py)? И каким образом это может помочь? Y компонент у нормали может и нулевым быть.
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 3035
Зарегистрирован: 19 июн 2015, 13:50
Skype: cr0c81

Re: Уравнение луча в пространстве и на плоскости?

Сообщение NOVA 18 фев 2018, 11:49

Cr0c писал(а):
NOVA писал(а):отделался от этого с помощью возведения в квадрат пэигрек и извлечением корня

Это вместо Mathf.Abs(py)? И каким образом это может помочь? Y компонент у нормали может и нулевым быть.

Отставить. Нельзя так делать.
А компоненты Quaternion в юнити идут в такой последовательности? w,x,y,z
А то вот на этой странице написано что-то странное
https://docs.unity3d.com/ScriptReferenc ... rnion.html


ЧЁРТ
https://docs.unity3d.com/ScriptReferenc ... -ctor.html
В этом месте хочется сматериться на весь форум.

Всё нашёл кватернион, только адекватное вращение получается почему-то через инверсный кватернион. Наверное левосторонняя система координат же. Реальная формула нахождения нормализованной оси вращения
float pnx = -(y0 * z1 - z0 * y1) / Mathf.Sqrt(Mathf.Pow(y0 * z1 - z0 * y1, 2) + Mathf.Pow(z0 * x1 - x0 * z1, 2) + Mathf.Pow(x0 * y1 - y0 * x1, 2));
float pny = -(z0 * x1 - x0 * z1) / Mathf.Sqrt(Mathf.Pow(y0 * z1 - z0 * y1, 2) + Mathf.Pow(z0 * x1 - x0 * z1, 2) + Mathf.Pow(x0 * y1 - y0 * x1, 2));
float pnz = -(x0 * y1 - y0 * x1) / Mathf.Sqrt(Mathf.Pow(y0 * z1 - z0 * y1, 2) + Mathf.Pow(z0 * x1 - x0 * z1, 2) + Mathf.Pow(x0 * y1 - y0 * x1, 2));

Формула угла поворота
Mathf.Acos(x0 * x1 + y0 * y1 + z0 * z1 / Mathf.Sqrt(Mathf.Pow(x0, 2) + Mathf.Pow(y0, 2) + Mathf.Pow(z0, 2)) * Mathf.Sqrt(Mathf.Pow(x1, 2) + Mathf.Pow(y1, 2) + Mathf.Pow(z1, 2)));

Нормализованный кватернион.
q.x = Mathf.Sin(angle / 2) * pnx / Mathf.Sqrt(Mathf.Pow(Mathf.Cos(angle / 2), 2) + Mathf.Pow(Mathf.Sin(angle / 2) * pnx, 2) + Mathf.Pow(Mathf.Sin(angle / 2) * pny, 2) + Mathf.Pow(Mathf.Sin(angle / 2) * pnz, 2));
q.y = Mathf.Sin(angle / 2) * pny / Mathf.Sqrt(Mathf.Pow(Mathf.Cos(angle / 2), 2) + Mathf.Pow(Mathf.Sin(angle / 2) * pnx, 2) + Mathf.Pow(Mathf.Sin(angle / 2) * pny, 2) + Mathf.Pow(Mathf.Sin(angle / 2) * pnz, 2));
q.z = Mathf.Sin(angle / 2) * pnz / Mathf.Sqrt(Mathf.Pow(Mathf.Cos(angle / 2), 2) + Mathf.Pow(Mathf.Sin(angle / 2) * pnx, 2) + Mathf.Pow(Mathf.Sin(angle / 2) * pny, 2) + Mathf.Pow(Mathf.Sin(angle / 2) * pnz, 2));
q.w = Mathf.Cos(angle / 2) / Mathf.Sqrt(Mathf.Pow(Mathf.Cos(angle / 2), 2) + Mathf.Pow(Mathf.Sin(angle / 2) * pnx, 2) + Mathf.Pow(Mathf.Sin(angle / 2) * pny, 2) + Mathf.Pow(Mathf.Sin(angle / 2) * pnz, 2));
Аватара пользователя
NOVA
Адепт
 
Сообщения: 1741
Зарегистрирован: 17 май 2011, 11:45
Откуда: Дядя Саша from Mother Russia

Пред.

Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 24