从 JavaFX 中的 2D 选择框中获取 3D 网格视图

问题描述

我正在尝试实现一个 2D 选择窗口,该窗口可以选择 2D 窗口内的 3D 顶点(由虚线青色矩形表示)。我的每个 3D 模型目前都是 MeshView 的复合组,每个面一个 MeshView。我的计划是遍历每个面 (MeshView) 并检查 2D 边界是否与选择框边界相交(我计划稍后使用 Atlas 纹理更新它以减少网格数量,但现在我只想要选择机制工作)。

目前我有以下内容,但这不正确。

 val selectionBounds = selectionRectangle.boundsInParent
 val localBounds = meshView.localToScene(meshView.boundsInLocal,true)
 if (selectionBounds.intersects(localBounds))
     // do something with the mesh in meshView

我的子场景包含一个透视相机,现在我看到了两个有用的帖子:

  1. Convert coordinates from 3D scene to 2D overlay
  2. How to get 2D coordinates on window for 3D object in javafx

我想我必须首先使用我的透视相机正确地投影网格视图的边界。但我不确定如何继续,我是否必须像参考问题 2(上面)中所做的那样将局部边界中的每个 3D 点投影到 2D。不太熟悉数学或相关概念,任何帮助将不胜感激。

眨眼眨眼 MVP José)

Selection box example

编辑 1:

根据 José 的建议,我为每个网格视图添加了红色边界框,结果如下:

Offset

显然,它增加了一些偏移量,无论相机旋转如何,这些偏移量似乎都相同。在这里,每个网格视图周围都绘制了红色框。将进一步调查..

编辑 2:

我使用一个包含子场景和另一个节点的窗格。这样做是为了控制 SubScene 的大小并通过覆盖 layoutChildren 方法相应地重新定位/调整另一个节点的大小,因此(这是在 Kotlin 中):

override fun layoutChildren() {
    val subScene = subSceneProperty.get()
    if (subScene != null){
        subScene.width = width
        subScene.height = height
    }
    overlayRectangleGroup.resize(width,height)
    val nodeWidth = snapSize(overlayMiscGroup.prefWidth(-1.0))
    val nodeHeight = snapSize(overlayMiscGroup.prefheight(-1.0))
    overlayMiscGroup.resizeRelocate(width - nodeWidth,0.0,nodeWidth,nodeHeight)
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)