Страница 1 из 1

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

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

ИзображениеИзображение
Изображение
Изображение

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

СообщениеДобавлено: 17 апр 2019, 16:40
1max1
Vector3 offset;
//start
offset = transform.position - parent.position;
//update
transform.position = parent.position + offset;

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

СообщениеДобавлено: 17 апр 2019, 16:52
AlexandrBuryakov
Эх... Я немного слукавил, по этому не знаю как переложить на вот что:
Я хочу, что бы коллайдер смещённый от центра, всегда был направлен в одну сторону вне зависимости от поворота объекта на котором он закреплён.
Изображение

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

СообщениеДобавлено: 17 апр 2019, 17:21
1max1
Синтаксис:
Используется 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);
    }
}
 

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

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

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

СообщениеДобавлено: 17 апр 2019, 18:22
1max1
sc.center = transform.InverseTransformVector(offset + rb.velocity.normalized * fValue);

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

СообщениеДобавлено: 17 апр 2019, 18:25
AlexandrBuryakov
Падаю ниц перед вашей мудростью. ^:)^

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

СообщениеДобавлено: 23 апр 2019, 18:42
AlexandrBuryakov
Подскажите формулу по которой можно вычислить quaternion поворот в сторону Vector3 точки. (Именно формулу, а не LookAt и ему подобное.) Спасибо.

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

СообщениеДобавлено: 23 апр 2019, 20:17
1max1

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

СообщениеДобавлено: 23 апр 2019, 23:33
AlexandrBuryakov
Ага, пока использую LookAt.

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

СообщениеДобавлено: 24 апр 2019, 16:53
1max1
Объясни для чего это нужно.

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

СообщениеДобавлено: 25 апр 2019, 07:45
jetyb
Синтаксис:
Используется csharp
transform.rotation = transform.localRotation;
 

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

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

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

Заранее благодарю, если имеется решение. :)

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

СообщениеДобавлено: 28 апр 2019, 03:30
1max1
Синтаксис:
Используется 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;

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

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

Правда если знать как в LookAt производится расчёт, можно избежать лишних действий. Хотя может я не прав считая, что eulerAngle не простая операция.)