Pregunta

usando GLScene en Delphi Necesito encontrar la intersección entre un objeto (una línea o plano es suficiente) y el espacio visible, para determinar qué parte de este objeto está mostrando actualmente.
He intentado conseguir el punto de vista de cono truncado, pero no pude encontrar la forma. Yo estaba pensando en usar la posición de la cámara, la dirección y el campo de visión, pero sospecho que no se actualizan cuando se utilizan métodos como MoveAroundTarget o establecer el objeto de destino.
Gracias,
Marco

¿Fue útil?

Solución

Para obtener el tronco puede utilizar la matriz obtenida ModelViewProjection multipying la ModelViewMatrix y la ProjectionMatrix de búfer de TGLScene. Para obtener los planos de la matriz utilizan la función ExtractFrustumFromModelViewProjection. Aquí es un fragmento de código:

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;

Otros consejos

Se puede conseguir el tronco fuera del objeto de cámara (propiedad TGLSceneViewer.Camera) - serán necesarias las propiedades NearPlane, DepthOfView, Position, Direction, así como 'TGLSceneViewer.FieldOfView'.

El TGLCamera tiene también un método llamado RayCastIntersect que puede resultar útil.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top