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

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

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

Сообщение Diablero 24 янв 2013, 14:33

Доброго времени суток! Столкнулся с проблемой. Я имитирую гравитацию, при этом хочу, чтобы перс всегда приземлялся "на ноги", для чего хочу каждый кадр ориентировать вектор -transform.up объекта игрока по направлению вектора гравитации. Вот код. Всего две строки. В соответствии с мануалом всё должно работать, но у меня вместо поворота "низа" объекта к сфере "Sphere1", объект начинает "колбасить". Просьба помочь с решением задачи, иначе вскоре начнёт колбасить меня @-) . Заранее спасибо за помощь:)
Синтаксис:
Используется csharp
public class CustomFPC : MonoBehaviour {
       
        //Вектор гравитации
        private Vector3 gravity;
       
        void Start () {
                gravity=GameObject.Find("Sphere1").transform.position-transform.position;
        }
       
        void Update () {
                transform.rotation = Quaternion.FromToRotation(-transform.up, gravity);
        }
}
Diablero
UNец
 
Сообщения: 7
Зарегистрирован: 12 янв 2013, 15:06

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

Сообщение gturk 24 янв 2013, 22:31

надо домножать, а не присваивать
Аватара пользователя
gturk
UNITрон
 
Сообщения: 239
Зарегистрирован: 01 апр 2012, 18:49

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

Сообщение Receptor 24 янв 2013, 23:24

может так?
Синтаксис:
Используется csharp
gravity=(GameObject.Find("Sphere1").transform.position-transform.position).normalized;
 
_VK.com
Аватара пользователя
Receptor
Адепт
 
Сообщения: 1706
Зарегистрирован: 22 ноя 2011, 07:09
Откуда: Волгодонск

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

Сообщение Nialit 25 янв 2013, 00:05

transform.rotation *= Quaternion.FromToRotation(-Vector3.up, gravity);
Nialit
UNец
 
Сообщения: 25
Зарегистрирован: 21 янв 2013, 04:11

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

Сообщение Nialit 25 янв 2013, 00:22

Diablero писал(а):
Синтаксис:
Используется csharp
        void Update () {
                transform.rotation = Quaternion.FromToRotation(-transform.up, gravity);
        }
}


Во-первых, да, если ваш ротэйшн меняется(не статичен) -- всегда домножайте. Причем порядок умножения имеет значение. А он у вас меняется(ротэйшн). Потом, если вы задаете поворот с transform.up, то нужно понимать, что в следующий кадр ваш transform.up будет другим, и поворот пересчитается снова, и будет снова колбасня. Только в одном месте в кватернионах мне пригодилась ось трансформа - в AngleAxis в качестве оси поворота. Так что будьте осторожны :) Кватернионы - это жестоко)
Nialit
UNец
 
Сообщения: 25
Зарегистрирован: 21 янв 2013, 04:11

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

Сообщение Diablero 25 янв 2013, 00:25

gturk писал(а):надо домножать, а не присваивать


О, спасибо! Работает)))
Diablero
UNец
 
Сообщения: 7
Зарегистрирован: 12 янв 2013, 15:06

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

Сообщение Diablero 25 янв 2013, 11:16

Nialit писал(а):Во-первых, да, если ваш ротэйшн меняется(не статичен) -- всегда домножайте.

Странно, что в API reference приведён пример, в котором вместо домножения они присваивают кватернион вращения...

Nialit писал(а):А он у вас меняется(ротэйшн). Потом, если вы задаете поворот с transform.up, то нужно понимать, что в следующий кадр ваш transform.up будет другим, и поворот пересчитается снова, и будет снова колбасня.

Подскажите, пожалуйста, как правильно сориентировать объект вдоль вектора...
Diablero
UNец
 
Сообщения: 7
Зарегистрирован: 12 янв 2013, 15:06

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

Сообщение gturk 25 янв 2013, 11:29

Вы за деревьями леса не видите. Есть 2 пути
1) Заранее рассчитать rotation в котором должен будет находиться ваш объект. В этом случае, естественно, нужно присваивать
2)Рассчитать разницу между текущим положением и желаемым (что вы и делали функцией FromToRotation). В этом случае нужно домножать
Аватара пользователя
gturk
UNITрон
 
Сообщения: 239
Зарегистрирован: 01 апр 2012, 18:49

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

Сообщение Nialit 25 янв 2013, 16:16

Diablero писал(а):
Nialit писал(а):Во-первых, да, если ваш ротэйшн меняется(не статичен) -- всегда домножайте.

Странно, что в API reference приведён пример, в котором вместо домножения они присваивают кватернион вращения...


А вы обратите внимание, что в API пример не в Update(), а Example(). Т.е вызов происходит единожды, или когда нужно - тогда все нормально :)


Diablero писал(а):
Nialit писал(а):А он у вас меняется(ротэйшн). Потом, если вы задаете поворот с transform.up, то нужно понимать, что в следующий кадр ваш transform.up будет другим, и поворот пересчитается снова, и будет снова колбасня.

Подскажите, пожалуйста, как правильно сориентировать объект вдоль вектора...


Так я вам выше писал, как это сделать, дублирую:
transform.rotation *= Quaternion.FromToRotation(-Vector3.up, gravity);
Nialit
UNец
 
Сообщения: 25
Зарегистрирован: 21 янв 2013, 04:11


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

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

Сейчас этот форум просматривают: Google [Bot] и гости: 15