Страница 1 из 1

Направление вектора через сферу

СообщениеДобавлено: 03 ноя 2018, 01:48
AlexSmithCore
Приветствую друзья! Требуется помощь в просчёте направления луча ( не из камеры ).

Присутствует плоскость 2 на 2

Синтаксис:
Используется csharp
// Получаю данные значения при помощи камеры
// То есть на выходе мы получаем значения от - 1 до 1
Vector2 _mouse = Input.mousePosition;
Vector2 _or = new Vector2(2*_mouse.x/Screen.height - (float)Screen.width/(Screen.height),2*_mouse.y/Screen.height-1f);
 


С подобным кодом проблем нету, далее встретился с проблемой недостаточного понимания точных наук.
Мой мозг пришёл к выводу, что требуется отрисовать единичную окружность и получить точку относительно тех координат, что мы получаем через скрипт выше.
После получения нужной точки на сфере, просто найти направление вектора от начала этой сферы, до точки, что в итоге мы нашли. Тут проблем не будет, т.к направление вектора - их разность.

Рисунок 1
Изображение

Re: Направление вектора через сферу

СообщениеДобавлено: 03 ноя 2018, 08:31
1max1
Ты лучше бы сказал для чего это всё нужно, я не совсем понимаю, что за формула вот здесь:
Vector2 _or = new Vector2(2*_mouse.x/Screen.height - (float)Screen.width/(Screen.height),2*_mouse.y/Screen.height-1f);
И что ты в итоге хочешь получить.

Re: Направление вектора через сферу

СообщениеДобавлено: 03 ноя 2018, 14:11
AlexSmithCore
1max1 писал(а):Ты лучше бы сказал для чего это всё нужно, я не совсем понимаю, что за формула вот здесь:
Vector2 _or = new Vector2(2*_mouse.x/Screen.height - (float)Screen.width/(Screen.height),2*_mouse.y/Screen.height-1f);
И что ты в итоге хочешь получить.


Присутствует объект на камере размером 1080 на 1080, который зависит от разрешения. Этим кодом я нахожу позицию мышки на экране, записывая это в Vector 2
( На выходе получаем значения от - 1 до 1,это сделано для того, чтобч проще работать с единичный сферой ( как мне известно, синусы только с ней и дружат )
После чего нужно перевести эту точку в трёхмерное пространство ( красная точка на рисунке ), фактически плоскость экрана, где мы нашли позицию мышки - дно сферы
Используя получившийся координаты, нужно направить вектор вверх и получить точку соприкосновения с единичной сферой ( синяя точка на рисунке )
Далее дело ща малым, найти направление вектора от центра объекта до точки, что мы нашли

Re: Направление вектора через сферу

СообщениеДобавлено: 03 ноя 2018, 14:26
seaman
Странно Вы преобразуете позицию мыши в координаты экрана.
https://docs.unity3d.com/ScriptReferenc ... ition.html
https://docs.unity3d.com/ScriptReferenc ... Point.html
А задачу я все же не понял. Вы описываете не задачу, а то как Вы ее решать собираетесь.

Re: Направление вектора через сферу

СообщениеДобавлено: 03 ноя 2018, 15:01
1max1
Какой-то объект, какая-то сфера... тз я бы тебе не доверил писать)))

Re: Направление вектора через сферу

СообщениеДобавлено: 03 ноя 2018, 15:08
AlexSmithCore
1max1 писал(а):Какой-то объект, какая-то сфера... тз я бы тебе не доверил писать)))


Изображение

Справа - то, что я получаю через собственную формулу позицию на экране ( Всё работает корректно )
Это нужно для того, чтобы направить луч из этого объекта, относительно того, куда направлена мышь ( Понимаю, что подобная система может работать не очень корректно )
Фактически, мне нужно реализовать направление луча относительно того, куда я указываю на экране. ( В игровом окне - это текстура, которая рендерит 6 камер подобным образом )

Изображение

Если ставить задачу, то требуется получать направление луча, относительно того, куда указал курсор искажённой сферы, учитывая, что это просто текстура, которую рендерит перед собой камера.
Как одно из решений этой задачи я предложил выше. Описать всё через сферу вокруг нужного объекта и путём математики найти нужное направление для луча
Как постановка задачи - прошу помощи либо предложить обходной вариант, либо решить то, что я предложил выше, т.к пока идей на этот счёт у меня нету

Плюс к этому я постарался максимально просто описать задачу ( и её решение, т.к если бы я смог решить это, не обращался бы ). Однако понимал, что открыв все карты, это затруднит её решение ещё больше :))

Re: Направление вектора через сферу

СообщениеДобавлено: 03 ноя 2018, 15:24
AlexSmithCore
seaman писал(а):Странно Вы преобразуете позицию мыши в координаты экрана.
https://docs.unity3d.com/ScriptReferenc ... ition.html
https://docs.unity3d.com/ScriptReferenc ... Point.html
А задачу я все же не понял. Вы описываете не задачу, а то как Вы ее решать собираетесь.


Синтаксис:
Используется csharp
                Vector2 _mouse = Input.mousePosition;
                Vector2 _or = new Vector2(2*_mouse.x/Screen.height - (float)Screen.width/(Screen.height),2*_mouse.y/Screen.height-1f);
                phi = Vector2.SignedAngle(new Vector2(0, -1f), _or);
                ksi = Mathf.Acos(_or.magnitude)*180/Mathf.PI;
                Debug.Log(_or.magnitude + " " +ksi);
                Vector3 test = transform.rotation*(Quaternion.Euler(-ksi,phi,0)* Vector3.forward);
                ray = new Ray(transform.position,test);

                Debug.DrawRay(transform.position, ray.direction * 100f, Color.red);


