Как изменить локальные координаты unity

Suggest a change

Suggest a change

Success!

Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable.

Close

Submission failed

For some reason your suggested change could not be submitted. Please <a>try again</a> in a few minutes. And thank you for taking the time to help us improve the quality of Unity Documentation.

Close

Your name

Your email

Suggestion*

Cancel

Switch to Manual

Description

Position of the transform relative to the parent transform.

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour { void Example() { // Move the object to the same position as the parent: transform.localPosition = new Vector3(0, 0, 0);

// Get the y component of the position relative to the parent // and print it to the Console print(transform.localPosition.y); } }

Note that the parent transform’s world rotation and scale are applied to the local position when calculating the world position.
This means that while 1 unit in Transform.position is always 1 unit, 1 unit in Transform.localPosition will get scaled by the scale of all ancestors.

Локальные координаты вектора в глобальные

Локальные координаты вектора в глобальные

В общем не могу сообразить как перегнать локальные координаты вектора в глобальные,тобишь эту строчку,может функция какая-то есть

Используется csharp

offsetVert = hit.transform.InverseTransformPoint(vertex[index])*1.1f;

ArtGor
UNец
 
Сообщения: 21
Зарегистрирован: 14 июн 2019, 01:48

Re: Локальные координаты вектора в глобальные

Сообщение 1max1 08 июл 2019, 00:52

ArtGor писал(а):В общем не могу сообразить как перегнать локальные координаты вектора в глобальные,тобишь эту строчку,может функция какая-то есть

Используется csharp

offsetVert = hit.transform.InverseTransformPoint(vertex[index])*1.1f;

Ты немного промахнулся:

Используется csharp

offsetVert = hit.transform.TransformPoint(vertex[index])*1.1f;

Аватара пользователя
1max1
Адепт
 
Сообщения: 5285
Зарегистрирован: 28 июн 2017, 10:51

Re: Локальные координаты вектора в глобальные

Сообщение ArtGor 08 июл 2019, 01:30

1max1 писал(а):

ArtGor писал(а):В общем не могу сообразить как перегнать локальные координаты вектора в глобальные,тобишь эту строчку,может функция какая-то есть

Используется csharp

offsetVert = hit.transform.InverseTransformPoint(vertex[index])*1.1f;

Ты немного промахнулся:

Используется csharp

offsetVert = hit.transform.TransformPoint(vertex[index])*1.1f;

Не совсем,просто TransformPoint — это и есть глобальные координаты,и умножая на 1.1 я умножаю именно их,мне же надо локальные,цель вообще какая
Изображение
Найти координаты этих точек в мировой оси,загвостка в том,что таких объектов несколько и они в разных местах,поэтому оптимальней всего находить нужные мне точки через локальные координаты
и переводить их в глобальные,но я не знаю как,что то видел с матрицами,но так толком и не разобрался

ArtGor
UNец
 
Сообщения: 21
Зарегистрирован: 14 июн 2019, 01:48

Re: Локальные координаты вектора в глобальные

Сообщение 1max1 08 июл 2019, 01:38

offsetVert = hit.transform.TransformPoint(vertex[index] * 1.1f);

Аватара пользователя
1max1
Адепт
 
Сообщения: 5285
Зарегистрирован: 28 июн 2017, 10:51

Re: Локальные координаты вектора в глобальные

Сообщение ArtGor 08 июл 2019, 01:55

1max1 писал(а):offsetVert = hit.transform.TransformPoint(vertex[index] * 1.1f);

Не,это не то,offsetVert просто получается где-то в космосе :)

ArtGor
UNец
 
Сообщения: 21
Зарегистрирован: 14 июн 2019, 01:48

Re: Локальные координаты вектора в глобальные

Сообщение 1max1 08 июл 2019, 02:08

Потому что координаты не от центра считаешь, либо вообще как-то криво. Давай код.

Аватара пользователя
1max1
Адепт
 
Сообщения: 5285
Зарегистрирован: 28 июн 2017, 10:51

Re: Локальные координаты вектора в глобальные

Сообщение ArtGor 08 июл 2019, 02:20

1max1 писал(а):Потому что координаты не от центра считаешь, либо вообще как-то криво. Давай код.

Используется csharp

void Update()
    {
        layerMask = ~layerMask;
        RaycastHit2D hit = Physics2D.Raycast(AI.transform.position, AI.transform.up, rayRange, layerMask);
        Debug.DrawRay(ray1.position, AI.transform.up * rayRange, Color.red);
        if (hit.collider.tag == «Wall» && rotateMod == false)
        {
            Vector2[] vertex = new Vector2[4];
            vertex[0] = hit.collider.bounds.max;
            vertex[1] = hit.collider.bounds.min + Vector3.up * hit.collider.bounds.size.y;
            vertex[2] = hit.collider.bounds.max + Vector3.down * hit.collider.bounds.size.y;
            vertex[3] = hit.collider.bounds.min;
            Debug.DrawLine(hit.point, vertex[index], Color.blue);
            for (int i = 0; i < vertex.Length; i++)
            {
                var a = (hit.point vertex[i]).magnitude;
                if (a < min) { min = a; index = i; offsetVert = hit.transform.InverseTransformPoint(vertex[index]*1.1f);dirMove = hit.transform.TransformPoint(offsetVert); }
            }
            rotateMod = true;
            Debug.Log(dirMove);
            Debug.Log(offsetVert);
        }
        else
        {
            min = Mathf.Infinity;
        }

dirMove = hit.transform.TransformPoint(offsetVert); добавил сейчас,но точки получаются со смещением

ArtGor
UNец
 
Сообщения: 21
Зарегистрирован: 14 июн 2019, 01:48

Re: Локальные координаты вектора в глобальные

Сообщение 1max1 08 июл 2019, 02:36

hit.collider.bounds.min/max это уже мировые координаты.

Используется csharp

var dir = vertex[index] hit.collider.bounds.center;
offsetVert = dir + dir.normalized * 1.1f; // или просто dir * 1.1f

Аватара пользователя
1max1
Адепт
 
Сообщения: 5285
Зарегистрирован: 28 июн 2017, 10:51

Re: Локальные координаты вектора в глобальные

Сообщение ArtGor 08 июл 2019, 03:13

1max1 писал(а):hit.collider.bounds.min/max это уже мировые координаты.

Используется csharp

var dir = vertex[index] hit.collider.bounds.center;
offsetVert = dir + dir.normalized * 1.1f; // или просто dir * 1.1f

Благодарю,это то что нужно,только hit.collider.bounds.center.normalized я как понимаю
Чёт у меня мозгов не хватило додуматься до этого,хотя решения вроде очевидное :))

