1

(glRotate3f を使用して) 回転させた後、頂点オブジェクトの X、Y 値にアクセスする必要があります。それはどのように可能ですか?オブジェクトの回転角度に基づいて、衝突が角度に関連する方向にオブジェクトを送信するオブジェクトの衝突問題を解決する必要があります。

編集::

わかりました、私は道を見つけるために近づいてきました。X と Y を 0、90、180、270 度と仮定します。オブジェクトの中心として点を設定し、X=30、Y=70、X_size を 60、Y_size を 140 と仮定します。

new_X = X cos(angle) - Y sen(angle) および new_Y = X sen(angle) + Y cos(angle) を作成した場合、オブジェクトの中心 X および Y を new_X および new_Y に加算または減算すると、実際には-new_X + X で移動する必要がある角度が 180 の場合を除いて、新しいポイント。

これはそれを解決する方法ですか?

4

3 に答える 3

1

あなたは物事を少し誤解しています。

glRotatefを呼び出しても、何も回転しませんでした。glRotateを呼び出すときは、変換行列を変更しますが、オブジェクトデータは変更されません。オブジェクトをレンダリングすると、頂点データは頂点処理パイプラインを通過し、変換行列が乗算され(オブジェクトをレンダリングするたびに)、技術的には、オブジェクトが変更されていないため、計算結果を取り戻すことはできません。

本当に必要な場合は、glフィードバックバッファー(glFeedbackBufferを参照)を使用してみることができますが、その理由はわかりません。「OpenGLレッドブック」にはフィードバックバッファの例があると思いますが、よくわかりません。フィードバックバッファは必要な機能を提供する場合がありますが、私は実際にはあまり使用していないので、それについてもよくわかりません。

また、システムメモリとビデオメモリの間で大量のデータを前後に移動すると(オブジェクトがビデオメモリに保存されている場合)、パフォーマンスが低下するため、可能であってもそうしないでください。

回転後にオブジェクトの状態を取得する場合は、オブジェクトの行列を使用して手動で乗算し、コピーをシステムメモリに保存する必要があります。OpenGLはオブジェクトマトリックスとビューマトリックスを組み合わせているため(glRotatefを呼び出す場合)、回転マトリックスを個別に保存する必要があります。

これはそれを解決する方法ですか?

たぶん、2Dで作業していて、1つまたは2つの三角形をレンダリングしている場合のみです。

通常、変換を行うときは、回転/平行移動の組み合わせマトリックスを作成し、そのマトリックスを使用して必要なデータを乗算します。これにより、複数の変換を1つに組み合わせることができるため、より効率的になります。また、非グラフィカル3Dルーチン(衝突検出)を使用する場合は、コードで行列の乗算/ベクトル変換を自分で行います。

AFAIK OpenGLは、マトリックス操作ルーチン(D3DXのD3DXMatrixMultiplyと同様)を提供していませんが、最初から作成するのは簡単で、複数の場所から取得できます。また、必要に応じて、D3DX行列関数を使用できます(D3D行列のメモリレイアウトは同じです)。さらに、3Dでの作業に真剣に取り組んでいる場合は、最終的に行列を学習する必要があります。

于 2010-05-27T02:37:14.943 に答える
0

直接ではなく、floatmodelview[16]を使用してmodelviewマトリックスを取得できます。glGetFloatv(GL_MODELVIEW、modelview)を実行し、ベクトルとmodelview行列の間で行列の乗算を手動で実行します。

GLにはそれを行う他の方法はありません。

于 2010-05-27T02:30:21.220 に答える
0

あなたが求めているのはのように聞こえgluProjectます。オブジェクトのx、y、z座標、現在の行列(modelviewとprojection)、およびビューポート座標を指定すると、それらの行列によってそのポイントがマップされるx、y座標が返されます。リンクされたドキュメントには、自分で行う場合のジョブの公式が含まれています。

于 2010-05-27T02:49:36.253 に答える