Почему Raycast2D имеет отклонение?

Программирование на Юнити.

Почему Raycast2D имеет отклонение?

Сообщение MR_IKS 27 янв 2021, 12:45

Всем привет. Я в тупике, заранее благодарю за любую помощь. Ситуация такова: У меня есть 2 объекта. Стартовый луч и зеркало. Зеркало продублировано через префабы. Зеркало использует Raycast2D чтобы кастовать луч дальше. И всё вроде бы работает, но с отклонением. Можете сами взглянуть. Все зеркала расставлены с чёткими градусами типа(135, 45, -45), то есть отражение должно быть таким же. Но уже на зеркале номер 2 жёлтая картинка луча отклоняется на 0.443. На зеркале номер 3 происходят странные вещи. Луч и Raycast имеют разные углы. На второй картинке видно, что стартовая позиция (-27, 12,5), Вектор (1.0, 0.0) то есть ровно вправо. Но точка попадания Raycast (12.9, 11.6), что на 0,9 ниже чем должна быть. На зеркале номер 7 схожая ситуация. И я честно не понимаю, как луч который идёт ровно вправо, может попасть ниже чем нужно. И к этому всему ещё и при векторе (1,0) кватернион выдаёт (0.0,0.0,0.9,0.4). Проект чистый, создал сегодня. Так что с моей стороны, надеюсь, минимум ошибок.
Синтаксис:
Используется csharp
 public class Mirror_Script : MonoBehaviour
 {
     [HideInInspector]
     public Vector2 LastHit;
     [HideInInspector]
     public Vector2 inDirection;
     public Transform NormalPos;
     public RaycastHit2D LastRaycastHit;
     public float distance;
     private Vector2 LastVector;
     private Vector2 NewVector;
     private Vector2 inNormal;
     private string HitName;
     public GameObject Ray_Sprite;
     private Mirror_Script MirrorBP;
     public bool isPrint;
     public void Mirror()
     {
         inNormal = LastRaycastHit.normal;
         NewVector = Vector2.Reflect(inDirection, inNormal); // Новый отражённый вектор
         NewVector = NewVector.normalized; // Нормализация вектора до длинны 1
         Ray_Sprite.SetActive(true); // Включение луча
         Ray_Sprite.transform.localRotation = (Quaternion.FromToRotation(-NewVector, inNormal));
         RaycastHit2D Hit = Physics2D.Raycast(this.transform.position, NewVector, distance); // Рейкаст по новому вектору на дистанцию
         if (Hit.transform != null) // если попадание не пустое
         {
             Debug.DrawLine(this.transform.position, Hit.point, Color.blue, 0.1f);
             if (isPrint) // это чтобы не все зеркала печатали инфу, а только выбраное
             {
                 print("Start position" + this.transform.position);
                 print("Vector" + NewVector);
                 print("Hit Point" + Hit.point);
             }
             if (Hit.transform.tag == "Mirror") // если тэг обьекта Mirror
             {
                 if (HitName != Hit.transform.name)
                 {
                     HitName = Hit.transform.name;
                     MirrorBP = Hit.transform.gameObject.GetComponent<Mirror_Script>();
                 }
                 Ray_Sprite.transform.localScale = new Vector3(Ray_Sprite.transform.localScale.x, Hit.distance / 5.08f, Ray_Sprite.transform.localScale.z);
                 Debug.DrawLine(this.transform.position, Hit.point, Color.red);
                 LastVector = Hit.point - LastHit;
                 MirrorBP.LastHit = Hit.point;
                 MirrorBP.inDirection = LastVector;
                 MirrorBP.LastRaycastHit = Hit;
                 MirrorBP.Mirror();
             }
             else if (Hit.transform.tag == "Crystal")
             {
 
             }
             else
                 Ray_Sprite.transform.localScale = new Vector3(Ray_Sprite.transform.localScale.x, Hit.distance / 5.08f, Ray_Sprite.transform.localScale.z);
         }
         else
             Ray_Sprite.SetActive(false);
     }
 }

https://ibb.co/VL9bVVt
https://ibb.co/r5mrYcx
Последний раз редактировалось MR_IKS 27 янв 2021, 13:52, всего редактировалось 1 раз.
MR_IKS
UNец
 
Сообщения: 8
Зарегистрирован: 27 янв 2021, 12:37

Re: Почему Raycast2D имеет отклонение?

Сообщение MR_IKS 27 янв 2021, 12:48

Скрины добавить не могу. Файл 11 кб. А сайт говорит "Достигнут максимальный размер вложений"
MR_IKS
UNец
 
Сообщения: 8
Зарегистрирован: 27 янв 2021, 12:37

Re: Почему Raycast2D имеет отклонение?

Сообщение Jarico 27 янв 2021, 13:41

ты можешь же ссылку на скрины оставить
Github: _https://github.com/redheadgektor
Discord: Конь! Чаю!#9382 (сижу редко)
YouTube: _https://www.youtube.com/channel/UCPQ04Xpbbw2uGc1gsZtO3HQ
Telegram: _https://t.me/redheadgektor
Аватара пользователя
Jarico
Адепт
 
Сообщения: 1084
Зарегистрирован: 06 янв 2019, 17:37
Откуда: 0xDEAD
Skype: none
  • Сайт

