※自分用の殴り書きメモです。
動画プレイヤーUIのように、向いてる方向に合わせてオブジェクトを表示したい!
位置
これは上図の状態を真上から見た図です。OpenGLの座標系に合わせて軸の向きを置いてます。
回転していない状態の座標を(0, 0, Z)とおいたときに、回転後の座標はどのようになるかを考えます。
y座標は変えないものとすると、回転後の座標は三角関数の定義から(Zsinθ, 0, Zcosθ)と表せます。
回転
それでは回転はどのようになるでしょう?
上図を見ると、三角形の内角の和が180度であることから?+θ+90=180であることがわかります。
それを踏まえてよくよく図を見ると、実はオブジェクトの回転角もθに等しいということがわかります。
実装
ちなみにθはカメラの回転角のY軸成分です。
GearVRfでの実装はこんな感じになるはず。
float yaw = getMainCameraRig().getOwnerObject().getTransform().getRotationYaw();
float theta = (float) Math.toRadians(yaw);
float x = (float) (Z * Math.sin(theta));
float z = (float) (Z * Math.cos(theta));
ui.getTransform().setPositionX(x);
ui.getTransform().setPositionZ(z);
ui.getTransform().setRotationByAxis(yaw, 0, 1, 0);
…と思ったが!
後ろを向いた時のyaw
の値がおかしい!
調べてみたら後ろを向いた時の判定はgetMainCameraRig().getOwnerObject().getTransform().getRotationPitch()
で行えそうだったので、やってみた。
float yaw = getMainCameraRig().getOwnerObject().getTransform().getRotationYaw();
// 後ろを向いている場合の補正
if (Math.abs(getMainCameraRig().getOwnerObject().getTransform().getRotationPitch()) > 90) {
yaw = 180 - yaw;
}
float theta = (float) Math.toRadians(yaw);
float x = (float) (Z * Math.sin(theta));
float z = (float) (Z * Math.cos(theta));
ui.getTransform().setPositionX(x);
ui.getTransform().setPositionZ(z);
ui.getTransform().setRotationByAxis(yaw, 0, 1, 0);
これで正しい位置・向きに表示されるようになりました!