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
相关产品推荐
相关产品推荐

