2014-05-15 9 views
1

저는 탄도 궤적과 FreeForm 메쉬의 세그먼트 사이의 교차점을 결정하기 위해 Delphi (XE2)에서 GLScene RayCastIntersect 함수를 사용하고 있습니다. 메쉬를 가져오고 RayCastIntersect 함수를 사용하면 교차점이 올바르게보고됩니다. 그러나 FreeForm 객체를 양수 x 좌표로 변환하면 함수는 올바른 교차점을 반환하지 않습니다. 반환 된 교차점은 항상 대상 (즉, 올바른 충돌 지점 앞, x = 0 주변)에 있습니다. FreeForm이 x < = 0이면 RayCastIntersect 함수는 다른 모든 변환과 회전을 올바르게 처리합니다.GLScene FreeForm 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; 

답변

0

"RayCastIntersect"를 수행 할 개체의 Z 축척이 0 (영)이 아닌지 확인하십시오.

이 문제는 많은 문제가됩니다.

비행기에서 "RayCastIntersect"를 사용했고 평면에 scale.z가 0으로 설정된 이 있으면 "RayCastIntersect"가 잘못된 값을 반환합니다.

왜 이런 일이 발생하는지 알 수 없습니다.