Виртуальный акселерометр в Unity

#unity3d #accelerometer

#unity3d #акселерометр

Вопрос:

Я видел много руководств о том, как использовать акселерометр смартфона в качестве входных данных для управления объектом в Unity, но возможно ли смоделировать трехосный акселерометр в самом Unity?

Комментарии:

1. Вы хотите получить ускорение объекта в Unity или IRL?

2. Объект в Unity @DanielGeyfman

3. Объект — это transform.up ваш источник истины, только .Dot() он соответствует мировым осям, которые вас интересуют.

4. @Immersive но acceleration это не то же самое, что гироскоп, верно? @OP что именно вы имеете в виду? Локальное или глобальное перемещение объекта? -> просто отслеживайте его положение в последнем кадре и сравнивайте его с текущим

5. @derHugo, традиционно акселерометр используется для отслеживания ориентации телефона, поскольку он «просто работает» из-за силы тяжести, тогда как гироскопы требуют некоторых шагов инициализации и калибровки. Но это для вращательного 3DOF. Если OP также хочет перевод, это, очевидно, немного отличается.

Ответ №1:

По сути, вы можете получить «ускорение» (иначе говоря, скорость) объекта, разделив пройденное расстояние на время. В данном случае это означает разбиение Вектора3 на отдельные переменные xyz, затем вычисление скорости для каждой и помещение их обратно в Вектора3.

Код:

 Vector3 lastPos;

void Start() {
  lastPos = transform.position;
}

void Update() {
  // define velocities as currentPos-lastPos(change) over time per frame, which gets velocity this frame... will be saved every frame
  float xVelocity = (transform.position.x-lastPos.x)/Time.deltaTime;
  float yVelocity = (transform.position.y-lastPos.y)/Time.deltaTime;
  float zVelocity = (transform.position.z-lastPos.z)/Time.deltaTime;
  
  // Do stuff with individual velocities(xyz)
  // ...
  // or store in Vector3
  Vector3 totalVelocity = new Vector3(xVelocity, yVelocity, zVelocity);
  // Do stuff with total velocity
  // ...

  // Set lastPos to transform.position (WARNING: Only do after you are done calculating velocity
  
  lastPos = transform.position;
}