LoginSignup
1
0

More than 5 years have passed since last update.

向いてる方向に合わせてオブジェクトの位置と回転を調整する

Posted at

※自分用の殴り書きメモです。

図1.png
動画プレイヤーUIのように、向いてる方向に合わせてオブジェクトを表示したい!

位置

これは上図の状態を真上から見た図です。OpenGLの座標系に合わせて軸の向きを置いてます。
図2.png
回転していない状態の座標を(0, 0, Z)とおいたときに、回転後の座標はどのようになるかを考えます。
y座標は変えないものとすると、回転後の座標は三角関数の定義から(Zsinθ, 0, Zcosθ)と表せます。

回転

それでは回転はどのようになるでしょう?
図3.png
上図を見ると、三角形の内角の和が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);

これで正しい位置・向きに表示されるようになりました!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0