Вращение объекта относительно текущего вращения

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

Вращение объекта относительно текущего вращения

Сообщение RefractoR 02 июн 2010, 21:34

Снова решил про ховеркары вспомнить. Застопорился на такой проблеме: нужно вращать объект относительно его текущего вращения на определенный угол. Т.е подобную проблему обычно решают через вращение парента + локальное вращение объекта, но я хочу сделать это без иерархии трансформов. Много вариантов перепробовал, но для наглядности приведу такой пример:
Синтаксис:
Используется csharp
curZRot = Mathf.Lerp(curZRot, Input.GetAxisRaw("Horizontal") * zRotAng, Time.deltaTime * zRotSpeed);
transform.rotation = Quaternion.Euler(transform.eulerAngles.x, transform.eulerAngles.y, transform.eulerAngles.z + curZRot);
 

Косяк в том, что тут я добавляю угол к текущему вращению, которое обновляется каждый шаг апдейта, потому и объект вращается продолжительно, а не на определенный угол. Картинка для наглядности (какое вращение нужно):
Изображение
Снова очень надеюсь на вашу помощь. На оф форуме молчат люди (возможно, из-за моего хромающего на обе ноги английского)
RefractoR
UNIт
 
Сообщения: 50
Зарегистрирован: 05 ноя 2009, 16:31
Откуда: Краснодар
  • ICQ

Re: Вращение объекта относительно текущего вращения

Сообщение Golandez 02 июн 2010, 21:43

Вынесите из апдейта,создайте метод и вызывайте когда вам нужно.
Ты нужен только тогда,когда нужен.(С)
Сказать спасибо
Аватара пользователя
Golandez
Пилигрим
 
Сообщения: 1637
Зарегистрирован: 06 авг 2009, 13:55
Откуда: Харьков
Skype: lestardigital

Re: Вращение объекта относительно текущего вращения

Сообщение RefractoR 02 июн 2010, 22:45

Вызов происходит по нажатию кнопки в том же апдейте, что дает такой же эффект...возможно, это коратинами сделать можно, но я с ними толком не умею работать
RefractoR
UNIт
 
Сообщения: 50
Зарегистрирован: 05 ноя 2009, 16:31
Откуда: Краснодар
  • ICQ

Re: Вращение объекта относительно текущего вращения

Сообщение Kann 02 июн 2010, 23:24

может это вам поможет

Синтаксис:
Используется javascript
static function ClampAngle (angle : float, min : float, max : float) {
        if (angle < -360)
                angle += 360;
        if (angle > 360)
                angle -= 360;
        return Mathf.Clamp (angle, min, max);
}
Kann
Старожил
 
Сообщения: 553
Зарегистрирован: 05 ноя 2009, 14:06

Re: Вращение объекта относительно текущего вращения

Сообщение Golandez 02 июн 2010, 23:39

Введите булевую переменную,отвечающую за нажатие кнопки.Введите булевую переменную отвечающую за положение корабля.Вызывайте метод только если корабль не находится в положении "наклон".
P.S. Если я правильно понял это для того чтобы при нажатии на "вправо"/"влево" корабль давал небольшой крен.
Ты нужен только тогда,когда нужен.(С)
Сказать спасибо
Аватара пользователя
Golandez
Пилигрим
 
Сообщения: 1637
Зарегистрирован: 06 авг 2009, 13:55
Откуда: Харьков
Skype: lestardigital

Re: Вращение объекта относительно текущего вращения

Сообщение Multirezonator 03 июн 2010, 06:36

Судя по изображению в первом посте, для для абсолютного вращения относительно текущего можно использовать
transform.RotateAround(Vector3.forward, curZRot);
где curZRot угол в радианах на который нужно повернуть объект относительно положения объекта в момент вызова метода(угол на который бы Вы поворачивали дополнительный трансформ).
Скрытый текст:



Аватара пользователя
Multirezonator
UNITрон
 
Сообщения: 248
Зарегистрирован: 15 фев 2010, 16:12
Откуда: Украина, Луганск
  • Сайт

Re: Вращение объекта относительно текущего вращения

Сообщение RefractoR 03 июн 2010, 13:38

Всем спасибо за советы) нашел интересное решение своей проблемы. Дело в том, что я работаю над физикой летательного объекта, который парит над землей на заданном расстоянии. Сила, требуемая для поднятия объекта над землей рассчитывается по четырем лучам, исходящим из крайних точек баунд бокса объекта. Я вспомнил, что если эту подъемную силу на одних точках увеличить, а на противоположных точках уменьшить, то засчет разности сил получится крен. Проверил, работает очень плавно и при любых наклонах. Еще буду проводить тесты, но пока данное решение работает отлично. Пруф код:
Синтаксис:
Используется csharp
Vector3 flpLift = flpHit.distance > (distAboveGround + 1.0f) ? -Vector3.up * inAirGravity : (upAxis * ((distAboveGround + Input.GetAxis("Horizontal") * zRotAmount) - flpHit.distance) * hovReactForce) - flpDamping;
Vector3 blpLift = blpHit.distance > (distAboveGround + 1.0f) ? -Vector3.up * inAirGravity : (upAxis * ((distAboveGround + Input.GetAxis("Horizontal") * zRotAmount) - blpHit.distance) * hovReactForce) - blpDamping;
Vector3 frpLift = frpHit.distance > (distAboveGround + 1.0f) ? -Vector3.up * inAirGravity : (upAxis * ((distAboveGround + Input.GetAxis("Horizontal") * -zRotAmount) - frpHit.distance) * hovReactForce) - frpDamping;
Vector3 brpLift = brpHit.distance > (distAboveGround + 1.0f) ? -Vector3.up * inAirGravity : (upAxis * ((distAboveGround + Input.GetAxis("Horizontal") * -zRotAmount) - brpHit.distance) * hovReactForce) - brpDamping;
 

flpHit, blpHit, frpHit, brpHit - лучи, через которые вычисляю подъемную силу
RefractoR
UNIт
 
Сообщения: 50
Зарегистрирован: 05 ноя 2009, 16:31
Откуда: Краснодар
  • ICQ


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

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

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