Синхронизация физики и обычного трансформа

Физика в Unity

Синхронизация физики и обычного трансформа

Сообщение RefractoR 05 ноя 2009, 16:47

Всем привет! Столкнулся с проблемой синхронизации физики..написал простенькое управление ховеркаром (базовая физика для него написана уже) для теста. Принцип простой: движение вперед при применении RelativeForce + вращение по мышке. Проблема заключается в том, что когда я переношу вращение в Update, оно смотрится отлично, но объект при движении сильно дергается, если же оставляю вращение в FixedUpdate, то оно дергается. Вращения ригид боди заморожены, включена интерполяция физики. Как видно из нижеприведенного кода, ховеркар всегда повернут относительно поверхности (нормаль через рэйкаст, потом через кватернион полученый угол + текущий угол).
Код: Выделить всё
import UnityEngine
[RequireComponent (Rigidbody)]

class HoverControls (MonoBehaviour):
   
   public accForce as single = 75.0
   public maxSpeed as single = 100.0
   
   public rotYSens as single = 8.0
   public rotYSpeed as single = 6.0

   public distToGround as single = 2.0
   public surfRotSpeed as single = 0.25
   
   angY as single
   
   def Update ():
      
      mXAxis as single = Input.GetAxis('Mouse X')
      
      angY = Mathf.SmoothStep(angY, mXAxis*rotYSens, Time.deltaTime*rotYSpeed)
      transform.rotation *= Quaternion.AngleAxis(angY, Vector3.up)
   
   def FixedUpdate ():
      
      vertAxis as single = Input.GetAxis('Vertical')

      velVec as Vector3 = Vector3(rigidbody.velocity.x, 0.0, rigidbody.velocity.z)
      vel as single = velVec.magnitude
      
      if vertAxis > 0.0:
         if vel < maxSpeed:
            rigidbody.AddRelativeForce(-Vector3.right*accForce*vertAxis)
      
      hitNorm as Vector3
      surfAng as Quaternion
      newAng as Quaternion
      
      centerRayHit as RaycastHit
      
      Physics.Raycast(transform.position, -Vector3.up, centerRayHit)
      
      hitNorm = centerRayHit.normal
      surfAng = Quaternion.FromToRotation (Vector3.up, hitNorm)
      
      newAng = surfAng*Quaternion.AngleAxis(transform.eulerAngles.y, Vector3.up)
      transform.rotation = Quaternion.Slerp(transform.rotation, newAng, surfRotSpeed)

Очень надеюсь на вашу помощь, т.к опыта работы в Юнити у меня немного...
RefractoR
UNIт
 
Сообщения: 50
Зарегистрирован: 05 ноя 2009, 16:31
Откуда: Краснодар
  • ICQ

Re: Синхронизация физики и обычного трансформа

Сообщение Neodrop 05 ноя 2009, 17:43

Код: Выделить всё
rigidbody.AddRelativeForce(-Vector3.right*accForce*vertAxis*Time.deltaTime)


Попробуйте так. Но увеличьте силу, умножение на время, сильно снизит её. Таким образом вы сгладите разницу между кадрами.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Синхронизация физики и обычного трансформа

Сообщение RefractoR 05 ноя 2009, 17:50

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

Re: Синхронизация физики и обычного трансформа

Сообщение Neodrop 05 ноя 2009, 17:55

Сделайте маленький Проект-пример.
Так не понятно....
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Синхронизация физики и обычного трансформа

Сообщение RefractoR 05 ноя 2009, 18:04

ураааа!!! :ymparty: я нашел решение)) сейчас все работает отлично) Надо было поступить так (т.е через одно вращение записать все):
Код: Выделить всё
mXAxis as single = Input.GetAxis('Mouse X')
      angY = Mathf.SmoothStep(angY, mXAxis*rotYSens, Time.deltaTime*rotYSpeed)

      newAng = surfAng*Quaternion.AngleAxis(transform.eulerAngles.y, Vector3.up)
      transform.rotation = Quaternion.Slerp(transform.rotation, newAng, surfRotSpeed)*Quaternion.AngleAxis(angY, Vector3.up)

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

Re: Синхронизация физики и обычного трансформа

Сообщение RefractoR 05 ноя 2009, 18:10

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

