1

Delphi (XE2) で GLScene RayCastIntersect 関数を使用して、弾道軌道のセグメントと FreeForm メッシュの間の交点を決定しています。メッシュをインポートして RayCastIntersect 関数を使用すると、交点が正しく報告されます。ただし、FreeForm オブジェクトを正の x 座標に変換すると、関数は正しい交点を返さなくなります。返される交点は、常にターゲットの前にあります (つまり、x = 0 付近の正しい着弾点の前)。FreeForm が x <= 0 にある場合、他のすべての変換と回転は、RayCastIntersect 関数によって正しく処理されるように見えます。

FreeForm の個々の MeshObject に対して x 変換を実行すると、RayCastIntersection 関数は正の x 変換に対しても正しい交点を返すことに気付きました。残念ながら、個々のメッシュ オブジェクトを回転させる方法がないため、これを回避策として使用することはできません。

他の誰かがこの問題に遭遇しましたか? これは既知のバグですか (オンラインでは何も見つかりませんでしたが)? それとも私は何か間違ったことをしていますか?任意の提案をいただければ幸いです。私の 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;
4

1 に答える 1