Управление гироскопом андроид unity

Gyroscope

class in UnityEngine

Success!

Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable.

Submission failed

For some reason your suggested change could not be submitted. Please try again in a few minutes. And thank you for taking the time to help us improve the quality of Unity Documentation.

Description

Interface into the Gyroscope.

Use this class to access the gyroscope. The example script below shows how the Gyroscope class can be used to view the orientation in space of the device.

Underlying sensors used for data population:

Android: Gravity, Linear Acceleration, Rotation Vector. More information.

iOS: Gyroscope, Device-Motion. More information.


iOS Screen-shot showing +Z, +Y and -X.

Properties

attitude Returns the attitude (ie, orientation in space) of the device.
enabled Sets or retrieves the enabled status of this gyroscope.
gravity Returns the gravity acceleration vector expressed in the device’s reference frame.
rotationRate Returns rotation rate as measured by the device’s gyroscope.
rotationRateUnbiased Returns unbiased rotation rate as measured by the device’s gyroscope.
updateInterval Sets or retrieves gyroscope interval in seconds.
userAcceleration Returns the acceleration that the user is giving to the device.

Is something described here not working as you expect it to? It might be a Known Issue. Please check with the Issue Tracker at issuetracker.unity3d.com.

Copyright ©2021 Unity Technologies. Publication Date: 2021-11-26.

Источник

Управление гироскопом андроид unity

Гироскоп дает разработчикам широкий спектр интересных вариаций управления. Но когда доходит дело до его интеграции и реализации контроллера камеры, просходит много странных и волшебных вещей. Разработчики имеют дело с различными ориентациями устройств, исходными позициями камеры и кватернионами. Я буду рад поделиться своим опытом и описать, как мы решили эти проблемы. Будем надеяться, что это позволит сэкономить усилия и нервы тех, которые работают с гироскопом впервые.

В моем примере я хочу показать, как реализовать следующие функции контроллера камеры:

1. Экран устройства должен работать как «окно» в виртуальный мир. Поворачивая девайс, пользователь должен осматривать этот мир.
2. Контроллер должен поддерживать функцию автоповорота и поддерживать все ориентации устройства.
3. Вы сможете отделить контроллер от камеры, изменить ее вращение и положение из кода (например проиграть анимацию камеры), а затем прикрепить контроллер обратно без заметных заминок.
4. Верхняя ось виртуального мира будет соотвествовать верхней оси в реальном мире и будет осуществлена рекалибровка горизонтального вращения.

Первая проблема с которой мы столкнемся это разный тип систем координат, использующихся в iOS устройствах и Unity3d: левосторонняя и правосторонняя. Для того чтобы преобразовать кватернионы из одной системы в другую, используем следующую функцию:

Следующая строка рассчитывает вращение камеры:

Читайте также:  X plore для андроид инструкция по применению

Следующая проблема — поддержка различных ориентаций устройства (была решена разработчиками Unity в четвертой версии). Фиксируем кватернионы для каждой ориентации:

Далее — обновленная функция для расчета вращения камеры:

Контроллер должен обновлять вращение камеры, ссылаясь на базовое вращение девайса и сбрасывать базовое вращение в горизонтальную плоскость. Это означает, что если пользователь запускает приложение, указывая устройством на север, игровая камера будет поворачиватся относительно «виртуального» севера. Камера будет показывать данное направление. Ниже приводится новая функция, которая принимает во внимание базовое вращение камеры и устройства.

Расчет cameraBase и referanceRotation немного сложнее. Два основных препятствия:

1. При расчет referenceRotation нужно принять во внимание текущую ориентацию устройства.
2. При расчете cameraBase нужно принять во внимание только вращение вокруг верхней оси.

Точные функции вы найдете в прикрепленном примере.

И последнее, сглаживание вращения камеры:

200?’200px’:»+(this.scrollHeight+5)+’px’);»>
transform.rotation = Quaternion.Slerp(transform.rotation, cameraBase * ( ConvertRotation(referanceRotation *
Input.gyro.attitude) * GetRotFix()), lowPassFilterFactor);

