FMX 3D应用中TModel3D点击事件无法触发的求助
FMX 3D中捕获TModel3D点击事件的解决方案
方法一:利用视口射线检测精准命中TModel3D
在TViewport3D的OnMouseDown事件中,将屏幕坐标转换为3D射线,通过场景的射线相交检测判断是否点击到TModel3D:
var Ray: TRay; HitInfo: THitInfo; begin Ray := Viewport3D.ScreenPositionToRay(X, Y); if Viewport3D.Scene.IntersectRay(Ray, HitInfo) then begin if HitInfo.HitObject is TModel3D then begin // 此处编写点击TModel3D后的业务逻辑 ShowMessage('点击目标:' + TModel3D(HitInfo.HitObject).Name); end; end; end;
这种方式绕过原生OnClick的限制,直接基于3D场景的物理射线检测,不受UI层干扰,准确率更高。
方法二:添加碰撞盒辅助检测(适用于复杂模型)
如果模型网格面数过多或射线检测精度不足,可给TModel3D绑定TCollisionBox组件辅助检测:
- 在
TModel3D的子组件列表中添加TCollisionBox,调整其尺寸和位置与模型匹配 - 在视口
OnMouseDown事件中检测碰撞盒的命中,并关联到父级TModel3D:
var Ray: TRay; HitInfo: THitInfo; TargetModel: TModel3D; begin Ray := Viewport3D.ScreenPositionToRay(X, Y); if Viewport3D.Scene.IntersectRay(Ray, HitInfo) then begin if HitInfo.HitObject is TCollisionBox then begin TargetModel := TCollisionBox(HitInfo.HitObject).Parent as TModel3D; if Assigned(TargetModel) then begin // 处理点击逻辑 end; end; end; end;
原生OnClick失效的排查点
- 确认
TModel3D的HitTest属性已设为True,该属性控制对象是否响应交互事件 - 检查
TViewport3D的HitTest为True,且无其他UI组件(如TRectangle)覆盖在视口上方拦截事件 - 确保
TModel3D的Visible属性为True,不可见对象无法触发任何交互事件
内容的提问来源于stack exchange,提问作者MatteoFolli
相关产品推荐
相关产品推荐

