Android - Преобразование данных гироскопа в данные вращения (матричные или кватернионные) - PullRequest
0 голосов
/ 19 апреля 2020

Итак, я работаю над игрой Unity3D для Android. Для конкретного c объекта игры мне нужно отправить данные гироскопа другого телефона на телефон игрока и установить вращение объекта, таким образом, я создал Android проект Studio (скажем, Companion App):

Итак, я успешно настроил сенсор и могу отправлять данные через UDP в игру. Но я хочу применить данные гироскопа к матрице вращения в приложении «Companion», а затем отправить матрицу в игру, вместо того, чтобы отправлять данные гироскопа непосредственно в игру (это предотвращает некоторые проблемы, особенно когда соединение временно отключено) .

В настоящее время я использую кватернионы для доставки данных вращения, поэтому я скопировал источники классов javax.vecmath.* + и Transform3D Java3D и использовал их для создания Quat4f:

private Transform3D transform;

// ...

@Override
protected void onCreate(Bundle savedInstanceState) {
// ...
transform = new Transform3D();
// Starting the Gyroscope sensor
}

@Override
public void onSensorChanged(SensorEvent event) {
    try {
        if (firstTime) {
            firstTime = false;
            lastTimestamp = event.timestamp;
        } else if (acceptToSend) {
            new Thread(() -> {
                try {
                    double duration = (double)(event.timestamp - lastTimestamp) / 1000000000D;
                    try {
                        float x = event.values[0] * (float)duration;
                        float y = event.values[1] * (float)duration;
                        float z = event.values[2] * (float)duration;
                        Transform3D temp = new Transform3D();
                        temp.rotX(x);
                        transform.mul(temp);
                        temp.rotY(-y);
                        transform.mul(temp);
                        temp.rotZ(-z);
                        transform.mul(temp);
                        Quat4f quat = new Quat4f();
                        transform.get(quat);
                        DecimalFormat df = new DecimalFormat("#.####");
                        String rotationData = df.format(quat.w) + "a" + df.format(quat.x) + "a" + df.format(quat.y) + "a" + df.format(quat.z);
                        // Send the data
                    } catch (Throwable e) {
                        e.printStackTrace();
                    }
                    lastTimestamp = event.timestamp;
                 } catch (Throwable e) {
                     e.printStackTrace();
                 }
             }).start();
        }
    } catch (Throwable e) {
        e.printStackTrace();
    }
}

Наконец, игра получает данные, а затем создает из них кватернион вращения. Но фактическое состояние телефона полностью отличается от окончательного поворота. Какую ошибку я делаю?

...