在处理Android时,将设备坐标系映射到真实世界(旋转向量)坐标系时出现故障

在处理Android时,将设备坐标系映射到真实世界(旋转向量)坐标系时出现故障,android,rotation,processing,coordinate-systems,Android,Rotation,Processing,Coordinate Systems,我知道这个问题已经被问过很多次了,但是由于我掌握了所有的知识,我仍然无法让它在我现在所处的特定环境中为自己工作:Android处理 所涉及的坐标系是(1)根据Android的观点,现实世界的坐标系:y与地面相切并指向北方,z向上进入天空,x向你的右侧,如果你站在地面上向北看;和(2)根据处理视图的设备坐标系:x指向屏幕右侧,y向下,z从屏幕中出来 目标只是在屏幕上绘制一个立方体,并在设备旋转时使其旋转,使其看起来在实际空间中是稳定的。也就是说:我想在两个坐标系之间绘制一张地图,这样我就可以根据真

我知道这个问题已经被问过很多次了,但是由于我掌握了所有的知识,我仍然无法让它在我现在所处的特定环境中为自己工作:Android处理

所涉及的坐标系是(1)根据Android的观点,现实世界的坐标系:y与地面相切并指向北方,z向上进入天空,x向你的右侧,如果你站在地面上向北看;和(2)根据处理视图的设备坐标系:x指向屏幕右侧,y向下,z从屏幕中出来

目标只是在屏幕上绘制一个立方体,并在设备旋转时使其旋转,使其看起来在实际空间中是稳定的。也就是说:我想在两个坐标系之间绘制一张地图,这样我就可以根据真实世界的坐标而不是屏幕坐标来绘制

在代码中我正在使用Ketai传感器库,并订阅
onRotationVectorEvent(浮点x、浮点y、浮点z)
事件。另外,我有一个简单的四元数类,我从中得到的。到目前为止,我有以下代码,其中我有两种不同的尝试映射的方法,它们是一致的,但并没有按照我希望的那样工作:

import ketai.sensors.*;

KetaiSensor sensor;
PVector rotationAngle = new PVector(0, 0, 0);
Quaternion rot = new Quaternion();

void setup() {
  fullScreen(P3D);
  sensor = new KetaiSensor(this);
  sensor.start();
}

void draw() {
  background(#333333);
  translate(width/2, height/2);
  lights();

  // method 1: draw lines for real-world axes in terms of processing's coordinates
  PVector rot_x_axis = rot.mult(new PVector(400, 0, 0));
  PVector rot_y_axis = rot.mult(new PVector(0, 0, -400));
  PVector rot_z_axis = rot.mult(new PVector(0, 400, 4));

  stroke(#ffffff);
  strokeWeight(8); line(0, 0, 0, rot_x_axis.x, rot_x_axis.y, rot_x_axis.z);
  strokeWeight(5); line(0, 0, 0, rot_y_axis.x, rot_y_axis.y, rot_y_axis.z);
  strokeWeight(2); line(0, 0, 0, rot_z_axis.x, rot_z_axis.y, rot_z_axis.z);

  // method 2: first rotate appropriately
  fill(#f4f7d2);
  rotate(asin(rotationAngle.mag()) * 2, rotationAngle.x, rotationAngle.y, rotationAngle.z);

  box(200, 200, 200);
}

void onRotationVectorEvent(float x, float y, float z) {
  rotationAngle = new PVector(x, y, z);

  // I believe these two do the same thing.
  rot.set(x, y, z, cos(asin(rotationAngle.mag())));
  //rot.setAngleAxis(asin(rotationAngle.mag())*2, rotationAngle);
}

上述操作非常有效,使得真实世界的轴线与绘制的立方体重合,并且两者都以有趣的方式旋转。但是,似乎仍然有一些“万向节的东西”在进行,在这个意义上,当我站在一个方向上下旋转我的设备时,立方体也会上下旋转,但站在另一个方向上,立方体会侧向旋转——就好像我以错误的顺序应用旋转一样。然而,我试图通过这种方式使用四元数来避免万向节的疯狂——它仍然适用吗?

我现在已经解决了这个问题,只需通过一个简单的“点击测试下一个配置”UI,测试所有可能的6*8配置的
旋转(asin(rotationAngle.mag())*2,*rotationAngle.,*rotationAngle.,*rotationAngle.,*rotationAngle.)--解决方案似乎是0,-1,2,即:

rotate(asin(rotationAngle.mag())*2,rotationAngle.x,-rotationAngle.y,rotationAngle.z)