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

RotateAround and physX

СообщениеДобавлено: 19 окт 2018, 14:45
Calibians
Привет ребята. Может подскажет кто-то как решить данную задачу. 5 день бьюсь и не могу решить.
Есть объект который удерживается на указанной высоте посредством addforce и реагирует на изменения ландшафта или объектов над которыми находится(т.е поднимается или опускается).
Есть цель, вокруг которой этот объект должен вращаться. Для этого я использовал следующее
Синтаксис:
Используется csharp
transform.RotateAround (target.position, new Vector3(0, height, 0), 20 * Time.deltaTime);

Но при использовании transform.Rotate
Around наблюдается ступенчатость изменения позиции по высоте и отсутствует "разгон".
Вопрос в следующем, как мне заставить объект вращаться посредством того же addforce?

Re: RotateAround ans physX

СообщениеДобавлено: 19 окт 2018, 14:49
1max1

Re: RotateAround ans physX

СообщениеДобавлено: 19 окт 2018, 14:53
Calibians
1max1 писал(а):https://docs.unity3d.com/ScriptReference/Rigidbody.AddTorque.html

Я читал это и пробовал. Но как ни странно объект вращается вокруг своей оси, а не вокруг цели. Либо я не понимаю как правильно использовать.

Re: RotateAround ans physX

СообщениеДобавлено: 19 окт 2018, 15:03
1max1
вокруг цели

А-а-а, ну тут тогда так:

Синтаксис:
Используется csharp
float power = 30.0f;
Vector3 direction = object.transform.position - transform.position;
Vector3 cross = Vector3.Cross(direction, Vector3.up);
Vector3 force = cross.Normalized * power;
rb.AddForce(force);

object - это объект, вокруг которого нужно вращаться.
transform.position - позиция объекта, который нужно вращать.

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

п.с.с Еще можно попробовать через тот же эраунд, но с постепенным увеличением скорости.
Синтаксис:
Используется csharp
float power = 1.0f;

void Update()
{
    power += 2.0f * Time.deltaTime;
    transform.RotateAround(target.position, Vector3.up, power * Time.deltaTime);
}

Re: RotateAround ans physX

СообщениеДобавлено: 19 окт 2018, 15:17
Calibians
1max1 , Первая часть не работает. Объект стоит на месте. А если в апдейте добавить rotateAround, то работает так же как и до этого работало, с разницей что не имеет постоянной скорости сразу.

Re: RotateAround ans physX

СообщениеДобавлено: 19 окт 2018, 19:19
1max1
Первая часть не работает. Объект стоит на месте.

¯\_(ツ)_/¯
с разницей что не имеет постоянной скорости сразу

А тебе что было нужно?
Еще можно попробовать джоинтами крутить, к примеру:
https://docs.unity3d.com/ScriptReferenc ... motor.html
https://docs.unity3d.com/Manual/class-HingeJoint.html

Re: RotateAround ans physX

СообщениеДобавлено: 19 окт 2018, 20:51
Calibians
1max1 писал(а):А тебе что было нужно?

Попробую объяснить на пальцах. Есть техника, которая выступает в качестве цели для дрона/сканера/зонда. У этого дрона/сканера/зонда есть ряд функций. Основной функцией является следование за целью держа дистанцию и высоту своего полета.
Когда игрок бездействует и машина стоит на месте, дрон/сканер/зонд через определенное время переходит в другой режим. Выбирается рандомный метод. Это может быть, плавная посадка и отключение двигателей, рандомное перемещение по точкам вокруг техники (не по кругу), вращение вокруг своей оси, проверка двигателей и т.д. Застопорился конкретно на том чтоб он вращался вокруг машины с условием соблюдения указанной дистанции.
transform.rotatearound частично решил проблему, дрон вращается вокруг машины.
Но есть одно большое но, когда под дроном оказывается какой то предмет ландшафта или сам ландшафт имеет разную высоту со всех сторон машины, перемещение по вертикали происходит рывками или ступенчато. Отсутствует плавность смены высоты.
Так удерживается позиция по высоте:
Синтаксис:
Используется csharp
Ray ray = new Ray (transform.position, -transform.up);
                RaycastHit hit;
                if (Physics.Raycast (ray, out hit, height)) {
                        float pHeight = (height - hit.distance) / height;
                        Vector3 apForce = Vector3.up * pHeight * force;
                        rb.AddForce (apForce, ForceMode.Acceleration);
                }

