如何在 JavaFX 8 中创建自定义 3D 模型?

2023-12-20

我尝试使用官方教程在 JavaFX 应用程序中制作一架飞机,并有以下代码:

Image diifuseMap = new Image(getClass().getResource("t.jpg").toExternalForm());
    TriangleMesh planeMesh = new TriangleMesh();
    float[] points = {
            -5, 5, 0,
            -5, -5, 0,
            5, 5, 0,
            5, -5, 0
    };
    float[] texCoords = {
            0, 0,
            0, 1,
            1, 0,
            1, 1
    };
    int[] faces = {
            0, 0, 1, 1, 2, 2,
            2, 2, 3, 3, 1, 1
    };
    planeMesh.getPoints().addAll(points);
    planeMesh.getTexCoords().addAll(texCoords);
    planeMesh.getFaces().addAll(faces);
    MeshView meshView =   new MeshView(planeMesh);
    meshView.setMaterial(new PhongMaterial(Color.BLACK, diifuseMap, null, null, null));
    Group3D plane = new Group3D(new MeshView(planeMesh));

但遗憾的是,现场什么也没有出现。谁能解释一下如何在 JavaFX 中创建我自己的 3d 模型?是否可以在没有纹理的情况下创建它们(我想要线框模型)?


场景中什么也没有出现

你的示例网格对我来说效果不错。

也许您没有正确设置相机,或者没有缩放网格以使其可见。

您的示例网格没有太多作用,它是一个面向相机的三角形和第二个背向相机的三角形。

是否可以在没有纹理的情况下创建它们(我想要线框模型)?

Yes, 设置绘图模式 http://download.java.net/jdk8/jfxdocs/javafx/scene/shape/Shape3D.html#setDrawMode%28javafx.scene.shape.DrawMode%29让您的网格视图Line http://download.java.net/jdk8/jfxdocs/javafx/scene/shape/DrawMode.html#LINE.

示例程序说明

我改变了你的脸的顺序,使它们都面向相同的方向,这样你就会得到一个面向观察者的正方形,而不是一个面向观察者的三角形和一个远离观察者的三角形:

int[] faces = {
    2, 2, 1, 1, 0, 0,
    2, 2, 3, 3, 1, 1
};

此外,纹理贴图需要更改(为了使上面的面数组在纹理上获得正确的方向,因此它不会颠倒)。

float[] texCoords = {
    1, 1,
    1, 0,
    0, 1,
    0, 0
};

我设置了一个剔除控件并以动画方式旋转模型,以便您可以看到三角形的“后”面(黑色),并且清楚正在渲染的内容。我还添加了切换纹理或线框模式的漫反射贴图(一些大理石)的功能。

示例程序输出

示例程序

import javafx.animation.*;
import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.geometry.Insets;
import javafx.scene.*;
import javafx.scene.control.CheckBox;
import javafx.scene.image.Image;
import javafx.scene.layout.VBox;
import javafx.scene.paint.*;
import javafx.scene.shape.*;
import javafx.scene.transform.Rotate;
import javafx.stage.Stage;
import javafx.util.Duration;

public class InlineModelViewer extends Application {

  private static final int VIEWPORT_SIZE = 800;

  private static final double MODEL_SCALE_FACTOR = 40;
  private static final double MODEL_X_OFFSET = 0;
  private static final double MODEL_Y_OFFSET = 0;
  private static final double MODEL_Z_OFFSET = VIEWPORT_SIZE / 2;

  private static final String textureLoc = "https://www.sketchuptextureclub.com/public/texture_f/slab-marble-emperador-cream-light-preview.jpg";

  private Image texture;
  private PhongMaterial texturedMaterial = new PhongMaterial();

  private MeshView meshView = loadMeshView();

  private MeshView loadMeshView() {
    float[] points = {
        -5, 5, 0,
        -5, -5, 0,
        5, 5, 0,
        5, -5, 0
    };
    float[] texCoords = {
        1, 1,
        1, 0,
        0, 1,
        0, 0
    };
    int[] faces = {
        2, 2, 1, 1, 0, 0,
        2, 2, 3, 3, 1, 1
    };

    TriangleMesh mesh = new TriangleMesh();
    mesh.getPoints().setAll(points);
    mesh.getTexCoords().setAll(texCoords);
    mesh.getFaces().setAll(faces);

    return new MeshView(mesh);
  }

