Итак, я работаю над игрой 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();
}
}
Наконец, игра получает данные, а затем создает из них кватернион вращения. Но фактическое состояние телефона полностью отличается от окончательного поворота. Какую ошибку я делаю?