GLScene FreeForm RayCastIntersect Проблемы

Я использую функцию GLScene RayCastIntersect с Delphi (XE2), чтобы определить точку пересечения между сегментом баллистической траектории и сеткой FreeForm. Если я импортирую сетку и использую функцию RayCastIntersect, то точка пересечения сообщается правильно. Однако если я переведу объект FreeForm в положительную координату x, то функция перестанет возвращать правильную точку пересечения. Возвращенная точка пересечения всегда находится впереди на цели (т. Е. До правильной точки удара, около x = 0). При условии, что FreeForm находится в точке x <= 0, все остальные преобразования и повороты, по-видимому, обрабатываются корректно функцией RayCastIntersect.

Я заметил, что если я выполняю x-преобразование для отдельных MeshObjects FreeForm, то функция 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;

1 ответ

Убедитесь, что Z-шкала объекта, который вы хотите сделать "RayCastIntersect", не является значением 0 (ноль).

Это также доставит много хлопот.

Я использовал "RayCastIntersect" на плоскости, и для плоскости было установлено значение scale.z, равное 0, в результате чего "RayCastIntersect" возвращал неправильные значения.

Я не знаю, почему это происходит.

Другие вопросы по тегам