1

我正在使用带有 Delphi (XE2) 的 GLScene RayCastIntersect 函数来确定弹道段和 FreeForm 网格之间的交点。如果我导入网格并使用 RayCastIntersect 函数,则正确报告交点。但是,如果我将 FreeForm 对象转换为正 x 坐标,则该函数将停止返回正确的交点。返回的交点总是在目标的前面(即在正确的撞击点之前,大约 x = 0)。如果 FreeForm 位于 x <= 0,那么 RayCastIntersect 函数似乎可以正确处理所有其他变换和旋转。

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

有没有其他人遇到过这个问题?它是一个已知的错误吗(尽管我在网上没有找到任何关于它的信息)?还是我做错了什么?任何建议将不胜感激。请参阅下面的检查影响代码。

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

1 回答 1

0

确保要进行“RayCastIntersect”的对象的 Z 比例不是 0(零)的值。

这也会带来很多麻烦。

我在飞机上使用了“RayCastIntersect”,飞机的 scale.z 设置为 0,导致“RayCastIntersect”返回不正确的值。

我不知道为什么会这样。

于 2014-08-14T02:21:10.117 回答