Re: Синхронизация физики и обычного трансформа

Сообщение Neodrop 05 ноя 2009, 18:17

Выкладывать нужно только папку Assets
А выложить можно на наш FTP
ftp://ftp.unity3d.ru

Есть мнение, что вам нужно считать параметры в FixedUpdate, а двигать в Update

[ftp]ftp://ftp.unity3d.ru[/ftp]
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Синхронизация физики и обычного трансформа

Сообщение RefractoR 05 ноя 2009, 18:49

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

Re: Синхронизация физики и обычного трансформа

Сообщение RefractoR 05 ноя 2009, 19:11

Все, выложил текущую версию управления ftp://ftp.unity3d.ru/Upload/HoverTest/
очень заинтересовал вариант насчет подсчета в FixedUpdate, если получится, выложу новую версию скрипта
RefractoR
UNIт
 
Сообщения: 50
Зарегистрирован: 05 ноя 2009, 16:31
Откуда: Краснодар
  • ICQ

Re: Синхронизация физики и обычного трансформа

Сообщение Neodrop 05 ноя 2009, 19:35

На всякий случай напомню, что отличие Update от FixedUpdate в том, что Update выполняется в каждом кадре, а FixedUpdate - вызывается из отдельного потока, каждые 20 миллисекунд.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Синхронизация физики и обычного трансформа

Сообщение DzumoHu4 06 ноя 2009, 22:19

Neodrop писал(а):На всякий случай напомню, что отличие Update от FixedUpdate в том, что Update выполняется в каждом кадре, а FixedUpdate - вызывается из отдельного потока, каждые 20 миллисекунд.


А что губительнее для производительности?(что больше кушает ФПС) Покадровый просчёт либо фиксированый порогом 20 мс?
DzumoHu4
UNец
 
Сообщения: 46
Зарегистрирован: 02 июн 2009, 20:02

Re: Синхронизация физики и обычного трансформа

Сообщение Neodrop 06 ноя 2009, 23:05

Ну конечно лучше считать реже, по-возможности.
Но FixedUpdate не столько для этого, сколько для расчёта и проведения физических воздействия на объекты. Это цикл физики в Unity. Кстати, управляемый. Его частоту можно менять по нуждам вашего проекта. В настройках Проекта, Time.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Синхронизация физики и обычного трансформа

Сообщение RefractoR 07 ноя 2009, 14:23

эхх...проблема осталась..что я только не пробовал, не удается исправить глюк с дрожанием(( сделал ехе, там еще сильнее дрожит физика (даже при движении легкое подрагивание наблюдается, хоть и включена интерполяция физики). Я уже близок к отчаянию... :((
сылка на ехе http://depositfiles.com/files/a55aekxia
сорри, что не на фтп (туда туговато заливается с моего компа)
RefractoR
UNIт
 
Сообщения: 50
Зарегистрирован: 05 ноя 2009, 16:31
Откуда: Краснодар
  • ICQ

Re: Синхронизация физики и обычного трансформа

Сообщение Neodrop 07 ноя 2009, 16:58

Сделайте архив Проекта или отдельный Проект - демку (тоже архив со всем кодом и префабами). Без наличия Проекта на руках, ну никак не понять, что там у вас не так...
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Синхронизация физики и обычного трансформа

Сообщение ziat 07 ноя 2009, 17:35

Попробуй заменить Transform.Rotation на rigidbody.AddRelativeTorque ( Vector3(ось вокруг которой вращаем) * скорость * Time.deltaTime, ForceMode.VelocityChange);

Похожие глюки у меня были в моём проекте когда поворот осуществлялся через трансформ ротатион, а движение через адфорс, потом когда заменил трансформ ротатион на ту фигню(те силу которая вращает объект, вокруг оси), то такого рода торможения исчезли.
Только несколько изменений надо будет внести в ригидбоди, Добавить обязательно Angular Drag (желательно больше 3-х, зотя для такого характера игры я поставил бы ещё больше), в противном случае вращение будет вечно либо слишком долго и убрать галку с Freez Rotation
ziat
UNITрон
 
Сообщения: 199
Зарегистрирован: 07 окт 2009, 21:28
  • Сайт

След.

Вернуться в PhysX

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

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