0

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軸を中心に回転します

4

0 に答える 0