ArtGor
UNец
 
Сообщения: 21
Зарегистрирован: 14 июн 2019, 01:48


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

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

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



Свойство transform объекта GameObject содержит в себе данные о положении объекта в игровом мире.


Возвращает глобальные координаты объекта в игровом мире. Возвращаемая величина имеет тип Vector3, который представляет из себя список из 3 координат — x, y и z:

var position = GameObject.transform.position; 
var x = position.x;

Переместить объект в точку 0, 10, 0 игрового мира.

GameObject.transform.position = Vector3(0, 10, 0);

Тоже самое, что и в случае глобальных координат, но с локальными. Локальные координаты расситываются относительно родительского объекта. В случае отсутствия родительского объекта локальные координаты совпадают с глобальными:

var localPosition = GameObject.transform.localPosition; 
var x = localPosition.x;

Поворот объекта в углах Эйлера. Метод также возвращает координаты в виде объекта Vector3:

var eulerAngle = GameObject.transform.eulerAngles;

Тоже самое, что и предыдущий пример, но поворот объекта рассчитывается относительно родительского объекта:

var localEulerAngle = GameObject.transform.localEulerAngles;

Текущий угол поворота объекта, основанный на кватернионах. Возвращает объект типа Quaternion.



var quaternionAngle = GameObject.transform.rotation;

Текущий поворот объекта, основанный на кватернионах, но относительно родительского объекта:

var localQuaternionAngle = GameObject.transform.localRotation;

Сброс угла поворота объекта:

GameObject.transform.rotation = Quaternion.identity;
GameObject.transform.localRotation = Quaternion.identity;

Вращаем наш объект в указанную сторону со скоростью 1 градус в секунду. Принимает в качестве координат объект типа Vector3. Метод deltaTime объекта Time содержит время в секундах, затраченное на выполнение предыдущего кадра:

GameObject.transform.Rotate(Vector3.left * Time.deltaTime);

Тоже самое, что и предыдущий пример, но вращение объекта относительно координат родителя:

