Определение пересечения с усечением в GLScene

Используя GLScene в Delphi, мне нужно найти пересечение между объектом (достаточно одной линии или плоскости) и видимым пространством, чтобы определить, какая часть этого объекта отображается в данный момент.
Я пытался получить вид Frustum, но я не мог найти, как. Я думал об использовании положения камеры, направления и поля зрения, но я подозреваю, что они не обновляются при использовании таких методов, как MoveAroundTarget или установка целевого объекта.
Спасибо,
Marco

2 ответа

Решение

Чтобы получить усеченный фрагмент, вы можете использовать матрицу ModelViewProjection, полученную умножением ModelViewMatrix и ProjectionMatrix из текущего буфера TGLScene. Чтобы получить плоскости из матрицы, используйте функцию ExtractFrustumFromModelViewProjection. Вот фрагмент кода:

var
  matMVP: TMatrix;
  frustum : TFrustum;
  intersectPoint : TVector;
begin
  // get the ModelViewProjection matrix
  matMVP:=MatrixMultiply(GLScene1.CurrentBuffer.ModelViewMatrix, GLScene1.CurrentBuffer.ProjectionMatrix);
  // extract frustum
  frustum:=ExtractFrustumFromModelViewProjection(matMVP);
  // calculate intersection between left plane and line passing through GLArrowLineX object
  if (IntersectLinePlane(GLArrowLineX.Position.AsVector,GLArrowLineX.Direction.AsVector, frustum.pLeft, @intersectPoint)=1)
  then begin
    // do something with intersectPoint
  end else begin
    // no intersection point (parallel or inside plane)
  end;
end;

Вы можете получить усечку из объекта камеры (свойство TGLSceneViewer.Camera) - свойства NearPlane, DepthOfView, Position, Direction будет необходимо, а также 'TGLSceneViewer.FieldOfView'.

TGLCamera также имеет метод, называемый RayCastIntersect это может оказаться полезным.

Другие вопросы по тегам