Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Unity3D C# Как глобальные координаты перевести в локальные(LineRender.positions)

Unity3D C# Как глобальные координаты перевести в локальные(LineRender.positions)

Поделиться
DellLoiDПостоялецwww12 апр. 201723:39#0
На плоскости с помощью LineRenderer между спрайтами нарисовал линию. Создал "obj" на линии и научил его двигаться по линии перебирая сохраненные точки линии из массива positions компонента line Draw:
lr.GetPosition(indpos + 1).

Но нужно чтобы "obj" поворачивался в сторону движения. Для этого использую:

Строка №1            GETrot = Vector3.Angle(lr.GetPosition(indpos), lr.GetPosition(indpos+1)); //тут беру 2 Vector3 и получаю угол между ними по оси Z
           
Строка №2            obj.transform.localEulerAngles = new Vector3(0, 0, GETrot);                  //тут меняю Элеровский угол по локальной оси z найденный строчкой выше.

ВОПРОС/ПРОБЛЕМА:

В Строке №1 вычитается угол в глобальных координатах т.е. относительно центра координат, а не локальных координат "obj".

ЧТО ПРОБОВАЛ:

Отключил в инспекторе и программно(lr = GetComponent<LineRenderer>(); lr.useWorldSpace = false;)

но не дало не какого эффекта.

Нашел в мануалах:

InverseTransformPoint(Vector3 position); (https://docs.unity3d.com/ScriptReference/Transform.InverseTransformPoint.html)

и

ransform.worldToLocalMatrix.MultiplyPoint(obj.position)


Но поскольку я не программист не смог понять как их корректно использовать.

ИЗ ВСЕГО ВЫШЕСКАЗАННОГО ВОПРОС: Как посчитать угол в локальных координатах и присвоить его объекту?

Помогите люди добрые, сами мы не местные...судьба жестокая заставила осваивать Юнити+С# в короткие сроки. Дедлайн близко, а нехера не сделано, ничего не успеваю!!

Правка: 12 апр. 2017 23:45

endeavour_prПостоялецwww19 апр. 20171:32#1
Как успехи ?
Если еще актуально скинь проект в личку, я посмотрю, так не ясно

Правка: 19 апр. 2017 1:33

seamanПостоялецwww19 апр. 201723:09#2
Угол нужно имхо брать не между двумя позициями а между поворотом персонажа и направлением на следующую позицию.
transform.forward - это направление персонажа
lr.GetPosition(indpos+1) - lr.GetPosition(indpos) - это направление на следующую позицию
угол -
GETrot = Vector3.Angle(transform.forward, lr.GetPosition(indpos+1) - lr.GetPosition(indpos));
Только это не угол который должен быть у персонажа, а угол на который нужно повернуть
obj.transform.localEulerAngles = transform.rotate(0, GETrot, 0); //Ось y вверх - вокруг нее вращаем.
DellLoiDПостоялецwww23 апр. 201719:43#3
endeavour_pr спасибо за отклик. Мб позже скину. Это не последний вопрос наверняка.


seaman, спасибо думаю вы правы.

У меня 2D проект. Т.е. камера смотрит с оси z. У мня при расчете GETrot угол всегда равен 90 градусов. Читаю туторы. видимо я чего-то не знаю....при этом если  tranzit.transform.Rotate(0,GETrot,0); или в игрек его прописать то угол высчитывается и меняется.А по оси z всегда 90 градусов.....
И вот эта штука не работает: obj.transform.localEulerAngles = transform.rotate(0, GETrot, 0); - выдает ошибку что ротейт

Transform' does not contain a definition for 'rotate' and no extension method 'rotate' accepting a first argument of type 'Transform' could be found (are you missing a using directive or an assembly reference?)

судя по всему операцию присваивания тут нельзя использовать.

seamanПостоялецwww23 апр. 201720:49#4
DellLoiD
> И вот эта штука не работает
Ошибся в одной букве. Вам быстрее было бы посмотреть в мануале где.
https://docs.unity3d.com/ScriptReference/Transform.Rotate.html
DellLoiDПостоялецwww25 апр. 20179:34#5
seaman
У меня заработало как надо вот так:

//-------------------------ОПРЕДЕЛЯЕМ УГОЛ ПОВОРОТА--------------------------------------//
            var odin = Vector3.up; var dva = lr.GetPosition(indpos + 1) - lr.GetPosition(indpos);  //временные переменные в которых находим векторы направления
            GETrot = Vector3.Angle(odin, dva);                                                        //находим сам угол на который надо повернуть вагончик
            if (odin.x < dva.x) { GETrot = GETrot * (-1); } else GETrot = GETrot * 1;              // определяем полярность угла на который надо повернуть.
            tranzit.transform.localEulerAngles = new Vector3(0, 0, GETrot);                            //присваиваем угол вагончику

Кстати если кто решал такую задачу:

Есть точка(=спрайт) через неё может пройти до 7 линий. Приходят в точки(=спрайт) и выходят из него рандомно. Как сделать так что бы линии не накладывались друг на друга?

Это не техника дошла это я сам сюда дошел, на лыжах:

1.  if (GETDirection.y > 0) - //с помощью нормализованного вектора направления узнаем откуда приходит линия
2. for (int D = 6; D >= 4; D--) //низ ------тут: я определил куда будет вставать точка самой линии, т.е. поправка прибавляется к координате спрайта и в эту координату встает точка линии.
//все эти поправки(всего 8 точек) я занес в массив и пробегаюсь по позициям массива в зависимости от того откуда пришла линия(сверху, снизу,справа,слева).
3. if (firstpointline.linepospoints[D] != Vector3.zero && firstpoint != Vector3.zero) //тут смотрю занята ли эта позиция уже линией и начал ли я рисовать линию.
4.  firstpoint = firstpoint + firstpointline.linepospoints[D];                                      //если if выполнился то вношу поправку в позицию линии

В целом у меня 4 таких блока: сверху-вниз; снизу-вверх; слева-направо; справа-налево;
В каждом блоке я вношу поправки для 2 точек линии: 1. На предыдущем спрайте исходящую точку. 2. На текущем спрайте входящую точку.
Итого под спрайтом 2 точки линии с позиционированные ближе к краю спрайта за счет чего линии в 90% случаях находятся рядом и не пересекаются.

Вдруг кто знает какое то стандартное решение такой задачи? Или этот велосипед который я привел выше можно оставить??

/ Форум / Программирование игр / 2D графика и изометрия

2001—2017 © GameDev.ru — Разработка игр