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

StackOverflow https://stackoverflow.com/questions/1979511

Вопрос

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

Это было полезно?

Решение

Чтобы получить усеченную пирамиду, вы можете использовать матрицу 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 это может оказаться полезным.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top