Re: Почему Raycast2D имеет отклонение?

Сообщение 1max1 27 янв 2021, 14:26

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

Re: Почему Raycast2D имеет отклонение?

Сообщение MR_IKS 27 янв 2021, 14:27

1max1 писал(а):Какие коллайдеры висят на зеркалах?

Box Collider
MR_IKS
UNец
 
Сообщения: 8
Зарегистрирован: 27 янв 2021, 12:37

Re: Почему Raycast2D имеет отклонение?

Сообщение Alkos26Rus 27 янв 2021, 15:32

Почему, ты когда стреляешь лучом то делаешь это из центра зеркала, а когда расчитываешь новое направление луча то вычитываешь новую точку столкновения со старой?
Синтаксис:
Используется csharp
LastVector = Hit.point - LastHit;
 


Значит либо нужно стрелять прям из той точки куда попал луч, либо вычитать позицию зеркала а не предыдущей точки столкновения, примерно так

Синтаксис:
Используется csharp
LastVector = Hit.point - transform.position;
 


я не вникал и не факт чтой мой вариант будет работать, нужно тестить, просто даю направление куда копать, проблема 90% в этом
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1640
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва

Re: Почему Raycast2D имеет отклонение?

Сообщение MR_IKS 27 янв 2021, 15:42

Alkos26Rus писал(а):Почему, ты когда стреляешь лучом то делаешь это из центра зеркала, а когда расчитываешь новое направление луча то вычитываешь новую точку столкновения со старой?
Синтаксис:
Используется csharp
LastVector = Hit.point - LastHit;
 


Значит либо нужно стрелять прям из той точки куда попал луч, либо вычитать позицию зеркала а не предыдущей точки столкновения, примерно так

Синтаксис:
Используется csharp
LastVector = Hit.point - transform.position;
 


я не вникал и не факт чтой мой вариант будет работать, нужно тестить, просто даю направление куда копать, проблема 90% в этом

Вполне может быть и так. Нужно потестить. Спасибо за наводку. Пойду тестить
MR_IKS
UNец
 
Сообщения: 8
Зарегистрирован: 27 янв 2021, 12:37

Re: Почему Raycast2D имеет отклонение?

Сообщение MR_IKS 27 янв 2021, 15:56

Стало лучше. Заменил
Синтаксис:
Используется csharp
LastVector = Hit.point - LastHit;
на
Синтаксис:
Используется csharp
LastVector = Hit.transform.position - transform.position;

но начиная с 7-го зеркала что то идёт не так
https://ibb.co/3d0fj9y
MR_IKS
UNец
 
Сообщения: 8
Зарегистрирован: 27 янв 2021, 12:37

Re: Почему Raycast2D имеет отклонение?

Сообщение MR_IKS 27 янв 2021, 16:05

Изменил
Синтаксис:
Используется csharp
LastVector = Hit.transform.position - transform.position;
обратно на
Синтаксис:
Используется csharp
LastVector = Hit.point - LastHit;

И старт рейкаста сделал с LastHit. Но теперь с 8-го зеркала луч почему-то разворачивает в противоположную сторону.
https://ibb.co/WkmN5z0
MR_IKS
UNец
 
Сообщения: 8
Зарегистрирован: 27 янв 2021, 12:37

Re: Почему Raycast2D имеет отклонение?

Сообщение MR_IKS 27 янв 2021, 16:20

Вобщем сам рейкаст работает теперь правильно. Огромное спасибо за помощь. Теперь осталось разобраться как спрайт луча поворачивать. Можете подсказать, если знаете?
MR_IKS
UNец
 
Сообщения: 8
Зарегистрирован: 27 янв 2021, 12:37

Re: Почему Raycast2D имеет отклонение?

Сообщение Alkos26Rus 27 янв 2021, 16:26

LastVector = Hit.transform.position - transform.position;

но начиная с 7-го зеркала что то идёт не так

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

LastVector = Hit.point - LastHit;

И старт рейкаста сделал с LastHit. Но теперь с 8-го зеркала луч почему-то разворачивает в противоположную сторону.

Луч то как раз работает корректно, и доходит до нужной точки, а вот этот спрайт почему то разварачивается, это уже нужно разбираться, хз, может localScale по какой то из осей в минусе
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1640
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва

Re: Почему Raycast2D имеет отклонение?

Сообщение MR_IKS 27 янв 2021, 17:07

Alkos26Rus писал(а):
LastVector = Hit.transform.position - transform.position;

но начиная с 7-го зеркала что то идёт не так

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

LastVector = Hit.point - LastHit;

И старт рейкаста сделал с LastHit. Но теперь с 8-го зеркала луч почему-то разворачивает в противоположную сторону.

Луч то как раз работает корректно, и доходит до нужной точки, а вот этот спрайт почему то разварачивается, это уже нужно разбираться, хз, может localScale по какой то из осей в минусе

Ну с поворотом спрайта я буду разбираться. А тебе огромнейшее спасибо. Выручил. Я прям застрял на этом. Искренне благодарю)
MR_IKS
UNец
 
Сообщения: 8
Зарегистрирован: 27 янв 2021, 12:37


Вернуться в Скрипты

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4