  private Group buildScene() {
    meshView.setTranslateX(VIEWPORT_SIZE / 2 + MODEL_X_OFFSET);
    meshView.setTranslateY(VIEWPORT_SIZE / 2 * 9.0 / 16 + MODEL_Y_OFFSET);
    meshView.setTranslateZ(VIEWPORT_SIZE / 2 + MODEL_Z_OFFSET);
    meshView.setScaleX(MODEL_SCALE_FACTOR);
    meshView.setScaleY(MODEL_SCALE_FACTOR);
    meshView.setScaleZ(MODEL_SCALE_FACTOR);

    return new Group(meshView);
  }

  @Override
  public void start(Stage stage) {
    texture = new Image(textureLoc);
    texturedMaterial.setDiffuseMap(texture);

    Group group = buildScene();

    RotateTransition rotate = rotate3dGroup(group);

    VBox layout = new VBox(
        createControls(rotate),
        createScene3D(group)
    );

    stage.setTitle("Model Viewer");

    Scene scene = new Scene(layout, Color.CORNSILK);
    stage.setScene(scene);
    stage.show();
  }

  private SubScene createScene3D(Group group) {
    SubScene scene3d = new SubScene(group, VIEWPORT_SIZE, VIEWPORT_SIZE * 9.0/16, true, SceneAntialiasing.BALANCED);
    scene3d.setFill(Color.rgb(10, 10, 40));
    scene3d.setCamera(new PerspectiveCamera());
    return scene3d;
  }

  private VBox createControls(RotateTransition rotateTransition) {
    CheckBox cull      = new CheckBox("Cull Back");
    meshView.cullFaceProperty().bind(
        Bindings.when(
            cull.selectedProperty())
              .then(CullFace.BACK)
              .otherwise(CullFace.NONE)
    );
    CheckBox wireframe = new CheckBox("Wireframe");
    meshView.drawModeProperty().bind(
        Bindings.when(
            wireframe.selectedProperty())
              .then(DrawMode.LINE)
              .otherwise(DrawMode.FILL)
    );

    CheckBox rotate = new CheckBox("Rotate");
    rotate.selectedProperty().addListener(observable -> {
      if (rotate.isSelected()) {
        rotateTransition.play();
      } else {
        rotateTransition.pause();
      }
    });

    CheckBox texture = new CheckBox("Texture");
    meshView.materialProperty().bind(
        Bindings.when(
            texture.selectedProperty())
              .then(texturedMaterial)
              .otherwise((PhongMaterial) null)
    );

    VBox controls = new VBox(10, rotate, texture, cull, wireframe);
    controls.setPadding(new Insets(10));
    return controls;
  }

  private RotateTransition rotate3dGroup(Group group) {
    RotateTransition rotate = new RotateTransition(Duration.seconds(10), group);
    rotate.setAxis(Rotate.Y_AXIS);
    rotate.setFromAngle(0);
    rotate.setToAngle(360);
    rotate.setInterpolator(Interpolator.LINEAR);
    rotate.setCycleCount(RotateTransition.INDEFINITE);

    return rotate;
  }

  public static void main(String[] args) {
    System.setProperty("prism.dirtyopts", "false");
    launch(args);
  }
}

谁能解释一下如何创建我自己的 3D 模型

对于 StackOverflow 来说,这个问题太宽泛了。有些大学和艺术学院颁发此类文凭。

谁能解释为什么 Mesh.setAll 采用 float[] 而 API 的其余部分使用 double ?

JavaFX 3D 实现提供了与图形硬件(例如 DirectX 和 OpenGL)通信的本机 API 的包装器。这些 API 使用浮点精度而不是双精度。使用float[]直接在API中意味着网格模型数据可以比如果更有效地存储并直接映射到底层图形APIdouble[] or an ObservableList<Double>被使用。

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