GameObject.transform.localRotate(Vector3.left * Time.deltaTime);

Перемещаем наш объект в указанном направлении со скоростью 1 юнит в секунду. Также принимает в качестве координат объект класса Vector3:

GameObject.transform.Translate(Vector3.up * Time.deltaTime);


Почему разновидности и сколько их?

Часто сталкиваюсь с тем, что люди просто не понимают как подвинуть объект в UI на какое то значение, и удивляются что результат зачастую непредсказуем. Или допустим как получить правильные координаты объекта в UI. Если мы через дебагер выведем обычную позицию объекта(position), то она будет сильно отличаться от той что мы видим в инспекторе у UI элемента, так что же мы там видим и как это работает? В итоге перебираются 100500 решений с форумов пока какое либо не подойдет. Хочу придать подобным процессам осмысленное движение.

Суть подвоха заключается в следующем — у обычного Transform есть потомок RectTransform который и отвечает за положение и многие вещи связанные с размером, скейлом и тд — элемента UI. И благодаря ему мы можем получить следующие варианты координат.

  1. position
  2. localPosition
  3. anchoredPosition (есть еще anchoredPosition3D, но его не будем рассматривать отдельно, а будем считать что это подвид test.anchoredPosition

Обычная позиция

Обычная позиция не относится к системе координат UI от слова вообще. Это некие общие координаты объекта во всём мире юнити, и в мире некое представление позиции объекта которое не связано с интерфейсом.Eсли вы захотите сдвинуть объект на его ширину, это не сработает, так как у канваса координаты в пикселях относительно экрана. А в глобальных координатах это не пиксели. Поэтому объект сместится в мире допустим на 200 единиц измерения мира, а не на 200 пикселей, и просто улетит в неведомые дали. Но это можно разумно использовать. Позже расскажу как.

Якорная позиция (anchoredPosition)

То что мы видим в инспекторе — и есть оно.

В юнити можно выставлять якорные точки, это некая точка относительно которой будет позиционироваться UI элемент, в том числе при изменениях размера/пропорций родительского объекта.

Вот тут видно что мы поменяли размер родительского объекта и пропорции, наш объект придерживается центра родительского объекта, и его координаты не изменились, хотя на экране он уже не на том месте что раньше.

Якорная позиция — координаты объекта относительно якоря. Выставим якорь в левый верхний угол и увидим что координаты изменились.

Если вы хотите сместить объект на его ширину, то надо менять anchoredPosition или localPosition. Локальная позиция для UI элементов тоже вычисляется в пикселях, но по другому. Поэтому если вам нужно манипулировать двумя UI элементами относительно друг друга. То лучше использовать локальную позицию. Почему же?

Локальная позиция (localPosition)

Итак, что же такое локальная позиция:

Это система координат, когда в центре родительского объекта находится 0. Правый верхний угол это положительная ширина ректа делённая пополам. Левый верхний отрицательное значение ширины попалам. То есть если ширина ректа 800 пикселей, то посередине x =0, в правом верхнем 400, в левом верхнем -400. Поэтому если вам нужно без учёта якорей посчитать координаты — лучше использовать локальные позиции. При условии что у них общий предок/рект. К слову, якоря можно использовать не только как конкретную точку на родительском объекте, но и как пропорции относительно родительского объекта. Во втором случае anchoredPosition будет возвращать localPosition.

Для чего можно использовать обычный position для UI элементов? Скажем так, в рамках глобальных координат, если одному объекту назначить координаты второго, то они будут находится в одной точке, безотносительно своих якорей или локальных позиций, иногда это удобно — когда элементы находятся на разных канвасах/в разных панелях и системы координат локальные/якорные не совпадают.

Вывод/итог

  1. В инспекторе у UI элементов показываются anchoredPosition или пропорции относительно родительского объекта. AnchoredPosition считается в зависимости от положения якоря
  2. localPosition позволяет получить общие координаты относительно родителя, без привязки к якорям.
  3. position — это глобальня позиция элемента в пространстве сцены, не привязана к UI.

Надеюсь, кому-то поможет :-)

Понравилась статья? Поделить с друзьями:

Читайте также:

  • Как изменить локальную учетную запись на учетную запись майкрософт
  • Как изменить локальную сеть на другую
  • Как изменить локальную сеть на домашнюю
  • Как изменить локальную политику безопасности windows 10
  • Как изменить локальное хранилище

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии