Определение пересечения с усеченной пирамидой в GLScene
Вопрос
используя 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
это может оказаться полезным.