如何在 JavaFX 8 中创建自定义 3D 模型? 的相关文章

  • Matlab:3D 堆积条形图

    我正在尝试创建一个 3D 堆积条形图 如这个问题所示 Matlab 中的 3D 堆叠条形图 https stackoverflow com questions 13156133 3d stacked bars in matlab 5D 然而
  • Javafx 组合框不会在实时更改时更新下拉列表大小?

    我正在使用 Javafx v8 0 25 b18 我出现的问题是动态组合框的下拉列表的大小不会改变 所以如果我最初在下拉列表中有两个项目 那么下拉列表大小将适合两个项目 但如果我现在用以下内容填充动态组合框三个项目 然后我在里面得到一个小滚
  • 在 RGL 中将立方体绘制到 3D 散点图中

    我正在尝试向 3D 散点图添加较小的立方体 网格 具有指定边长 我希望立方体位于原点 我该怎么做呢 我已经玩过cube3d 但我似乎无法将立方体正确定位 也无法使其成为网格 因此我可以看到它包含的数据点 这是我所拥有的 library rg
  • 如何挤出平面 2D 网格并赋予其深度

    我有一组共面 连接的三角形 即二维网格 现在我需要将其在 z 轴上挤出几个单位 网格由一组顶点定义 渲染器通过与三角形数组匹配来理解这些顶点 网格示例 顶点 0 0 0 10 0 0 10 10 0 0 10 0 所以这里我们有一个二维正方
  • 如何将平面上的 3D 点转换为 UV 坐标?

    我有一个 3d 点 定义为 x0 y0 z0 该点属于一个平面 定义为 a b c d normal a b c and ax by cz d 0 如何将 3d 点转换或映射为一对 u v 坐标 这一定是非常简单的事情 但我无法弄清楚 首先
  • JavaFX 8 默认消息图标

    随着 JavaFX 的最近几次更新 我们收到了警报 我想获取消息的默认图标 错误 警告 在Swing中 我可以通过一些方式获取L F消息图标UIManager的属性 如何在 JavaFX 中获取消息的默认图标 它们是包含在属性中 还是由 C
  • 如何监听场景图节点中的WindowEvent.WINDOW_SHOWN?

    似乎 WindowEvent WINDOW SHOWN 永远不会在场景图中的任何节点上分派 也没有 我能找到的 知道节点何时可见 渲染 显示 例如 测试启动器 java package com example javafx event im
  • 如何解决 onEditCommit 事件上的类型不匹配错误?

    我在 Fxml 中使用 onEditCommit 事件在用户编辑数据后检索数据 FXML 代码
  • 在JavaFX中如何在表视图中添加带有数据的组合框

    我已经尝试了很多 但无法将数据库中的所有值填充到我的组合框表格单元格中 控制器 java public class controller GetConnection gc new GetConnection PreparedStatemen
  • 3D 透视投影的剪辑矩阵

    我正在尝试创建一个简单的 3D 图形引擎 并找到并使用了我在这里找到的方程 http en wikipedia org wiki 3D projection cite note 0 http en wikipedia org wiki 3D
  • 如何在JavaFX中播放其他视频格式

    我正忙于电影 视频剪辑播放器 库 我想在 JavafX 中做到这一点 几乎 90 的视频剪辑都是 AVI 格式 由于多种原因 我无法隐藏电影 视频剪辑 我还希望该程序能够标记已播放的视频文件 从开始到结束 以便我知道观看了什么 因此程序需要
  • JavaFX:如何在 JavaFX 中正确使用 ProgressIndicator

    我是 JavaFX 新手 我的 JavaFX 应用程序有问题 我需要在数据库查询之前启动 ProgressIndicator 类型 INDETERMINATE 这是我的代码的一部分 spinner setVisible true passC
  • 使用 vtk 给定一组点创建多条折线

    我需要使用 vtk 和 paraview 显示 50 个粒子空间中的轨迹 目前我的数据是pos x y t n 其中 n 是第 n 个粒子的标签 我已将所有数据保存在 vtk 文件中 该文件的组织方式如下 vtk DataFile Vers
  • React-Three-Fiber:JSON 中位置 3 出现意外标记 c 错误

    我正在尝试使用 React Three Fiber 加载 glb 文件 但出现以下错误 Error Unexpected token c in JSON at position 3 我不确定我做错了什么 看来此问题最常见的解决方案是将 gl
  • 如何在 R 中导入并绘制三角形网格?

    我想在 R 中绘制我的模型输出 它是格式为的三角形网格 x1 y1 z1 x2 y2 z2 x3 y3 z3 value 每行代表一个三角形 我想用以下方法绘制这些三角形value作为规模 mymesh lt structure c 0 9
  • 关于Marching Cubes算法的澄清

    关于Marching Cubes 我对其算法和实现有一些疑问 我已经阅读了 Marching Cubes 的 Paul Bourke 优秀文章以及网站上可用的源代码 但是 我在理解以及如何以自己的方式实现算法方面仍然遇到了一些问题 问题如下
  • 绘制圆和连接这些圆的曲线

    我需要绘制一些圆圈和连接这些圆圈的曲线 圆圈必须以行和列的方式绘制 所以我想使用 GridPane 将是一个不错的选择 但是 绘制完所有圆圈后 如何添加曲线来连接属于此 GridPane 上不同列的圆圈 我无法将 GridPane add
  • Javafx过滤表视图

    我正在尝试使用文本字段来过滤表视图 我想要一个文本字段 txtSearch 来搜索 nhs 号码 名字 姓氏 和 分类类别 我尝试过在线实施各种解决方案 但没有运气 我对这一切仍然很陌生 所以如果问得不好 我深表歉意 任何帮助将不胜感激 我
  • 在 javafx.scene.control.TextArea 和 javafx.scene.control.TextField 中设置插入符位置

    我需要在代码中手动设置插入符位置 有一个getCaretPosition under javafx scene control TextInputControl但没有setter方法 如何设置插入符位置 TextArea ta new Te
  • JavaFX Platform.runLater 的使用以及从不同线程访问 UI

    我有几个问题Platform runLater 我有一个 JavaFX 应用程序类 在这个类中 我运行一个线程 该线程从网络套接字读取数据 现在当我创建一个新的Stage在线程内部 系统抛出异常 JavaFX 事件调度程序线程和我的网络读取

