微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决从 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 举报,一经查实,本站将立刻删除。