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

JavaFX中基于屏幕坐标检测TriangleMesh的点/矩形相交

JavaFX中TriangleMesh的2D点/矩形选择实现

需求

  • 基于JavaFX的TriangleMesh,检测网格内三角形是否与屏幕空间的2D点相交(逻辑同点击选网格,已获取屏幕坐标,仅需判断相交与否)
  • 最终目标:实现矩形选择功能——通过鼠标绘制矩形,筛选出所有位于矩形范围内的三角形

尝试方案

  • 曾查找相关方案,找到José Pereda的Stack Overflow回答,但原链接失效;找到可用链接后,发现其硬编码了原点/目标点,无法从2D屏幕坐标推导对应参数
  • 考虑过复制OpenJFX的内部实现,但因涉及大量内部代码且可行性不明而放弃

解决过程

初步实现(更新1)

通过Node#localToScreen将三角形的三个顶点转换为2D屏幕坐标,再执行2D点在三角形内的检测,效果良好,但会选中被剔除的背面三角形

优化实现(更新2)

自行添加背面剔除逻辑后,效果基本准确,代码如下:

Point2D v1Screen = view.localToScreen(mesh.getPoints().get(0), mesh.getPoints()
        .get(1), mesh.getPoints().get(2));
Point2D v2Screen = view.localToScreen(mesh.getPoints().get(3), mesh.getPoints()
        .get(4), mesh.getPoints().get(5));
Point2D v3Screen = view.localToScreen(mesh.getPoints().get(6), mesh.getPoints()
        .get(7), mesh.getPoints().get(8));
Point2D point = new Point2D(mouseX, mouseY);
boolean inTriangle = pointInTriangle(point, v1Screen, v2Screen, v3Screen);
// 背面剔除逻辑
double dxAB = v1Screen.getX() - v2Screen.getX();
double dyAB = v1Screen.getY() - v2Screen.getY();
double dxCB = v3Screen.getX() - v2Screen.getX();
double dyCB = v3Screen.getY() - v2Screen.getY();
boolean culled = ((dxAB * dyCB) - (dyAB * dxCB)) <= 0;
if (inTriangle && !culled) {
    view.setMaterial(new PhongMaterial(Color.BLUE));
    System.out.println("Intersected");
}

内容的提问来源于stack exchange,提问作者Suic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 21:45:29