Теперь добавим две функции: AttachGyro и DetachGyro. Первая позволит включить контроллер и пересчитать все базовые повороты. Вторая — отключает контроллер.

Контроллер готов. К статье прикреплен рабочий пример.

Источник

Mobile device input

On mobile devices, the Input class offers access to touchscreen, accelerometer and geographical/location input.

Доступ к клавиатуре на мобильных устройствах обеспечивается через iOS keyboard.

Multi-touch screen

The iPhone, iPad and iPod Touch devices are capable of tracking up to five fingers touching the screen simultaneously. You can retrieve the status of each finger touching the screen during the last frame by accessing the Input.touches property array.

Android устройства не имеют определенного лимита на количество нажатий, которое можно отслеживать. Он колеблется от устройства к устройству и может варьироваться от одного-двух нажатий на старых устройствах, до пяти нажатий на некоторых новых.

Каждое нажатие пальцем представлено в структуре данных Input.Touch:

Property: Description:
fingerId The unique index for a touch.
position The screen position of the touch.
deltaPosition The screen position change since the last frame.
deltaTime Amount of time that has passed since the last state change.
tapCount The iPhone/iPad screen is able to distinguish quick finger taps by the user. This counter will let you know how many times the user has tapped the screen without moving a finger to the sides. Android devices do not count number of taps, this field is always 1.
phase Describes the state of the touch, which can help you determine whether the user has just started to touch screen, just moved their finger or just lifted their finger.
Began A finger just touched the screen.
Moved A finger moved on the screen.
Stationary A finger is touching the screen but hasn’t moved since the last frame.
Ended A finger was lifted from the screen. This is the final phase of a touch.
Canceled The system cancelled tracking for the touch, as when (for example) the user puts the device to their face or more than five touches happened simultaneously. This is the final phase of a touch.

Here’s an example script that shoots a ray whenever the user taps on the screen:

Mouse simulation

On top of native touch support Unity iOS/Android provides a mouse simulation. You can use mouse functionality from the standard Input class. Note that iOS/Android devices are designed to support multiple finger touch. Using the mouse functionality will support just a single finger touch. Also, finger touch on mobile devices can move from one area to another with no movement between them. Mouse simulation on mobile devices will provide movement, so is very different compared to touch input. The recommendation is to use the mouse simulation during early development but to use touch input as soon as possible.

Акселерометр

As the mobile device moves, a built-in accelerometer reports linear acceleration changes along the three primary axes in three-dimensional space. Acceleration along each axis is reported directly by the hardware as G-force values. A value of 1.0 represents a load of about +1g along a given axis while a value of –1.0 represents –1g. If you hold the device upright (with the home button at the bottom) in front of you, the X axis is positive along the right, the Y axis is positive directly up, and the Z axis is positive pointing toward you.

Вы можете получить значение акселерометра, путем доступа к свойству Input.acceleration.

Приведенный ниже пример скрипта позволяет двигать объект, используя акселерометр:

Фильтр низких частот

Показания акселерометра могут быть отрывистыми и с шумом. Применив низкочастотную фильтрацию на сигнал, вы сгладите его и избавитесь от высокочастотного шума.

Приведенный ниже скрипт демонстрирует, как применить низкочастотную фильтрацию на показания акселерометра:

Чем больше значение LowPassKernelWidthInSeconds , тем медленнее фильтруется значение, которое будет приближаться к значению входного образца (и наоборот).

Я хочу получить как можно более точные показания акселерометра. Что я должен делать?

Чтение переменной Input.acceleration не означает дискретизацию. Проще говоря, Unity замеряет результат при частоте 60 Гц. и сохраняет его в переменную. На самом деле все немного сложнее — в случае значительной нагрузки на процессор, замеры акселерометра не происходят с постоянными временными интервалами. В результате, система может сделать два замера за один кадр, и один замер за следующий кадр.

Вы можете получить доступ ко всем замерам, выполненным акселерометром в текущем кадре. Следующий код иллюстрирует простое среднее всех событий акселерометра, которые были собраны в течение последнего кадра:

Источник

Ввод на мобильном устройстве

На мобильных устройствах класс Input предоставляет доступ к нажатию на экран, акселерометру и географическим/локационным данным.

