-1

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);たが、うまくいかないようです。

4

1 に答える 1

0

ここで何をしようとしているのかを正確に伝えるのは難しいですが、潜在的な問題として突き出ていることがいくつかあります。

まず、最後の2つの回転は実際には何にも当てはまらないようです。これらが世界またはカメラの動きを表すことになっている場合(ほとんど同じことになる)、何かを描く前にそれらが発生する必要があります。

そうすれば、あなたのローテーション自体はおそらくあなたが意図したことを完全には行わないでしょう。

立方体はZ軸を中心に回転します。GLの通常の規則では、カメラはZ軸を見下ろし、Y軸は「上」と見なされます。軸は自然に好きなように解釈できますが、「Z」を中心とした回転は通常「ベアリング」ではなく「ロール」になります。私にとっての「方位」は「ヨー」に似ています。

Z軸に沿って平行移動するとき、回転と平行移動によってオブジェクトを配置しようとしていると思いますが、回転が平行移動と同じ軸の周りにある場合、実際には立方体の位置は変更されません。常にカメラの真正面にあり、その軸を中心に回転します。

より具体的な場所から始めたように見えるのに、なぜそのように立方体を配置しようとしているのか、私にはよくわかりません。おそらく、より適切なマトリックスを直接作成することができます。

最後に、カメラ/ワールドの回転は、YとXを中心とした2つの連結回転です。これらをピッチとロールと呼びますが、通常、カメラの回転にオイラー角を使用しても、ピッチとロールなどの用語が完全に意味をなす直感的な結果にはなりません。いくつかの依存する回転を更新しようとするのではなく、方向を維持し、それに個々の回転を適用して更新するのが一般的です。

そうです、このコードは、他の行列演算がない場合、ビュー方向を中心にある角度だけ回転する1つまたは複数の立方体をまっすぐに描画する結果になる可能性が高いと思います。

于 2013-03-14T20:22:19.873 に答える