А так дрон следует за машиной:
Синтаксис:
Используется csharp
if (Vector3.Distance(transform.position, target.position) <= targetDistance) {
                        Vector3 tarDir = target.transform.position - transform.position;
                        tarDir.y = 0;
                        transform.rotation = Quaternion.Slerp (transform.rotation, Quaternion.LookRotation (tarDir), 2 * Time.fixedDeltaTime);

                } else {
                        Vector3 tarDir = target.transform.position - transform.position;
                        transform.rotation = Quaternion.Slerp (transform.rotation, Quaternion.LookRotation (tarDir), 1 * Time.fixedDeltaTime);
                        if (Vector3.Distance (transform.position, target.position) > targetDistance)
                                rb.AddForce ((target.position - transform.position) * speed * Time.fixedDeltaTime);
                }


С джоинтами пробовал играться, но на наклонных поверхностях происходит какая то вакханалия в перемещениях.

Re: RotateAround ans physX

СообщениеДобавлено: 19 окт 2018, 21:10
1max1
А рывки происходят, когда дрон поднимается или спускается с горки?

п.с. А что если поднимать/опускать дрона не через аддфорс? Или это принципиально?
Синтаксис:
Используется csharp
Ray ray = new Ray(transform.position, Vector3.down);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, height))
{
    rb.MovePosition(Vector3.Lerp(rb.position, hit.point + Vector3.up * height, Time.deltaTime));
}
 

Re: RotateAround ans physX

СообщениеДобавлено: 19 окт 2018, 21:53
Calibians
Эм... зависит от градуса наклона. Чем выше градус спуска/подъема тем больше заметны рывки. Рывки происходят и на спуске и на подъеме. Если честно, не додумался как реализовать подъем не используя аддфорс и чтоб было - чем больше дистанция до указанной точки, тем сильнее толкает вверх. Поэтому не могу ответить корректно, принципиально это или нет.

Re: RotateAround ans physX

СообщениеДобавлено: 19 окт 2018, 22:02
1max1
и чтоб было - чем больше дистанция до указанной точки, тем сильнее толкает вверх

Попробуй так :-?
Синтаксис:
Используется csharp
Ray ray = new Ray(transform.position, Vector3.down);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, height))
{
    float pHeight = (height - hit.distance) / height;
    rb.MovePosition(Vector3.Lerp(rb.position, hit.point + Vector3.up * height, pHeight * Time.deltaTime));
}

Re: RotateAround ans physX

СообщениеДобавлено: 19 окт 2018, 22:15
Calibians
1max1 писал(а):Попробуй так :-?

Происходит вот что)
Изображение

Re: RotateAround ans physX

СообщениеДобавлено: 19 окт 2018, 22:18
1max1
Гравитацию придется убрать, но тогда и физика наверное нагнется)
Придется искать другое решение))

Re: RotateAround ans physX

СообщениеДобавлено: 19 окт 2018, 22:21
Calibians
У меня идей просто уже нет. Мне эта часть проблемы сниться начала уже. :((

Re: RotateAround ans physX

СообщениеДобавлено: 19 окт 2018, 22:28
1max1
Ну забей на физику, сделай без нее, ты ведь не собираешь реалистично швырять своего дрона об стену))

Re: RotateAround and physX

СообщениеДобавлено: 19 окт 2018, 22:31
Calibians
Да хотел более реалистичное поведение и плавность движений. Но походу действительно не судьба)