2009-12-30 1 views
2

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

ответ

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; 
1

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

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

+1

Направление не изменяется, например. когда я использую TGLCamera.MoveAroundTarget, я сейчас экспериментирую с матрицей проекции и матрицы модели: = MatrixMultiply (GLScene1.CurrentBuffer.ProjectionMatrix, GLScene1.CurrentBuffer.ModelViewMatrix); – mabi

+0

правильной матрицей является MatrixMultiply (GLScene1.CurrentBuffer.ModelViewMatrix, GLScene1.CurrentBuffer.ProjectionMatrix); Я выложу некоторый код delphi, когда я очищу свой тест – mabi

Смежные вопросы