如何使用 JavaFX 中的 JCSG 库将 MeshView 转换为 CSG 对象

2024-05-06

我正在使用 JavaFX 的 JCSG 库。

我有一些MeshView我想将它们转换成的对象CSG对象,有办法实现吗?


最简单的方法是组合javafx.scene.shape.Mesh对象与 CSG 对象,前提是您有TriangleMesh正在将三角形面转换为多边形(eu.mihosoft.vrl.v3d.Polygon).

拥有 CSG 对象后,您可以对其执行常规操作,然后可以将其导出回MeshView例如。

原始形状的问题(Box, Sphere, ...) 是您无权访问他们的TriangleMesh。所以你可以去F(X)yz https://github.com/Birdasaur/FXyz库并选择任何可用的 3D 形状。

例如,让我们使用FrustumMesh object.

您可以轻松创建一个:

FrustumMesh cone = new FrustumMesh(1,0.2,4,2);

您将可以访问其网格:cone.getMesh().

现在我们需要将其转换为TriangleMesh into List<Polygon>。为此,我们可以创建这个实用程序类:

public class Mesh2CSG {
    /**
     * Loads a CSG from TriangleMesh.
     * @param mesh
     * @return CSG
     * @throws IOException if loading failed
     */
    public static CSG mesh2CSG(MeshView mesh) throws IOException {
        return mesh2CSG(mesh.getMesh());
    }
    public static CSG mesh2CSG(Mesh mesh) throws IOException {

        List<Polygon> polygons = new ArrayList<>();
        List<Vector3d> vertices = new ArrayList<>();
        if(mesh instanceof TriangleMesh){
            // Get faces
            ObservableFaceArray faces = ((TriangleMesh)mesh).getFaces();
            int[] f=new int[faces.size()];
            faces.toArray(f);

            // Get vertices
            ObservableFloatArray points = ((TriangleMesh)mesh).getPoints();
            float[] p = new float[points.size()];
            points.toArray(p);

            // convert faces to polygons
            for(int i=0; i<faces.size()/6; i++){
                int i0=f[6*i], i1=f[6*i+2], i2=f[6*i+4];
                vertices.add(new Vector3d(p[3*i0], p[3*i0+1], p[3*i0+2]));
                vertices.add(new Vector3d(p[3*i1], p[3*i1+1], p[3*i1+2]));
                vertices.add(new Vector3d(p[3*i2], p[3*i2+1], p[3*i2+2]));
                polygons.add(Polygon.fromPoints(vertices));
                vertices = new ArrayList<>();
            }
        }

        return CSG.fromPolygons(new PropertyStorage(),polygons);
    }
}

通过这种方法,你可以获得一个CSG锥体:

CSG coneCSG = Mesh2CSG.mesh2CSG(cone.getMesh());

因此您可以将其与其他 CSG 形式结合起来:

CSG cube = new Cube(2).toCSG().color(Color.RED);
CSG union = cube.union(coneCSG);

并返回 JavaFX 网格来查看它:

MeshView unionMesh = coneCSG.toJavaFXMesh().getAsMeshViews().get(0);

这是完整的示例类(假设您的类路径上有 FXyzLib.jar 和 JCSG.jar 依赖项):

public class FXyzJCSG extends Application {
    private double mousePosX, mousePosY;
    private double mouseOldX, mouseOldY;
    private final Rotate rotateX = new Rotate(-20, Rotate.X_AXIS);
    private final Rotate rotateY = new Rotate(-20, Rotate.Y_AXIS);

