C ++/OpenGLを使用して2つのオブジェクト間の静的衝突検出を実行する必要があります。衝突検出用のコードを作成しましたが、このコードは、現在の位置の座標ではなく、.objファイルで指定された2つのモデルの頂点を使用します(これが私が望むものです)。
私は両方のモデルに対して平行移動とスケール変換を実行しましたが、これらの座標が今何であるかを知る必要があります。変換行列などと関係があると思いますが、これはどのように初期座標に結合されますか?
誰か助けてもらえますか?
OpenGLは、モデルまたはシーンが何であるかを認識せず、ピクセルフレームバッファーに点、線、および三角形を描画するだけです。
固定機能パイプラインの一部またはすべてを放棄するときが来ました。glRotate、glTranslate、glScaleを使用してモデルビューマトリックスを作成する必要はありません。代わりに、GLMやEigenなどの数学ライブラリを使用して、自分でマトリックスを維持する必要があります。これにより、衝突テストのために元のモデル座標に適用できるモデル変換マトリックスの単一インスタンスが得られますが、glLoadMatrix(ビュー変換も適用されている場合)またはGL_MODELVIEWのglMultMatrixを使用してモデルビューマトリックスにロードすることもできます。マトリックスモード。または、シェーダーを選び、ユニフォームを使用します。
平行移動tとスケーリングsがある場合は、次の方法で実際の位置を簡単に計算できます。
world_position = s * model_position + t
行列Mとして与えられた任意の変換がある場合、次のように位置を計算します。
world_position = M * model_position
//where model_position should be a 4d vector with w-coordinate 1
最初に、原点(0、0、0)を中心にオブジェクトを描画することをお勧めします。
だからあなたが関数を呼び出すとき
GLfloatマトリックスMV[16];
glGetFloatv(GL_MODELVIEW_MATRIX、matrixMV);
座標x、y、z
それぞれmatrixMV[12]matrixMV [13]matrixMV[14]になります
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glRotatef(-25.0, 0.0, 1.0, 0.0);
glTranslatef(100.0, 50.0, 0.0);
/*Draw a triangle with centroid in the orign*/
glBegin(GL_POLYGON);
glVertex2f(0.0 , 1.0 );
glVertex2f(-1.0,-0.27 );
glVertex2f(1.0 ,-0.27 );
glEnd();
GLfloat matrixMV[16];
glGetFloatv(GL_MODELVIEW_MATRIX, matrixMV);
double xCenterTriangle = matrixMV[12];
double yCenterTriangle = matrixMV[13];
double zCenterTriangle = matrixMV[14];
実際には、座標に対して行ったのと同じ変換を実行する必要があります。
glGetFloatv(GL_MODELVIEW_MATRIX, m)
固定関数piplineを使用している場合は、1つのオブジェクトをいくつかにペイントGLfloat m[16]
し、後でオブジェクトに適用するためにマトリックスを保存する前に、現在のModelViewマトリックスを取得することができます。
乗算を正しく行うために、左から乗算した場合の行列要素の順序は次のとおりです。
| m[0] m[4] m[8] m[12] | v[0]
| m[1] m[5] m[9] m[13] | x v[1]
| m[2] m[6] m[10] m[14] | v[2]
| m[3] m[7] m[11] m[15] | v[3]