Компенсация поворота родительского объекта для дочернего

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

Компенсация поворота родительского объекта для дочернего

Сообщение AlexandrBuryakov 17 апр 2019, 16:30

Здравствуйте. Есть родительский объект, он меняет позицию и поворачивается. Дочерние объекты естественно поворачиваются вместе с ним. Как рассчитать компенсацию поворота, что бы дочерний объект двигался вместе с родительским, но не менял позицию сферически вокруг родительского объекта вне зависимости от вращения родительского? (То есть видимо угол поворота рассчитать в позицию смещения)

ИзображениеИзображение
Изображение
Изображение
Последний раз редактировалось AlexandrBuryakov 17 апр 2019, 16:41, всего редактировалось 1 раз.
AlexandrBuryakov
UNIт
 
Сообщения: 59
Зарегистрирован: 26 янв 2019, 14:36

Re: Компенсация поворота родительского объекта для дочернего

Сообщение 1max1 17 апр 2019, 16:40

Vector3 offset;
//start
offset = transform.position - parent.position;
//update
transform.position = parent.position + offset;
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Компенсация поворота родительского объекта для дочернего

Сообщение AlexandrBuryakov 17 апр 2019, 16:52

Эх... Я немного слукавил, по этому не знаю как переложить на вот что:
Я хочу, что бы коллайдер смещённый от центра, всегда был направлен в одну сторону вне зависимости от поворота объекта на котором он закреплён.
Изображение
AlexandrBuryakov
UNIт
 
Сообщения: 59
Зарегистрирован: 26 янв 2019, 14:36

Re: Компенсация поворота родительского объекта для дочернего

Сообщение 1max1 17 апр 2019, 17:21

Синтаксис:
Используется csharp
using UnityEngine;

class ClampSphereCollider : MonoBehaviour
{
    SphereCollider sc;
    Vector3 offset;

    void Start()
    {
        sc = GetComponent<SphereCollider>();
        offset = transform.TransformVector(sc.center);
    }

    void Update()
    {
        sc.center = transform.InverseTransformVector(offset);
    }
}
 
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Компенсация поворота родительского объекта для дочернего

Сообщение AlexandrBuryakov 17 апр 2019, 17:55

[V] Гениально, спасибо. =)
Правда опять выяснилось, что не могу применить, простите.)))
Если есть вектор скорости (RigidBody.velocity * deltaTimeFixed), как сделать так, что бы коллайдер в сторону движения объекта выпирал, игнорируя вращение объекта?
AlexandrBuryakov
UNIт
 
Сообщения: 59
Зарегистрирован: 26 янв 2019, 14:36

Re: Компенсация поворота родительского объекта для дочернего

Сообщение 1max1 17 апр 2019, 18:22

sc.center = transform.InverseTransformVector(offset + rb.velocity.normalized * fValue);
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Компенсация поворота родительского объекта для дочернего

Сообщение AlexandrBuryakov 17 апр 2019, 18:25

Падаю ниц перед вашей мудростью. ^:)^
AlexandrBuryakov
UNIт
 
Сообщения: 59
Зарегистрирован: 26 янв 2019, 14:36

Re: Компенсация поворота родительского объекта для дочернего

Сообщение AlexandrBuryakov 23 апр 2019, 18:42

Подскажите формулу по которой можно вычислить quaternion поворот в сторону Vector3 точки. (Именно формулу, а не LookAt и ему подобное.) Спасибо.
AlexandrBuryakov
UNIт
 
Сообщения: 59
Зарегистрирован: 26 янв 2019, 14:36


Re: Компенсация поворота родительского объекта для дочернего

Сообщение AlexandrBuryakov 23 апр 2019, 23:33

Ага, пока использую LookAt.
AlexandrBuryakov
UNIт
 
Сообщения: 59
Зарегистрирован: 26 янв 2019, 14:36

Re: Компенсация поворота родительского объекта для дочернего

Сообщение 1max1 24 апр 2019, 16:53

Объясни для чего это нужно.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Компенсация поворота родительского объекта для дочернего

Сообщение jetyb 25 апр 2019, 07:45

Синтаксис:
Используется csharp
transform.rotation = transform.localRotation;
 
jetyb
Адепт
 
Сообщения: 1486
Зарегистрирован: 31 окт 2011, 17:21

Re: Компенсация поворота родительского объекта для дочернего

Сообщение AlexandrBuryakov 28 апр 2019, 03:22

Мне нужно, что бы объект всегда был повёрнут в точку координат которая может меняться.
При этом меняются только rotation X и Y. Ось Z всегда устанавливается в 0. (Если использовать LookAt)
Я хочу устанавливать Z сам отдельно. Ещё лучше, если он просто сам не будет меняться, если его с самого начала задать один раз.

В принципе не важно какой осью смотреть на объект (позицию). Главное, что бы ось rotation которая всегда устанавливается в 0 не менялась или её можно было бы каждый раз устанавливать. Желательно по оптимизированней код. А то каждые 0.02 предположительно по ~100 - 1000 объектов прогонять так.

Заранее благодарю, если имеется решение. :)
AlexandrBuryakov
UNIт
 
Сообщения: 59
Зарегистрирован: 26 янв 2019, 14:36

Re: Компенсация поворота родительского объекта для дочернего

Сообщение 1max1 28 апр 2019, 03:30

Синтаксис:
Используется csharp
private Transform me;
private Vector3 euler;

// start
me = transform;
euler.z = 45.0f;

// update
me.LookAt(target);
euler.x = me.eulerAngles.x;
euler.y = me.eulerAngles.y;
me.eulerAngles = euler;
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Компенсация поворота родительского объекта для дочернего

Сообщение AlexandrBuryakov 28 апр 2019, 14:16

Да, я похожим образом делаю. Только через vector3.Set()
Z всегда по этому устанавливаются.

Правда если знать как в LookAt производится расчёт, можно избежать лишних действий. Хотя может я не прав считая, что eulerAngle не простая операция.)
AlexandrBuryakov
UNIт
 
Сообщения: 59
Зарегистрирован: 26 янв 2019, 14:36


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

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

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