2

車両がベルヌーイのレムニスケート(より簡単には、8 の字のトラック) をたどる演習を試みています。私はこれを使用glTranslatefglRotatef、達成したいと考えています。これまでのところ、次のようにパラメトリック形式を使用して、車両をこのパスに沿って追従/移動させることができました。

X = (幅 * cos(t)) / (1+sin^2(t))
Y = (幅 * cos(t) * sin(t)) / (1+sin^2(t))
t は円周率で、円周率

コードでは、これは次のようになります。

carX = (float) ((Math.cos(t) / (1 + Math.sin(t)*Math.sin(t))));
carY = 0.0f;
carZ = (float) ((Math.cos(t) * (Math.sin(t))) / (1 + Math.sin(t)*Math.sin(t)));
gl.glTranslatef(carX,carY,carZ);

それで十分に機能します。私の問題は、車両を回転させて、ベルヌーイのレムニスケートによって定義された経路をたどるようにすることです。を使用して Y 軸を中心に回転させたいのですglRotatefが、 に入力する角度を見つける方法がわかりませんglRotatef。回転は現在、ビークルのみを操作するように設定されており、パスをたどるには正しい数学が必要なようです。

私が試したこと:

  • 上記の X および Y フォームの導関数を使用します。角度に使用するためにそれらを組み合わせる方法/組み合わせる必要があるかどうかがわからないため、それらを互いに独立して使用しました。ちょっとした操作で、それらは原点近くの直線領域に従いますが、曲線の周りで崩壊します。
  • t 値のタンジェントを直接求め、度数に変換します。不規則な回転が発生しました。

glRotatef メソッドよりも優れている可能性のある提案があれば、それもいただければ幸いです。私はそれgluLookAt が役立つかもしれないことを見てきました、そして私はそれを使って解決策を見つけようとするかもしれません.

(注: Java と FFP を使用して JOGL で作業していますが、C/C++ コード スニペットには慣れています。)

4

1 に答える 1

1

カメラビューがドライバーのビューであると仮定すると、gluLookAtまさにあなたが必要とするものです!計算に基づいてcarX,carY,carZ(数学が優れていると仮定して)、以前の値を保存して使用できます。

//globals & imports:
import javax.vecmath.*;

Vector3f current = new Vector3f();
Vector3f prev = new Vector3f();

計算は次のとおりです。

//on drawing:
prev.set(current);
current.x = (float) ((Math.cos(t) / (1 + Math.sin(t)*Math.sin(t))));
current.z = (float) ((Math.cos(t) * (Math.sin(t))) / (1 + Math.sin(t)*Math.sin(t)));

glu.gluLookAt(current.x, 0f, current.z,
              current.x - prev.x, 0f, current.z - prev.z,
              0f, 1f, 0f);

家に帰ったらテストして、動作することを確認しますが、私が知る限り、これでうまくいくはずです。

于 2012-12-02T07:35:01.907 に答える