TriangleMesh JavaFX 中 getNormals() 方法的用途是什么

2024-03-21

我目前正在开发 JavaFX 3D 应用程序,并在 TriangleMesh 类中遇到 getNormals() 方法。

正如 Triangle Mesh 类用于创建用户定义的 Java FX 3D 对象一样,其中
getPoints()用于添加Points
getFaces() 用于添加 Faces
getTexCoords() 用于管理 3D 对象的纹理,
但我不确定 TriangleMesh 类中 getNormals() 方法的用途是什么。

在TriangleMesh类中,我们可以将顶点格式设置为VertexFormat.POINT_TEXCOORD和VertexFormat.POINT_NORMAL_TEXCOORD。
但是如果我们将 vertexFormat 设置为“VertexFormat.POINT_NORMAL_TEXCOORD”,那么我们需要将法线索引添加到面中,如下所示:
[ p0, n0, t0, p1, n1, t1, p3, n3, t3, // 纹理矩形的第一个三角形

p1, n1, t1, p2, n2, t2, p3, n3, t3 // 纹理矩形的第二个三角形 ]

如中所述https://docs.oracle.com/javase/8/javafx/api/javafx/scene/shape/TriangleMesh.html https://docs.oracle.com/javase/8/javafx/api/javafx/scene/shape/TriangleMesh.html

如果我使用 vertexFormat 作为 POINT_TEXCOORD 或 POINT_NORMAL_TEXCOORD,我没有发现 3D 形状有任何差异。

那么TriangleMesh JavaFX中的getNormals()方法有什么用呢?

提前致谢..


法线在计算机图形学中的使用 https://en.wikipedia.org/wiki/Normal_(geometry):

法线通常用于计算机图形学中,以确定表面朝向光源的方向以进行平面着色,或确定每个角(顶点)的方向以模仿具有 Phong 着色的曲面。


法线会影响应用于面部的阴影。

JavaFX 8 的标准着色机制是丰阴影 https://en.wikipedia.org/wiki/Phong_shading and a Phong反射模型 https://en.wikipedia.org/wiki/Phong_reflection_model。默认情况下,Phong Shading 假定平滑变化(线性插值)的表面法线向量。这允许您通过提供有限顶点几何体的着色来渲染球体。默认情况下法向量 http://mathworld.wolfram.com/NormalVector.htmls 将被计算为垂直于面。

JavaFX 允许您提供自己的法线,而不是依赖默认的计算法线。然后,JavaFX 中的 Phong 着色算法实现将在您提供的法线(而不是它计算的法线)之间进行插值。更改表面法线的方向将通过改变模型表示从其反射的光的方式来改变着色模型,本质上,光将以修改后的法线向不同的方向反射。

维基百科的这个示例在右侧显示了一个 phong 阴影球体。两个球体实际上具有相同的几何形状。有助于 phong 着色方程的法线分布是默认的、基于每个面的标准法线计算平滑插值的法线分布(因此不提供用户法线)。用于计算阴影的方程描述于Phong材料 https://docs.oracle.com/javase/8/javafx/api/javafx/scene/paint/PhongMaterial.htmljavadoc,您可以在漫反射颜色和镜面高光的计算方面看到对着色算法的正常贡献。

标准 3D 模型,例如目标文件 http://www.martinreddy.net/gfx/3d/OBJ.spec可以选择允许提供法线:

vn i j k

多边形和自由形式的几何声明。

指定具有分量 i、j 和 k 的法线向量。

顶点法线影响几何体的平滑着色和渲染。 对于多边形,使用顶点法线代替实际面 法线。对于曲面,顶点法线插值在 整个表面并替换实际的分析表面法线。

当顶点法线存在时,它们会取代平滑组。

i j k 是顶点法线的 i、j 和 k 坐标。他们 是浮点数


那么,你为什么想要它?

最简单的解释方法可能是看看称为平滑组 http://pre03.deviantart.net/66b8/th/pre/f/2007/005/1/3/blender___smoothing_groups_tut_by_ruzzy2006.jpg(请点击链接,由于版权原因我不会嵌入这里)。从链接的图像中可以看出,当将平滑组应用于面部集合时,可以在分组的面部之间获得清晰的轮廓(例如折痕或角)。指定法线允许您完成与平滑组类似的操作,只是需要更多控制,因为您可以为每个顶点指定单独的法线,而不是整个相关面组。注意 JavaFX 允许您通过指定平滑组getFaceSmoothingGroups() https://docs.oracle.com/javase/8/javafx/api/javafx/scene/shape/TriangleMesh.html#getFaceSmoothingGroups--对于您不想通过以下方式定义完整法线几何体的麻烦的情况获取法线() https://docs.oracle.com/javase/8/javafx/api/javafx/scene/shape/TriangleMesh.html#getNormals--.

另一个类似的想法是法线贴图 https://en.wikipedia.org/wiki/Normal_mapping (or bump map https://docs.oracle.com/javase/8/javafx/api/javafx/scene/paint/PhongMaterial.html#bumpMapProperty)。这样的贴图存储图像中的法线信息而不是矢量信息,例如获取法线() https://docs.oracle.com/javase/8/javafx/api/javafx/scene/shape/TriangleMesh.html#getNormals--方法,所以这是一个稍微不同的事情。但您可以看到与反射模型算法的类似交互:

背景阅读 - 如何理解 Phong 材料(和其他东西) http://web.eecs.umich.edu/~sugih/courses/eecs487/lectures/16-Phong+Shading.pdf

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

TriangleMesh JavaFX 中 getNormals() 方法的用途是什么 的相关文章

  • 条件绑定

    我是 JavaFx 新手 我正在创建一个应用程序 用户必须填写一些表单 并且我想使用绑定 预先验证 它们 简单的事情 比如所有元素都不能为空 或者其中一些元素只能包含数字 这是我到目前为止所拥有的 saveBtn disableProper
  • JavaFx - 线程“JavaFX 应用程序线程”中的无尽异常 java.lang.NullPointerException

    我得到以下异常 甚至无法理解它出现在什么地方 这意味着什么 Exception in thread JavaFX Application Thread java lang NullPointerException at com sun ja
  • 带有对象的 Javafx 可编辑组合框

    我刚刚开始学习 Java Fx 我有一个装满物体的组合框 我处理了 toString 方法 我可以看到我想要在屏幕上显示的名称 但现在我想让它可编辑 用户将输入自己的文本 ComboBox 将创建一个新对象并将该文本放入正确的字段中 我知道
  • 设置默认 JavaFX 对话框的样式

    我正在寻找一种方法来设置默认 JavaFX 对话框的样式 javafx scene control Dialog 我尝试获取 DialogPane 并添加样式表 但它只覆盖了对话框的一小部分 我更喜欢仅使用外部 css 文件设置样式 而不在
  • JavaFX 中的隐形舞台/场景

    我正在寻找一种隐藏 JavaFX 舞台或场景的方法 现在我知道了 hide 但这行不通 我需要一些仍然保留窗口的东西 但只是使其完全透明 一个很好的比喻是display none and visibility hidden在CSS中 第一个
  • 添加样式后如何重置回默认CSS?

    基本上 我通过添加如下样式类来更改 javafx 中文本字段的 css textfield getStyleClass add textfieldstyle 但后来我希望能够将其恢复到原来的样子 但由于本例中的原始外观是 JavaFX 的默
  • JavaFX 的 Swing 计时器替代方案以及线程管理差异

    使用 JavaFX 的 Swing 计时器是否安全 或者 Swing 有特殊的替代方案吗 JavaFX 和 Swing 的线程管理有什么区别 事实上我很想知道相当于摇摆计时器 SwingUtilities invokeLater and i
  • 如何根据鼠标位置显示工具提示? - JavaFX

    我有一个stackPane 充满一个圆圈和几条线 我想在将鼠标悬停在 StackPane 上时显示工具提示 并且工具提示应包含X Y coords鼠标的 我知道如何获取鼠标的坐标 但我无法找到显示工具提示的方法 你们中有人能帮我吗 安舒尔
  • JAVA FXCollections LoadException 类不是有效类型

    我正在尝试在此帮助下实现带有一些数据的 TableViewTutorial https docs oracle com javafx 2 fxml get started fxml tutorial intermediate htm CIA
  • JavaFX-CSS:如何将父级的样式“移动”到子级?

    触发这个问题的是一个快速实验来解决TreeItem选择宽度 https stackoverflow com q 23792004 203657 要求仅突出显示文本 而不是整个树单元 没有比这更容易的了 弗雷德里克说 实现一个带有图形标签的自
  • JavaFX ProgressBar:如何添加动画?

    我创建了一个进度条并更改了进度条颜色 是否可以像 bootstrap 动画进度条一样向进度条添加动画 这是示例 链接在这里 http getbootstrap com components progress animated 实际上 我找到
  • 学习 Java Native Access 时出现 com.sun.glass.ui 包错误

    我正在尝试在 JavaFX 项目中使用 Undecorated 阶段 stage initStyle StageStyle UNDECORATED 它是一个模块化的 Gradle 项目 它也是一个多项目构建 https guides gra
  • 使用 PixelWriter 在 JavaFX Canvas 上进行透明绘图

    有谁知道为什么使用drawImage 在Canvas上进行透明度绘制工作得很好 但在PixelWriter上却根本不起作用 我最初认为这可能与画布 上下文上的混合或其他模式 设置有关 但还没有任何运气 我需要每个像素的可变透明度 而不是整个
  • 向 Windows 任务栏缩略图添加按钮 JavaFX?

    这个问题已经闲置一年多了 我的问题仍然没有解决方案 我编辑此内容是为了澄清我的问题并引起人们对它的新关注 如果您使用 Windows 您可能知道将程序图标悬停在任务栏上时显示的小预览图像 缩略图 某些程序 例如 Spotify Git 扩展
  • 从后台线程更新可观察列表的正确方法

    我正在尝试遵循 MVC 进行测试项目 因此我的模型应该完全独立于我的观点 但是我不确定应该如何更新在后台线程中更新的可观察列表 正在给出有关上传的字符串 文件 以便消息显示在 UI 上的 ListView 中 我正在使用 JavaFX 并尝
  • 尝试让 GUI 使用 arrayList 在牌组中打印随机卡

    所以我目前正在用java开发一个卡牌战争游戏 我试图让 GUI 屏幕使用 arrayList 从一组卡片图像中打印 2 张随机卡片 必须使用它进行分配 卡片图像文件名为 1 png 2 png 52 png 并存储在 image card
  • 按下关闭按钮时 Java FX 中的关闭事件

    如果我直接按右上角的 X 按钮关闭窗口 Java FX 中是否存在任何事件处理程序 在这种情况下哪些事件会引起火灾 到目前为止 没有任何效果 setOnHiding 和 setOnCloseRequest 都不起作用 请帮忙 试试这个 im
  • JavaFX 全屏 - 根据屏幕尺寸调整元素大小

    有没有什么方法可以使全屏 如果可能的话也调整大小 而不是重新排列所有内容 实际上它所做的是重新排列元素 例如调整大小但调整到整个屏幕 以形成实际的全屏模式 就像通常改变屏幕分辨率的游戏一样 以便按钮和文本根据屏幕 窗口的大小相应增长 另外
  • 检测 TableView JavaFX 行上的双击

    我需要检测 a 的一行上的双击TableView 如何监听该行任何部分的双击并获取该行的所有数据并将其打印到控制台 TableView
  • JavaFX - Outlook 附件 - DnD

    您好 我需要一个 DnD 解决方案来将 Outlook 邮件附件拖到堆栈窗格中 JavaFX Outlook 2010 stackpaneDragAndDropZone setOnDragOver DragEvent event gt Dr

随机推荐

  • 线程中的临界区是什么?

    请有人能举例简单地告诉我临界区的含义是什么 用简单的语言 A 临界区 http en wikipedia org wiki Critical section是需要在没有外部干扰的情况下执行的代码部分 即没有其他线程可能影响该部分内的 中间
  • TypeScript 中的私有静态属性

    如果我执行下面类似的操作 如何从类中访问该属性 class Person private static name string console log Person name 不是应该无法访问吗 这应该是一个错误 但事实并非如此 根据规范第
  • 如何创建分支?

    如何在SVN中创建分支 使用创建一个新分支svn copy命令如下 svn copy svn ssh host example com repos project trunk svn ssh host example com repos p
  • 派生类中类模板的部分特化会影响基类

    我有一个元功能 struct METAFUNCION template
  • 在 WooCommerce 管理订单列表中添加自定义操作按钮

    我已关注本说明 https fernandoacosta net blog 2015 06 07 woocommerce adicionar novo status de pedido 为我的 WooCommerce 订单添加自定义订单状态
  • 如何修复应用程序构造函数中的异常

    我是 Javafx 新手 我刚刚下载了 JDK 12 并遵循了教程 它已经工作但对我不起作用 我正在使用模块来要求 javafx controls 这是代码 在我的主课中 我在SOFlow中尝试了很多解决方案但没有结果 我尝试了 1 将 p
  • 在 C# 中序列化和存储对象的最简单方法?

    我正在寻找一个简单的解决方案来序列化和存储包含配置 应用程序状态和数据的对象 它是一个简单的应用程序 数据不多 速度不是问题 我希望它正在进行中 我希望它在文本编辑器中比在 xml 中更容易编辑 我找不到任何可以在进程中处理它的 net 文
  • 如何使用Beautifulsoup4等待网站返回数据

    我使用 beautifulsoup4 编写了一个脚本 该脚本基本上从网页上的表格中获取密码列表 问题是我的 python 脚本不会等待网页返回的内容 并且会中断或显示 列表索引超出范围 代码如下 ssl lab url https www
  • 谷歌 reCaptcha V3 中的“浏览器错误”(不可见)

    我正在使用 google reCaptcha v3 不可见 但我收到了一些响应负载 success false error codes browser error 我用谷歌搜索但没有找到任何有关 浏览器错误 的信息 从 7900 个 reC
  • npm、pip、pipenv 和 Poetry 包管理器之间的功能比较 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 主要特点是怎样的npm与之比较pip pipenv and Poetry https python poetry org 包管理器 我
  • 记录 ServiceStack Web 服务 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 用于记录基于 ServiceStack 的 Web 服务的选项有哪些 我不是在谈论单行字符串 我希望能够详细记录 可能很长 返回类型
  • 定义 CreateProjection 和 CreateMap

    在我的项目中 我使用实体框架进行 ORM 使用 Dto 类进行 api 响应 我使用 Automapper 在两者之间进行映射 当我需要直接从 EF 可查询中获取 Dtos 时 我会执行最后的操作ProjectTo lt gt 根据我的查询
  • 将 ggplot 标题放置在绘图的右上角

    我正在使用优秀的theme minimal 在 ggplot0 9 3 中找到 它具有白色背景 我想将绘图的标题放置在绘图右上角的自定义位置 在下面的例子中我知道x and y值 但我想知道是否有办法通过xmax and ymax值以确保文
  • 迭代Go地图获取索引

    为了使用revel s even https revel github io manual templates html even模板中的关键字我想在迭代时获取地图条目的索引range 有什么办法可以做到吗 我的地图具有以下结构 map s
  • dequeueReusableCellWithReuseIdentifier: 和 cellForItemAtIndexPath: 之间的区别

    我一直想知道为什么我的代码可以很好地工作cellForItemAtIndexPath 不与dequeueReusableCellWithReuseIdentifier 在获取集合视图单元格时 这是我的代码 这个效果很好 NSInteger
  • 为连续序列和分割向量创建分组变量

    我有一个向量 例如c 1 3 4 5 9 10 17 29 30 我想将形成规则 连续序列的 相邻 元素分组在一起 即在参差不齐的向量中增加 1 结果是 L1 1L2 3 4 5L3 9 10 L4 17L5 29 30 天真的代码 前 C
  • 如何确定 Qt 5 中的 QtWebEngine 在运行时使用的是哪个 chromium 版本?

    我在 Qt 5 中找不到任何函数来确定使用哪个 chromium 版本QtWebEngine 我不想在代码中硬编码 chromium 版本 因为我经常更新我的应用程序 并且每个版本中的 chromium 版本通常都会更改 而且 Qt 是向后
  • 目录相对 ZwCreateFile

    我必须为我的大学项目实施交叉视图文件完整性检查器 为此 我如何在内核模式下列出目录的文件 你的起点是ZwCreateFile http msdn microsoft com en us library windows hardware ff
  • 如何使用 ComPtr 中包装的 Direct3D 11 指针来获取 11.1 接口?

    我正在遵循教程 并将通常的初始化转换为使用 ComPtrs 直到这一行 ID3D11Device g pd3dDevice nullptr ID3D11Device1 g pd3dDevice1 nullptr Obtain the Dir
  • TriangleMesh JavaFX 中 getNormals() 方法的用途是什么

    我目前正在开发 JavaFX 3D 应用程序 并在 TriangleMesh 类中遇到 getNormals 方法 正如 Triangle Mesh 类用于创建用户定义的 Java FX 3D 对象一样 其中getPoints 用于添加Po