TYPE_ROTATION_VECTORベクトル値から回転行列を取得しました。それを使ってアプリ内のオブジェクトを回転させようとしました。うまくいきました。しかし、私が本当に望んでいるのは、デバイスの移動方向と反対にオブジェクトを回転させることです。たとえば、デバイスがx軸を中心に30度回転しているとします。オブジェクトを、x軸を中心に-30度回転させる必要があります。デバイスの動きに関係なく、オブジェクトがその場所にとどまっているような効果が必要です。そのために、回転ベクトルを反転(転置)しました。これで、x軸とy軸を中心とした回転が完全に正しくなくなり、交換されたように見えます。デバイスをxを中心に回転させると、オブジェクトはyを中心に回転し、その逆も同様です。私のコードの一部:
case Sensor.TYPE_ROTATION_VECTOR:
SensorManager.getRotationMatrixFromVector( mRotationMatrix , event.values);
Matrix.transposeM(mInvertedRotationMatrix, 0, mRotationMatrix, 0);
Quaternion quat = new Quaternion();
quat.fromRotationMatrix(mInvertedRotationMatrix);
mRenderer.setQuat(quat);
}
....
Quaternion quat = new Quaternion();
public void setQuat(Quaternion quat)
{
this.quat = quat;
mObjectGroup.setOrientation(quat);
}
mObjectGroupは、デバイスが回転したときに回転することになっているモデルです
..。
public void setOrientation(Quaternion quat) {
mOrientation.setAllFrom(quat);
}
...
mOrientation = new Quaternion();
...
public Quaternion() {
setIdentity();
mTmpVec1 = new Number3D();
mTmpVec2 = new Number3D();
mTmpVec3 = new Number3D();
}
public Quaternion setIdentity() {
w = 1;
x = 0;
y = 0;
z = 0;
return this;
}
...
public Number3D() {
this.x = 0;
this.y = 0;
this.z = 0;
}
public void setAllFrom(Quaternion other) {
this.w = other.w;
this.x = other.x;
this.y = other.y;
this.z = other.z;
}
編集:デバイスをY軸に沿って回転させると、オブジェクトはZ軸を中心に回転し、デバイスをX軸に沿って回転させると、オブジェクトはY軸を中心に回転します