You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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组件辅助检测:

  1. 在TModel3D的子组件列表中添加TCollisionBox,调整其尺寸和位置与模型匹配
  2. 在视口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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 10:42:15