私はopenGLでいくつかの立方体をレンダリングしているシーンを持っています(プログラム構造はGLUTを使用していません.win32プログラム構造にありglutSolidCube
ますが、. これは私がやっていることです: まず、ユーザーがシーンでマウス ボタンをクリックすると、マウスの位置が取得され、シーン座標でその座標を見つけようとします (templateSkeletons は立方体から作成したスケルトンであり、それ以上のものではありません):
if (mouse.buttonPressed(Mouse::BUTTON_LEFT))
{
mouse.update();
templateSkeletons[0].selectionMode = true;
Vector3* points;
points = GetOGLPos();
templateSkeletons[0].setIntersectionPoints(points[0],points[1]);
}else
templateSkeletons[0].selectionMode = false;
これはGerOGLPos
、シーン内の座標を取得する関数です (独自のカムレアと独自の射影行列を持っていることに注意してください。ただし、この関数で呼び出すだけで射影行列を取得していることに注意してください。glGetDoublev (GL_PROJECTION_MATRIX, projmatrix);
これは間違っており、自分のカムレアの射影を取得する必要があります。行列 ? ) :
Vector3* GetOGLPos()
{Vector3 pointsOnLine[2];
double mvmatrix[16];
double projmatrix[16];
int viewport[4];
double dX, dY, dZ, dClickY,zz;
glGetIntegerv(GL_VIEWPORT, viewport);
glGetDoublev (GL_MODELVIEW_MATRIX, mvmatrix);
glGetDoublev (GL_PROJECTION_MATRIX, projmatrix);
dClickY = double (viewport[3] - mouse.yPos());
// OpenGL renders with (0,0) on bottom, mouse reports with (0,0) on top
//glReadPixels( mouse.xPos(), int(dClickY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &zz );
gluUnProject ((double) mouse.xPos(), dClickY, 0.0, mvmatrix, projmatrix, viewport, &dX, &dY, &dZ);
pointsOnLine[0] = Vector3( (float) dX, (float) dY, (float) dZ );
gluUnProject ((double) mouse.xPos(), dClickY, 1.0, mvmatrix, projmatrix, viewport, &dX, &dY, &dZ);
pointsOnLine[1] = Vector3( (float) dX, (float) dY, (float) dZ );
return pointsOnLine;
}
ここで、シーン内のピッキング レイを示す 2 つのポイントがあるとします。立方体をレンダリングするとき、光線と立方体によって作成された線の距離を計算しようとします。それが値よりも小さい場合は、立方体の色を変更して、それを選択したことを認識します (jointsOfSkeleton は、各立方体がスケルトンが作成されます。ここでは、配列内のキューブ番号 6 のみをテストしています):
if(selectionMode)
{
distToLine = Vector3::PointToLineDistance3D(rayPoints[0],rayPoints[1],Vector3::Vector3(jointsOfSkeleton[6].x,
jointsOfSkeleton[6].y,jointsOfSkeleton[6].z));
//distToLine = sqrt(distToLine);
if(distToLine < 0.5)
glColor3f(1.0,0.0,0.0);
else
glColor3f(1.0,1.0,1.0);
}
ウィンドウの無関係な位置をクリックすると、立方体の色が変化し、正しく機能しません。デバッガーで距離を監視していますが、距離が正しく表示されません。これは、ラインポイント距離を見つけるために使用した関数です。
static float PointToLineDistance3D(Vector3 a, Vector3 b, Vector3 point)
{
Vector3 lineDirection = b - a;
float t = (Vector3::dot(point,lineDirection) - Vector3::dot(lineDirection,a))/(Vector3::dot(lineDirection,lineDirection));
Vector3 direction;
direction.x = a.x + (lineDirection.x *t) - point.x;
direction.y = a.y + (lineDirection.y *t) - point.y;
direction.z = a.z + (lineDirection.z *t) - point.z;
float ShortestDistance = sqrtf((direction.x*direction.x)+(direction.y*direction.y)+(direction.z*direction.z));
return ShortestDistance;
}