RotateAround and physX

Физика в Unity

RotateAround and physX

Сообщение Calibians 19 окт 2018, 14:45

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

Но при использовании transform.Rotate
Around наблюдается ступенчатость изменения позиции по высоте и отсутствует "разгон".
Вопрос в следующем, как мне заставить объект вращаться посредством того же addforce?
Последний раз редактировалось Calibians 19 окт 2018, 22:30, всего редактировалось 1 раз.
Calibians
UNец
 
Сообщения: 8
Зарегистрирован: 19 окт 2018, 14:40

Re: RotateAround ans physX

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

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

Re: RotateAround ans physX

Сообщение Calibians 19 окт 2018, 14:53

1max1 писал(а):https://docs.unity3d.com/ScriptReference/Rigidbody.AddTorque.html

Я читал это и пробовал. Но как ни странно объект вращается вокруг своей оси, а не вокруг цели. Либо я не понимаю как правильно использовать.
Calibians
UNец
 
Сообщения: 8
Зарегистрирован: 19 окт 2018, 14:40

Re: RotateAround ans physX

Сообщение 1max1 19 окт 2018, 15:03

вокруг цели

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

Синтаксис:
Используется 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);
}
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: RotateAround ans physX

Сообщение Calibians 19 окт 2018, 15:17

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

Re: RotateAround ans physX

Сообщение 1max1 19 окт 2018, 19:19

Первая часть не работает. Объект стоит на месте.

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

А тебе что было нужно?
Еще можно попробовать джоинтами крутить, к примеру:
https://docs.unity3d.com/ScriptReferenc ... motor.html
https://docs.unity3d.com/Manual/class-HingeJoint.html
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: RotateAround ans physX

Сообщение Calibians 19 окт 2018, 20:51

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);
                }


С джоинтами пробовал играться, но на наклонных поверхностях происходит какая то вакханалия в перемещениях.
Calibians
UNец
 
Сообщения: 8
Зарегистрирован: 19 окт 2018, 14:40

Re: RotateAround ans physX

Сообщение 1max1 19 окт 2018, 21:10

А рывки происходят, когда дрон поднимается или спускается с горки?

п.с. А что если поднимать/опускать дрона не через аддфорс? Или это принципиально?
Синтаксис:
Используется 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));
}
 
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: RotateAround ans physX

Сообщение Calibians 19 окт 2018, 21:53

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

Re: RotateAround ans physX

Сообщение 1max1 19 окт 2018, 22:02

и чтоб было - чем больше дистанция до указанной точки, тем сильнее толкает вверх

Попробуй так :-?
Синтаксис:
Используется 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));
}
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: RotateAround ans physX

Сообщение Calibians 19 окт 2018, 22:15

1max1 писал(а):Попробуй так :-?

Происходит вот что)
Изображение
Calibians
UNец
 
Сообщения: 8
Зарегистрирован: 19 окт 2018, 14:40

Re: RotateAround ans physX

Сообщение 1max1 19 окт 2018, 22:18

Гравитацию придется убрать, но тогда и физика наверное нагнется)
Придется искать другое решение))
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: RotateAround ans physX

Сообщение Calibians 19 окт 2018, 22:21

У меня идей просто уже нет. Мне эта часть проблемы сниться начала уже. :((
Calibians
UNец
 
Сообщения: 8
Зарегистрирован: 19 окт 2018, 14:40

Re: RotateAround ans physX

Сообщение 1max1 19 окт 2018, 22:28

Ну забей на физику, сделай без нее, ты ведь не собираешь реалистично швырять своего дрона об стену))
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: RotateAround and physX

Сообщение Calibians 19 окт 2018, 22:31

Да хотел более реалистичное поведение и плавность движений. Но походу действительно не судьба)
Calibians
UNец
 
Сообщения: 8
Зарегистрирован: 19 окт 2018, 14:40

След.

Вернуться в PhysX

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

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