随机推荐

  • 动画移动 UIButton 在移动时不响应触摸/点击

    我正在尝试为 UIButton 制作动画以在屏幕上移动 用户可以随时触摸它 然而 它似乎在移动时不响应触摸 仅在动画的开始和结束时响应 我想这是因为按钮本身没有移动 只是它的图像在移动 我有什么想法可以解决这个问题吗 到目前为止 这是我的代
  • PHP - 如果抽象类中的所有方法都是抽象的,那么接口和抽象类有什么区别

    抽象类可能有也可能没有抽象方法 但接口仅具有未实现的方法 那么 如果我的抽象类将其所有方法都标记为抽象 那么使用接口有什么区别和优点呢 接口和抽象使用的真正威力可以在具有大量类的庞大 API 中体现出来 这些类遵循经过深思熟虑的灵活结构以供
  • .Net聊天室系统

    我有一位客户要求在他的网站上添加聊天室系统 该站点构建在我无法直接访问的 Windows 服务器上 因此我在很大程度上仅限于使用 Net 解决方案 虽然我可以从头开始构建一些东西 但我觉得从头开始在这个网站中构建一个功能齐全的聊天室系统将是
  • UITableViewAutomaticDimension 的 UITableViewCell 高度错误

    我用 2 个多行标签制作自定义单元格 并将该标签固定到所有侧面 当在 tableView heightForRowAtIndexPath for iOS gt 8我回来UITableViewAutomaticDimension 但是当表格视
  • 如何使用 C# 从 BIOS 获取 CPU 温度信息?

    如何使用 c 从 Bios 获取 CPU 温度信息 我尝试了以下代码CPU温度监控 https stackoverflow com questions 2923984 cpu temperature monitoring c 但没有运气 e
  • 静态初始化期间可以安全地创建线程吗?

    在某些时候 我记得读到直到 main 的第一行才能安全地创建线程 因为编译器插入特殊代码以使线程在静态初始化期间运行 因此 如果您有一个在构造时创建线程的全局对象 您的程序可能会崩溃 但现在我找不到原文了 我很好奇这个限制有多强 按照标准严
  • 如何在一次 ajax 调用中将多个数组传递给控制器​​方法 ASP.net MVC 4

    我有多个数组想要从视图传递到控制器方法中 为此 我将这些数组转换为 JSON 对象 然后 创建 AJAX 调用 但如何立即发送这些 JSON 对象 var json InstallationControl JSON stringify ar
  • 如何将任意数据粘贴到 TMemo 中?

    复制和粘贴文本很容易 因为它内置于 TMemo 中 但它似乎只能处理文本 不过 在我看来 任何类型的数据都可以表示为字符串 如果我从另一个程序复制一些任意数据并希望将其粘贴到 TMemo 中 如何让 Delphi 将其接受为原始字符串 如果
  • 从Android设备读取数据库文件

    我一直在尝试从我的 Android 应用程序中提取 SQLite 数据库的副本以供开发 我的第一次尝试是打电话 adb shell cd data data cd com example app cd databases 但后来我被困在这里
  • jQuery DatePicker 问题:设置当前日期

    日期选择器setDate方法 如上所述here http docs jquery com UI Datepicker method setDate没有按预期工作 日期选择器始终获取浏览器的当前日期 但是我要设置我选择的当前日期 target
  • 快速分割数组的优雅方法

    给定任何类型的数组和所需的子数组数量 我需要以下输出 print 0 1 2 3 4 5 6 splitInSubArrays into 3 0 3 6 1 4 2 5 输出必须包含正确数量的子数组 即使没有 足够 的元素来填充这些子数组
  • 如何找到文本框中光标的位置? C#

    我有一个标准的 WinForms TextBox 我想在文本中的光标位置插入文本 如何获取光标的位置 Thanks 无论是否选择任何文本 选择开始 http msdn microsoft com en us library system w
  • ASP.Net MVC 中通过 ajax 传递列表

    我想通过 AJAX 传递列表 我怎样才能做到这一点并在运行时赋值 我正在这样做 但它传递了空值 这是我的代码 JQuery for var i 0 i lt 5 i aabc id i color Level i var str2 aabc
  • 使用 LINQ 连接两个列表

    我有两个列表 list1 和 list2 列表1包含 1 a 2 b 3 c 4 d 列表2包含 3 c 4 d 5 e 我想要使 用 LINQ 以下列表 1 a 2 b 3 c 4 d 5 e List1 Concat List2 Whe
  • 在命令行上运行的 C++ 代码覆盖工具[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何根据设备屏幕尺寸调整集合视图单元格的大小?

    我注意到单元格总是遵循尺寸检查器中的定义 即使我已经应用了 UICollectionViewDelegateFlowLayout 看起来就是这样 但我希望这些单元格看起来更像更小的 iPhone 屏幕上的样子 实施sizeForItemAt
  • 使用实体框架的最小存储库实现

    我正在尝试在我的应用程序中实现最小的通用存储库模式 我有一个非常小的界面用于查询和保存数据 public interface IRepository IQueryable
  • 反应子/父组件 - onChange 事件只接受一个字符并且不保留值

    在 ReactJS 中 在我的子组件中 输入 gt 文本上的 onChange 事件仅采用一个值 并且不会在每次按键时保留先前的值 我正在尝试捕获子表单中的输入 并希望将其传输给父表单 实际上 我正在尝试重用子表单来创建和编辑页面 我的完整
  • 如何使用 TailwindCSS 禁用环形阴影?

    这就是我的问题的样子 见环 看图 https i stack imgur com RLCE0 png 使用Chrome的inspector发现与 tw ring shadow 所以我尝试添加类ring 0 and ring offset 0
  • 如何在 JavaFX 8 中创建自定义 3D 模型?

    我尝试使用官方教程在 JavaFX 应用程序中制作一架飞机 并有以下代码 Image diifuseMap new Image getClass getResource t jpg toExternalForm TriangleMesh p