Android用の拡張現実アプリケーションを開発しており、openGlを使用して世界の場所にキューブを配置しようとしています. 私の現在の方法は、以下のコードで見ることができます:
for(Marker ma: ARData.getMarkerlist().values()) {
Log.d("populating", "");
gl.glPushMatrix();
Location maLoc = new Location("loc");
maLoc.setLatitude(ma.lat);
maLoc.setLongitude(ma.lng);
maLoc.setAltitude(ma.alt);
float distance = currentLoc.distanceTo(maLoc);
float bearing = currentLoc.bearingTo(maLoc);
Log.d("distance", String.valueOf(distance));
Log.d("bearing", String.valueOf(bearing));
gl.glRotatef(bearing,0,0,1);
gl.glTranslatef(0,0,-distance);
ma.cube.draw(gl);
gl.glPopMatrix();
}
gl.glRotatef(y, 0, 1, 0);
gl.glRotatef(x, 1, 0, 0);`
ここで、y はヨー、x はピッチです。現在、画面上に 45 度の角度で離れたところに 1 つの立方体が表示されています。適切な方位と距離の値を取得しているようです。電話の向きと何か関係があるのでしょうか?さらにコードが必要な場合はお知らせください。
編集:ベアリングの回転を更新しgl.glRotatef(bearing,0,1,0);
て、キューブを画面に沿ってさまざまな深さで水平にマッピングできるようになりました。ヘディングとピッチを使用した動きはまだありませんが、@Mirkules はその理由を特定しました。
編集 2:私は今、マーカーへの見出しと方位の間の角度の違いによってマトリックスを回転させることによって、立方体を配置しようとしています。ただし、立方体が新しい位置にレンダリングされてから元の位置に戻るように見える一種のジッタリングしか得られません。以下を除いて、上記のコード:
float angleDiff = bearing - y;
gl.glRotatef((angleDiff),0,1,0);
gl.glTranslatef(0,0,-distance);
ベアリングとyはどちらも 0 ~ 360 のスケールに正規化されています。また、「カメラの回転」をマーカーを設定するコードの上に移動しました。
編集 3:を使用して現在作業中の見出しがありfloat angleDiff = (bearing + y)/2;
ます。しかし、私はピッチの仕事を得ることができないようです。使用しようとしましgl.glRotatef(-x,1,0,0);
たが、うまくいかないようです。