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

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

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

Сообщение AlexSmithCore 03 ноя 2018, 01:48

Приветствую друзья! Требуется помощь в просчёте направления луча ( не из камеры ).

Присутствует плоскость 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
Изображение
Аватара пользователя
AlexSmithCore
UNец
 
Сообщения: 28
Зарегистрирован: 02 июл 2017, 00:22

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

Сообщение 1max1 03 ноя 2018, 08:31

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

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

Сообщение AlexSmithCore 03 ноя 2018, 14:11

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,это сделано для того, чтобч проще работать с единичный сферой ( как мне известно, синусы только с ней и дружат )
После чего нужно перевести эту точку в трёхмерное пространство ( красная точка на рисунке ), фактически плоскость экрана, где мы нашли позицию мышки - дно сферы
Используя получившийся координаты, нужно направить вектор вверх и получить точку соприкосновения с единичной сферой ( синяя точка на рисунке )
Далее дело ща малым, найти направление вектора от центра объекта до точки, что мы нашли
Аватара пользователя
AlexSmithCore
UNец
 
Сообщения: 28
Зарегистрирован: 02 июл 2017, 00:22

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

Сообщение seaman 03 ноя 2018, 14:26

Странно Вы преобразуете позицию мыши в координаты экрана.
https://docs.unity3d.com/ScriptReferenc ... ition.html
https://docs.unity3d.com/ScriptReferenc ... Point.html
А задачу я все же не понял. Вы описываете не задачу, а то как Вы ее решать собираетесь.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

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

Сообщение 1max1 03 ноя 2018, 15:01

Какой-то объект, какая-то сфера... тз я бы тебе не доверил писать)))
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

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

Сообщение AlexSmithCore 03 ноя 2018, 15:08

1max1 писал(а):Какой-то объект, какая-то сфера... тз я бы тебе не доверил писать)))


Изображение

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

Изображение

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

Плюс к этому я постарался максимально просто описать задачу ( и её решение, т.к если бы я смог решить это, не обращался бы ). Однако понимал, что открыв все карты, это затруднит её решение ещё больше :))
Аватара пользователя
AlexSmithCore
UNец
 
Сообщения: 28
Зарегистрирован: 02 июл 2017, 00:22

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

Сообщение AlexSmithCore 03 ноя 2018, 15:24

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


Я пытался решить эту задачу подобным образом, однако всё работало относительно хорошо. Тут я понял, проблема в том, что я получаю эти значения на плоскости, когда на экране описана сфера, что как раз таки мешало правильно просчитывать направление луча. Однако очень прошу помочь, очень долго с этим работаю, может быть будут какие идеи по решению задачи.
Аватара пользователя
AlexSmithCore
UNец
 
Сообщения: 28
Зарегистрирован: 02 июл 2017, 00:22

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

Сообщение Ziza 03 ноя 2018, 16:52

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

Вы меня конечно извините, но если кто-нибудь поймет такое описание задачи ему можно будет памятник при жизни ставить)
Аватара пользователя
Ziza
UNIт
 
Сообщения: 81
Зарегистрирован: 02 ноя 2018, 23:07

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

Сообщение AlexSmithCore 03 ноя 2018, 17:42

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

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


Хорошо, давайте ещё проще, есть камера, рендерит она перед собой плоскость, на плоскости материал, объединяющий в себе несколько камер ( 6 камер - top, left, right и т.д), все это делает шейдер.
Далее, мне нужно взаимодействовать с этой "сферой" на экране, то есть если говорить детским языком, куда тыкнул мышку в эту сферу, туда и попал лучем ( если ещё более детским, то тыкнув в дерево на сфере, попал в дерево, если в луну, значит в луну )
Для полного понимания смотрите скриншот выше, в игровом окне показано, как работает подобный шейдер
Аватара пользователя
AlexSmithCore
UNец
 
Сообщения: 28
Зарегистрирован: 02 июл 2017, 00:22

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

Сообщение 1max1 03 ноя 2018, 20:11

А-а-а, боже, прямо кроссворд какой-то)) тот неловкий момент, когда все ресурсы идут на понимание тз, а не на решение)
Там ведь теорема Пифагора:
Твой вектор, который ты ищешь (бардовый) по длине равен единице (исходи из твоих слов, что сфера с радиусом 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) то это и будет сам вектор.

Но что-то мне кажется не всё так просто)))
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

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

Сообщение AlexSmithCore 03 ноя 2018, 20:47

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

Изображение

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

Изображение
Аватара пользователя
AlexSmithCore
UNец
 
Сообщения: 28
Зарегистрирован: 02 июл 2017, 00:22

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

Сообщение 1max1 03 ноя 2018, 21:46

Попробуй сделать свои координаты не от (-1; +1), а от (-0.5pi; +0.5pi) и брать потом в качестве координат sin(w), где w в диапазоне (-0.5pi, +0.5pi), возможно это сгладит неровность, а возможно и нет))
Изображение
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51


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

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

Сейчас этот форум просматривают: GoGo.Ru [Bot], Google [Bot] и гости: 13