2

私は現在、JOGLを使用して最初のFPSゲームの設計に取り組んでいます。(OpenGLのJavaバインディング)。

これまでのところ、「ワールド」(一連のキューブ)とプレーヤーモデルを生成することができました。プレーヤーとキューブの間の衝突検出がうまく機能しています。

今、私は銃を追加しようとしています。銃のモデルを正しく描画し、プレーヤーのモデルにロードしています。私が実装しようとしている最初の銃はレーザー銃です。これは、狙っているものすべてに瞬時の見通し内レーザーを発射します。敵モデルの実装に取り​​組む前に、レーザーと壁の間の衝突検出を機能させたいと思います。

私のレーザーは、現在、一連の小さな立方体によって次々と描かれています。最初の立方体はプレイヤーの銃の端に描画され、次にそこから継続的に描画されます。アイデアは、何か、つまり世界の立方体との衝突が検出されるまで、レーザーの立方体を描き続けることでした。

私は世界の立方体の位置を知っています。問題は、キャラクターモデルを描画するためにglMatrixPushを呼び出さなければならないことです。次に、このモデルビュー内にレーザーが描画されます。古い座標系を失ったことを意味します。つまり、あるシステムで世界を描き、次に別のシステムでレーザーを描きます。このプレーヤーマトリックス内で、カメラの回転方法とすべてを同期させるために、glRotateとglTranslateを数回呼び出しました。次に、この新しいシステムのz軸に沿って平行移動することにより、レーザーが構築されます。

私の問題は、これらすべての変換を通じて、主にカメラの回転が原因で、レーザーがマップ座標系のどこに存在するのかわからなくなったことです。

誰かがこの問題を解決する方法を知っていますか、または何かアイデアがありますか?レーザーの新しい座標をマップの古い座標に変換する方法が必要だと思いますが、レーザーに対して行われたすべての変換を元に戻す方法がわかりません。私が気付いていないこの種の問題を処理するために、OpenGLによって提供されるいくつかの機能もあるかもしれません。

4

2 に答える 2

4

レーザーを、それを発射するキャラクターの特別な子と見なすべきではありません。発射されると、レーザーは独自のエンティティになるため、次のようにレンダリングする必要があります。

glPushMatrix(viewMatrix);
glPushMatrix(playerMatrix);
DrawPlayer();
glPopMatrix();
glPushMatrix(laserMatrix);
DrawLaser();
glPopMatrix();
glPopMatrix();

また、レンダリング変換ロジックとゲーム ロジックを混在させないようにしてください。現在の OpenGL マトリックス スタックに関係なく、交差をテストできるように、オブジェクトのワールド空間位置を常に保存する必要があります。

空間的な親子関係には注意してください。実際には、それほど頻繁ではありません。詳細については、シーン グラフの問題についてググってください。

于 2009-05-03T19:12:17.830 に答える
3

最初の答えで指摘されていたのは、最初にオブジェクトを配置するためにマトリックスに依存してはならないということです。レーザーを描くことを考える前に、レーザーの位置と回転を追跡する必要があります。次に、変換コマンドと回転コマンドを使用して、本来あるべき場所に配置します。

あなたは逆方向に物事を行おうとしています、そしてそうです、それはあなたがマトリックス計算をしなければならないことを意味します、そしてModelViewマトリックスはOpenGLが追跡する唯一のものであるためOpenGLはそれを追跡しませんオブジェクトの位置に。OpenGLには、「ワールドスペース」または「カメラスペース」の概念はありません。すべての入力に乗算される行列のみがあります。エレガントでシンプルです...しかし、場合によっては、DirectXが個別のビューマトリックスとモデルマトリックスを持つ方法を好むことがあります。

したがって、行列計算なしでオブジェクトがどこにあるかわからない場合は、基本的な設計の問題であると考えます。オブジェクトの位置を知る必要がない場合は、心のコンテンツに行列変換しますが、その位置が必要な場合は、その位置から始めます。

(最初の答えが言っていることとほぼ同じですが、別の方法で...)

于 2009-05-04T22:02:23.357 に答える