    @Override
    public void start(Stage primaryStage) throws IOException {

        FrustumMesh cone = new FrustumMesh(1,0.2,4,2);
        cone.setDrawMode(DrawMode.LINE);
        cone.setTextureModeNone(Color.ROYALBLUE);

        CSG coneCSG = Mesh2CSG.mesh2CSG(cone.getMesh());

        CSG cube = new Cube(2).toCSG().color(Color.RED);
        CSG union = cube.union(coneCSG);

        MeshView unionMesh = union.toJavaFXMesh().getAsMeshViews().get(0);
//        unionMesh.setDrawMode(DrawMode.LINE);
        PerspectiveCamera camera = new PerspectiveCamera(true);
        camera.getTransforms().addAll (rotateX, rotateY, new Translate(0, 0, -10));

        Group root3D = new Group(camera,unionMesh);

        SubScene subScene = new SubScene(root3D, 600, 400, true, SceneAntialiasing.BALANCED);
        subScene.setFill(Color.AQUAMARINE);
        subScene.setCamera(camera);

        Scene scene = new Scene(new StackPane(subScene), 600, 400);
        scene.setOnMousePressed(me -> {
            mouseOldX = me.getSceneX();
            mouseOldY = me.getSceneY();
        });
        scene.setOnMouseDragged(me -> {
            mousePosX = me.getSceneX();
            mousePosY = me.getSceneY();
            rotateX.setAngle(rotateX.getAngle()-(mousePosY - mouseOldY));
            rotateY.setAngle(rotateY.getAngle()+(mousePosX - mouseOldX));
            mouseOldX = mousePosX;
            mouseOldY = mousePosY;
        });

        primaryStage.setTitle("FXyz & JCSG - JavaFX 3D");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 JavaFX 中的 JCSG 库将 MeshView 转换为 CSG 对象 的相关文章

  • 位图内存不足错误

    我对这个错误有疑问 我从 URL 制作网站图标解析器 我这样做是这样的 public class GrabIconsFromWebPage public static String replaceUrl String url StringB
  • 防止 Spring Boot 注册 Spring Security 过滤器之一

    我想禁用安全链中的 Spring Security 过滤器之一 我已经看到了防止 Spring Boot 注册 servlet 过滤器 https stackoverflow com questions 28421966 prevent s
  • Java、Oracle 中索引处缺少 IN 或 OUT 参数:: 1 错误

    您好 我使用 Netbeans 8 0 2 和 Oracle 11g Express Edition 在 JSF 2 2 中编写了一个图书馆管理系统 我有几个名为 书籍 借阅者 等的页面 以及数据库中一些名为相同名称的表 我的问题是这样的
  • 如何在远程 WebSphere 上进行 JNDI 查找期间解决 sun/io/MalformedInputException

    我使用 WebSphere 8 5 来托管我的应用程序 并在应用程序服务器上配置了一些 JDBC 资源 我还使用瘦客户端运行时库开发了一个客户端应用程序 当按以下方式执行 JNDI 查找时 env put Context INITIAL C
  • 哪个 Swing 布局管理器可以获得我想要的布局?

    我正在尝试按照这个模型制作一个基本的登录菜单 我决定将整个菜单放入 JPanel 中 以便在连接成功后我可以切换到另一个面板 所以我决定使用 Borderlayout 将标题放在北区 将连接按钮放在南区 我将边框布局的中心本身设置为面板 我
  • Spring3/Hibernate3/TestNG:有些测试给出 LazyInitializationException,有些则没有

    前言 我在单元测试中遇到了 LazyInitializationException 的问题 而且我很难理解它 正如你从我的问题中看到的那样Spring 中的数据库会话 https stackoverflow com questions 13
  • RMI 中的引用传递问题? [复制]

    这个问题在这里已经有答案了 有人可以告诉我我错在哪里 为什么这个 RMI 聊天应用程序不起作用 目标是通过远程对象或序列化对象实现客户端 服务器和逻辑之间的解耦 import javax swing import java awt even
  • 正则表达式获取字符串中的第一个数字和其他字符

    我是正则表达式的新手 想知道如何才能只获取字符串中的第一个数字 例如100 2011 10 20 14 28 55 在这种情况下 我希望它返回100 但该数字也可以更短或更长 我在想类似的事情 0 9 但它单独获取每个数字 100 2001
  • 有多少种方法可以将位图转换为字符串,反之亦然?

    在我的应用程序中 我想以字符串的形式将位图图像发送到服务器 我想知道有多少种方法可以将位图转换为字符串 现在我使用 Base64 格式进行编码和解码 它需要更多的内存 是否有其他可能性以不同的方式做同样的事情 从而消耗更少的内存 现在我正在
  • 如何在 Eclipse 中使用其他外部 jar 依赖项创建不可运行/不可执行的 jar

    我无法通过 Eclipse 导出向导创建普通的 jar 不可运行 不可执行 它仅创建 jar 文件 但不会导出依赖的 jar 从而在从其他类调用导出的 jar 的方法时出现错误 请帮助 非常感谢 kurellajunior的建议 它是通过使
  • Jenkins 的代码覆盖率 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 我想在java中使用XQuery进行Xml处理

    我想用XQuery用于从 java 中的 Xml 获取数据 但我没有得到需要为此添加哪个 Jar 我在谷歌上搜索了很多 但没有得到任何有用的例子 例如我得到以下链接 https docs oracle com database 121 AD
  • 使用多个值过滤 JFX TableView

    我目前正在尝试过滤我的数据TableView using FilteredList with predicate 我有2个ComboBoxes来过滤值 我的表包含Result Each Result has a Student that S
  • 如何初始化静态地图?

    你会如何初始化静态Map在Java中 方法一 静态初始化方法二 实例初始化 匿名子类 或者 还有其他方法吗 各自的优点和缺点是什么 这是说明这两种方法的示例 import java util HashMap import java util
  • Java中的回调接口是什么?

    SetObserver 接口的代码片段取自有效的Java 避免过度同步第67条 public interface SetObserver
  • 警告:无法更改每个人的权限:

    当运行 Java 快速入门示例时https developers google com drive web quickstart java hl hu https developers google com drive web quicks
  • 为什么这个私人浮动字段变为零?

    我有一些奇怪的行为 我很难向自己解释 称为 textureScale 的浮点字段变为零 如果某些代码正在更改该值 则可以解释这一点 然而 我希望能够通过将其设置为 私有最终浮点 来导致构建失败 或者至少是运行时异常 那么无论更改该值都将失败
  • 无法使用 wget 在 CentOS 机器上安装 oracle jdk

    我想在CentOS上安装oracle java jdk 8 我无法安装 java jdk 因为当我尝试使用命令安装 java jdk 时 root ADARSH PROD1 wget no cookies no check certific
  • 摩尔斯电码 至 英语

    我现在的问题是让 摩尔斯电码转英语 正常工作 将英语转换为莫尔斯电码的第一部分工作正常 我知道以前已经有人问过这个问题 但我不知道我做错了什么 我知道我需要在某个地方进行拆分 但我只是不确定将其放在代码中的何处 现在 莫尔斯电码到英语的部分
  • 为什么应该首选 Java 类的接口?

    PMD https pmd github io 将举报以下违规行为 ArrayList list new ArrayList 违规行为是 避免使用 ArrayList 等实现类型 而是使用接口 以下行将纠正违规行为 List list ne

随机推荐

  • 如何使用 NumPy/SciPy 进行简单的高斯混合采样和 PDF 绘图?

    我添加三个正态分布以获得一个新的分布 如下所示 如何在python中根据这个分布进行采样 import matplotlib pyplot as plt import scipy stats as ss import numpy as np
  • UITextView 放入 UITableViewCell 时有时不显示内容

    我想知道是否还有其他人面临同样的问题 我有一个 UITextView 字段放置在 UITableViewCell 中 有时它不显示文本 当我单击或滚动表格视图时 它就会出现 有什么猜测吗 Details 我调用一个方法viewDidLoad
  • 如何创建不在 ScrollView 中或已禁用 ScrollView 的 ListView?

    我想要 ListView 中的一些好东西 例如能够使用 ListAdapter 和项目选择等 但我不想要其中的 ScrollView 部分 我想以不同的方式自己实现该部分 为什么或如何做到这一点并不是这个问题的重点 所以请不要问 为什么 有
  • 如何禁用 Spring 日志记录 DEBUG 消息?

    我正在开发一个简单的桌面应用程序 不是网络应用程序 这是我的log4j properties log4j rootCategory INFO stdout log4j appender stdout org apache log4j Con
  • 所有任务完成后继续任务

    在某些类中 我想使用 Task 异步加载 2 个集合并停止 busyindicator 我尝试这样的事情 var uiScheduler TaskScheduler FromCurrentSynchronizationContext Wai
  • 将块传递给 AFNetworking 方法?

    void getDataFromServer NSMutableDictionary dict NSURL url NSURL URLWithString NSString stringWithFormat doSomething Main
  • 如何快速从字符串中删除特定字符或单词?

    var myString 43321 This is example hahaha 4356 13 我想要的结果是 var resultString This is example 换句话说 我想删除某些单词和数字 这怎么可能 我已经进行了
  • Android 客户端中经过身份验证的 Cloud Endpoint 间歇性失败

    我有一个生产中的应用程序 在调用经过身份验证的云端点时收到大量强制 关闭 最能说明问题的是 java lang IllegalArgumentException 服务未注册 com google android gms internal e
  • dependency walker 在正确运行的系统上给我错误

    我的系统上缺少 dll 我有以下消息 无法加载文件或程序集 mydll dll 或其依赖项之一 当然 mydll 存在于此 它很可能是它所依赖的另一个 dll 我下载了 dependency walker 来检查它可能是什么 我首先在另一个
  • 获取带有注释的所有类并将它们添加到 android 中的 hashMap

    我不确定这是否可能 但我基本上希望能够轻松地将新项目添加到列表中 只需添加带有特殊注释的类即可 我能想到的唯一例子就是我目前正在做的事情 用户可以完成很多 挑战 目前我的应用程序中有一个用于 挑战 的包 我希望能够在该包中创建一个新类 给它
  • 来自函数参数的动态 Typescript 对象属性

    我有一个函数 它接受一个n参数的数量 并生成一个新对象 其中包含参数到唯一哈希的键值映射 Typescript 有没有办法从函数的参数动态推断返回对象的键 Example 生成字典的CreateActionType函数 function c
  • 使用 qtp 功能单击特定链接

    我想通过创建一个在操作中调用的函数来自动执行 Flipkart 的登录过程 Function Website this is the function Systemutil Run iexplore exe http www flipkar
  • VBA写入Word,更改字体格式

    我正在 Excel 中编写 VBA 脚本 以将基于某些表格的文本输出到 Word 文档 在大多数情况下 一切都很顺利 我在 stackoverflow 的帮助下自学 我有一个相当长的代码 因此将其全部复制到这里会很困难 我将尝试展示相关部分
  • 时间序列数据 - 如何[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在考虑进行一项为期一个月的研究 受试者记录他的饮酒量和排尿频率 我想让受试者每天记录这些活动 这样我就有一个月的数据 每天的排尿次
  • Kubernetes Pod 动态环境变量

    我需要能够将自定义环境变量分配给 Pod 的每个副本 一个变量应该是一些随机的 uuid 另一个唯一的数字 怎么可能实现呢 我更愿意继续使用带有副本的 部署 如果这不是开箱即用的 如何通过自定义复制控制器 控制器管理器来实现 有没有可用的钩
  • 使用 SESSION_CONTEXT 的实体框架核心行级安全性

    我正在使用 ASP NET Core 和 Entity Framework 7 Core 编写一个使用行级安全性的多租户应用程序 由于我的数据库托管在 Microsoft SQL Server 上 因此我使用了this https msdn
  • Facebook 点赞按钮点赞错误的网址

    如果我尝试制作一个 facebook like 按钮来喜欢以下网址 http go style co uk nggallery page 7029 image 35 该按钮喜欢以下网址 http go style co uk test ga
  • 如何以编程方式创建证书签名请求 (CSR)?

    如何用C实现呢 openssl req new key cert key out cert csr openssl x509 req in cert csr CA rootCA crt CAkey rootCA key CAcreatese
  • Monolog Logger 在每个日志消息的末尾输出空数组

    我的记录器对象在每行末尾输出空数组 例如 2017 08 17 12 26 02 import log INFO checkForDuplicates is processing 2017 08 17 12 26 04 import log
  • 如何使用 JavaFX 中的 JCSG 库将 MeshView 转换为 CSG 对象

    我正在使用 JavaFX 的 JCSG 库 我有一些MeshView我想将它们转换成的对象CSG对象 有办法实现吗 最简单的方法是组合javafx scene shape Mesh对象与 CSG 对象 前提是您有TriangleMesh正在