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