Доступ к клавиатуре на мобильных устройствах обеспечивается через iOS keyboard.

Multi-Touch Screen

iPhone и iPod способны отслеживать до пяти нажатий на экран одновременно. Вы можете получить статус каждого нажатия на протяжении последнего кадра через массив Input.touches.

Android устройства не имеют определенного лимита на количество нажатий, которое можно отслеживать. Он колеблется от устройства к устройству и может варьироваться от одного-двух нажатий на старых устройствах, до пяти нажатий на некоторых новых.

Каждое нажатие пальцем представлено в структуре данных Input.Touch:

Свойство: Функция:
fingerId Уникальный индекс для нажатия.
position Позиция нажатия на экран.
deltaPosition Изменение позиции на экране с последнего кадра.
deltaTime Количество времени, которое прошло с тех пор как изменилось последнее состояние.
tapCount The iPhone/iPad screen is able to distinguish quick finger taps by the user. This counter will let you know how many times the user has tapped the screen without moving a finger to the sides. Android devices do not count number of taps, this field is always 1.
phase Describes so called “phase” or the state of the touch. It can help you determine if the touch just began, if user moved the finger or if they just lifted the finger.

Фазы могут быть следующими:

Began Палец только что прикоснулся к экрану.
Moved Палец передвинулся по экрану.
Stationary Палец прикоснулся к экрану, но с последнего кадра не двигался.
Ended Палец только что оторван от экрана. Это последняя фаза нажатий.
Canceled The system cancelled tracking for the touch, as when (for example) the user puts the device to their face or more than five touches happened simultaneously. This is the final phase of a touch.

Ниже приведен пример скрипта, который выпускает луч там, где пользователь тапает по экрану:

Симуляция Мыши

On top of native touch support Unity iOS/Android provides a mouse simulation. You can use mouse functionality from the standard Input class. Note that iOS/Android devices are designed to support multiple finger touch. Using the mouse functionality will support just a single finger touch. Also, finger touch on mobile devices can move from one area to another with no movement between them. Mouse simulation on mobile devices will provide movement, so is very different compared to touch input. The recommendation is to use the mouse simulation during early development but to use touch input as soon as possible.

Акселерометр

При движении мобильных устройств, встроенный акселерометр сообщает линейное ускорение изменяется вдоль трех основных осей в трехмерном пространстве. Ускорение вдоль каждой оси сообщается непосредственно аппаратным обеспечением как значение G-Force. Значение 1,0 представляет собой нагрузку около +1г вдоль заданной оси, а величина –1,0 представляет –1g. Если вы держите устройство в вертикальном положении (с кнопкой “домой” внизу) перед собой, ось X (положительная) будет по правой стороне, ось Y (положительная) будет направлена вверх, а ось Z (положительная) будет указывать на вас.

Вы можете получить значение акселерометра, путем доступа к свойству Input.acceleration.

Приведенный ниже пример скрипта позволяет двигать объект, используя акселерометр:

Фильтр низких частот

Показания акселерометра могут быть отрывистыми и с шумом. Применив низкочастотную фильтрацию на сигнал, вы сгладите его и избавитесь от высокочастотного шума.

Приведенный ниже скрипт демонстрирует, как применить низкочастотную фильтрацию на показания акселерометра:

Чем больше значение LowPassKernelWidthInSeconds , тем медленнее фильтруется значение, которое будет приближаться к значению входного образца (и наоборот).

Я хочу получить как можно более точные показания акселерометра. Что я должен делать?

Чтение переменной Input.acceleration не означает дискретизацию. Проще говоря, Unity замеряет результат при частоте 60 Гц. и сохраняет его в переменную. На самом деле все немного сложнее — в случае значительной нагрузки на процессор, замеры акселерометра не происходят с постоянными временными интервалами. В результате, система может сделать два замера за один кадр, и один замер за следующий кадр.

Вы можете получить доступ ко всем замерам, выполненным акселерометром в текущем кадре. Следующий код иллюстрирует простое среднее всех событий акселерометра, которые были собраны в течение последнего кадра:

Источник

Читайте также:  Rpg maker android app
Оцените статью