GLScene FreeForm RayCastIntersect问题

时间:2014-05-15 11:00:25

标签: delphi glscene

我正在使用带有Delphi(XE2)的GLScene RayCastIntersect函数来确定弹道轨迹的一段与FreeForm网格之间的交叉点。如果我导入网格并使用RayCastIntersect函数,则会正确报告交点。但是,如果我将FreeForm对象转换为正x坐标,则函数将停止返回正确的交叉点。返回的交叉点始终位于目标的前方(即在正确的撞击点之前,大约x = 0)。假设FreeForm位于x <= 0,则所有其他转换和旋转似乎都由RayCastIntersect函数正确处理。

我注意到如果我对FreeForm的各个MeshObjects执行x变换,那么即使对于正x平移,RayCastIntersection函数也会返回正确的交点。不幸的是,由于没有旋转单个网格对象的方法,我无法将其用作解决方法。

还有其他人遇到过这个问题吗?这是一个已知的错误(虽然我没有在网上找到它)?或者我做错了什么?任何建议将不胜感激。请参阅下面的Check Impact代码。

function ChkImpact(Mesh: TGLFreeForm; x1, x2, y1, y2, z1, z2: Double): Boolean;
var
    rStrt, rVect, rEnd: TVector;
    dx, dy, dz: Double;
    iPoint, iNorm: TVector;
begin
      //***Check trajectory secgment intersection with target mesh***//
      rStrt := VectorMake(x1,y1,z1,0);
      rEnd := VectorMake(x2,y2,z2,0);

      dx := x2-x1;
      dy := y2-y1;
      dz := z2-z1;
      rVect := VectorMake(dx,dy,dz,1);

      if Mesh.{Octree}RayCastIntersect(rStrt, rVect, @iPoint, @iNorm) then
      begin
            iPtX := iPoint.X;
            iPtY := iPoint.Y;
            iPtZ := iPoint.Z;

            Result := PointOnSegment(iPoint, rStrt, rEnd);
      end
      else Result := False;
end;

function PointOnSegment(P, P1, P2: TVector): Boolean;
begin
      //***Check whether impact point is on the trajectory segment***//
      if ((P.X >= P1.X) and (P.X <= P2.X)) then Result := True else Result := False;
end;

1 个答案:

答案 0 :(得分:0)

确保您要做的对象的Z比例&#34; RayCastIntersect&#34;不是0(零)的值。

这个原因也很麻烦。

我用过&#34; RayCastIntersect&#34;在一架飞机上,飞机上的scale.z设为0 因为&#34; RayCastIntersect&#34;返回错误的值。

我不知道为什么会这样。