Я пытался решить эту задачу подобным образом, однако всё работало относительно хорошо. Тут я понял, проблема в том, что я получаю эти значения на плоскости, когда на экране описана сфера, что как раз таки мешало правильно просчитывать направление луча. Однако очень прошу помочь, очень долго с этим работаю, может быть будут какие идеи по решению задачи.

Re: Направление вектора через сферу

СообщениеДобавлено: 03 ноя 2018, 16:52
Ziza
AlexSmithCore писал(а):Если ставить задачу, то требуется получать направление луча, относительно того, куда указал курсор искажённой сферы, учитывая, что это просто текстура, которую рендерит перед собой камера.

Вы меня конечно извините, но если кто-нибудь поймет такое описание задачи ему можно будет памятник при жизни ставить)

Re: Направление вектора через сферу

СообщениеДобавлено: 03 ноя 2018, 17:42
AlexSmithCore
Ziza писал(а):
AlexSmithCore писал(а):Если ставить задачу, то требуется получать направление луча, относительно того, куда указал курсор искажённой сферы, учитывая, что это просто текстура, которую рендерит перед собой камера.

Вы меня конечно извините, но если кто-нибудь поймет такое описание задачи ему можно будет памятник при жизни ставить)


Хорошо, давайте ещё проще, есть камера, рендерит она перед собой плоскость, на плоскости материал, объединяющий в себе несколько камер ( 6 камер - top, left, right и т.д), все это делает шейдер.
Далее, мне нужно взаимодействовать с этой "сферой" на экране, то есть если говорить детским языком, куда тыкнул мышку в эту сферу, туда и попал лучем ( если ещё более детским, то тыкнув в дерево на сфере, попал в дерево, если в луну, значит в луну )
Для полного понимания смотрите скриншот выше, в игровом окне показано, как работает подобный шейдер

Re: Направление вектора через сферу

СообщениеДобавлено: 03 ноя 2018, 20:11
1max1
А-а-а, боже, прямо кроссворд какой-то)) тот неловкий момент, когда все ресурсы идут на понимание тз, а не на решение)
Там ведь теорема Пифагора:
Твой вектор, который ты ищешь (бардовый) по длине равен единице (исходи из твоих слов, что сфера с радиусом 1).
Длина проекции этого вектора на плоскость XZ (сизый катет снизу), тоже известна (L1 = корень(_or.x*_or.x + _or.y*_or.y)).
Ну а дальше найти длину второго катета не проблема (L2 = корень(1 - L1*L1))
Теперь из точки _or пуляем вектор Vector3.up * L2 и получаем бардовый вектор (direction = _or + Vector3.up * L2). Вернее получаем точку конца вектора, но т.к. координаты его начала в (0,0) то это и будет сам вектор.

Но что-то мне кажется не всё так просто)))

Re: Направление вектора через сферу

СообщениеДобавлено: 03 ноя 2018, 20:47
AlexSmithCore
1max1 писал(а):А-а-а, боже, прямо кроссворд какой-то)) тот неловкий момент, когда все ресурсы идут на понимание тз, а не на решение)
Там ведь теорема Пифагора:
Твой вектор, который ты ищешь (бардовый) по длине равен единице (исходи из твоих слов, что сфера с радиусом 1).
Длина проекции этого вектора на плоскость XZ (сизый катет снизу), тоже известна (L1 = корень(_or.x*_or.x + _or.y*_or.y)).
Ну а дальше найти длину второго катета не проблема (L2 = корень(1 - L1*L1))
Теперь из точки _or пуляем вектор Vector3.up * L2 и получаем бардовый вектор (direction = _or + Vector3.up * L2). Вернее получаем точку конца вектора, но т.к. координаты его начала в (0,0) то это и будет сам вектор.

Но что-то мне кажется не всё так просто)))


Спасибо, на самом деле я решил способом чуть проще ( Надеялся, что никто не поможет и пошёл разрабатывать )
Да, это задача с подвохом:

Синтаксис:
Используется csharp
Vector3 test = new Vector3(transform.position.x + _or.x * - 1, transform.position.y + Mathf.Sqrt(1 - (Mathf.Pow(_or.x, 2) + Mathf.Pow(_or.y, 2))) * -1,transform.position.z + _or.y);
ray = new Ray(transform.position,transform.position - test);

Debug.DrawRay(transform.position, ray.direction * 100f, Color.red);
 

Думаю на тему замены координат местами понятно, как и умножение на -1.
Однако это не является решением, всё работает корректно только по краям и центре сферы. Однако диагональные стороны - странно искажаются, на самом деле надо будет ещё сам шейдер проверить ещё раз.
Так же вот расписал саму формулу, как я к ней пришёл. Осталось понять, почему работает не очень корректно.

Изображение

Сама погрешность пока не понятна, на скриншоте я указал мышкой на дерево, однако...

Изображение

Re: Направление вектора через сферу

СообщениеДобавлено: 03 ноя 2018, 21:46
1max1
Попробуй сделать свои координаты не от (-1; +1), а от (-0.5pi; +0.5pi) и брать потом в качестве координат sin(w), где w в диапазоне (-0.5pi, +0.5pi), возможно это сгладит неровность, а возможно и нет))
Изображение