我正在使用Delphi的GLScene RayCastIntersect函数(XE2)来确定弹道轨迹的一段和FreeForm网格之间的交点。如果我导入网格并使用RayCastIntersect函数,那么交点将被正确地报告。但是,如果我将FreeForm对象转换为正x坐标,则函数将停止返回正确的交点。返回的交点总是在目标的前面(即在正确的撞击点之前,大约x= 0)。假设FreeForm为x <= 0,则RayCastIntersect函数似乎可以正确处理所有其他转换和旋转。
我注意到,如果我对FreeForm的单个MeshObjects执行x转换,那么RayCastIntersection函数将返回正确的交点,即使是正x转换也是如此。不幸的是,我不能使用这个作为解决办法,因为没有一种方法来旋转各个网格对象。
还有没有人遇到过这个问题?这是一个已知的bug吗(尽管我在网上没有找到任何关于它的东西)?还是我做错了什么?如有任何建议,我们将不胜感激。关于我的检查影响代码,请看下面。
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;发布于 2014-08-14 10:21:10
确保要执行"RayCastIntersect“操作的对象的Z缩放不是值0(零)。
我在一个平面上使用了"RayCastIntersect“,该平面的scale.z设置为0,这会导致"RayCastIntersect”返回不正确的值。
我不知道为什么会发生这种事。
https://stackoverflow.com/questions/23676327
复制相似问题