Slerp + LookAt

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

Slerp + LookAt

Сообщение WhiteDevil 08 мар 2011, 14:39

Всем хело. Делаю игрулю, где игрок управляет танком от 3 лица. Он мышкой нажимает по точке в мире и танк направляет на точку башню и стреляет по ней.
Код:

Синтаксис:
Используется javascript
                var lookVector : Vector3 = hit.point - turretTransf.position;  
       
                if (turretTransf.rotation != turretLookQuatern)   {
                        var lookTurret : Vector3 = Vector3(lookVector.x, 0.0f, lookVector.z);
                        turretLookQuatern = Quaternion.LookRotation(lookTurret);
                        turretTransf.rotation = Quaternion.Slerp(turretTransf.rotation, turretLookQuatern, 0.05f);
                }


Проблема в том, что лук очень неточен. Игрок может сам танк как вращать, так и двигать. Если в состоянии покоя башня направляется прямо по цели, то вращая\перемещая сам танк, башня направляется с большой погрешностью, градусов эдак 10-15. Все отлично конечно, когда значение интерполяции высокое - 1.0. Соответственно вопрос: как сделать и точно и плавно. Спасибо :)
Аватара пользователя
WhiteDevil
UNIверсал
 
Сообщения: 455
Зарегистрирован: 19 дек 2010, 15:55

Re: Slerp + LookAt

Сообщение DAlex 09 мар 2011, 00:26

Плавно! Точно???
Синтаксис:
Используется csharp
turretTransf.rotation = Quaternion.Slerp(turretTransf.rotation, turretLookQuatern, Time.deltaTime * speed);
Аватара пользователя
DAlex
UNец
 
Сообщения: 20
Зарегистрирован: 10 фев 2011, 00:05
  • ICQ

Re: Slerp + LookAt

Сообщение WhiteDevil 09 мар 2011, 00:53

Еще раз. Мне нужно контролить 2 фактора: скорость вращения и точность. Значение слерпа контролит сразу оба. Вы либо даете большое значение - получаете точно, но очень быстро. Ну и наоборот.
Аватара пользователя
WhiteDevil
UNIверсал
 
Сообщения: 455
Зарегистрирован: 19 дек 2010, 15:55

Re: Slerp + LookAt

Сообщение DAlex 09 мар 2011, 08:40

Из кода не видно, что танк доворачивает башню , а потом производит выстрел...
Синтаксис:
Используется csharp
if (turretTransf.rotation == turretLookQuatern)
{
//выстрел
}
Аватара пользователя
DAlex
UNец
 
Сообщения: 20
Зарегистрирован: 10 фев 2011, 00:05
  • ICQ

Re: Slerp + LookAt

Сообщение WhiteDevil 09 мар 2011, 14:35

Он стреляет через отведенное ему время. По сути вопрос стоял в том, есть ли альтернатива слерпу. В моем случае, видимо танк вращает башню быстрее чем это делает слерп. И, насколько я понял, если нужно интерполировать большой кватернион (поворот на 180 градусов например), то первые там например 150 он прокрутит очень быстро, а затем замедляется. И чем меньше угол, тем меньшие углы он берет. Мой случай - скорее равномерное вращение, а не слерп. Какбэ такое изготовить...
Аватара пользователя
WhiteDevil
UNIверсал
 
Сообщения: 455
Зарегистрирован: 19 дек 2010, 15:55

Re: Slerp + LookAt

Сообщение DAlex 09 мар 2011, 18:05

Мой случай - скорее равномерное вращение

Time.deltaTime * speed

Погрешность скорее всего из-за постоянно изменяющейся turretTransf.position.

Больше кода!
-как строишь луч?
рисуй, смотри - Debug.DrawLine
-как производится выстрел?
Аватара пользователя
DAlex
UNец
 
Сообщения: 20
Зарегистрирован: 10 фев 2011, 00:05
  • ICQ


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

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

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