使用 JavaFX 将渐变应用于球体对象

2023-12-07

我正在 JavaFX 中工作,我正在尝试将渐变应用于球体,但是(显然),我不知道该怎么做。我被困住了,因为我知道球体是一个对象,所以它需要有一种材质,但是(就颜色而言),PhongMaterial 只采用一种颜色,所以它不会采用渐变,因为渐变是一系列颜色。所以基本上我正在尝试的是以下内容:

    Sphere sphere = new Sphere(50);
    RadialGradient rg = new RadialGradient(0, 0, 0, 0, 5, true, CycleMethod.REPEAT, /*arbitrary/irrelevant color Stop objects*/));
    PhongMaterial pm = new PhongMaterial();
    pm.setDiffuseMap(pm);
    sphere.setMaterial(asdf);

现在显然这段代码不起作用,但我想这是我想要做的事情的想法/流程。


你对一件事是对的PhongMaterial需要一个Color作为漫反射颜色,这不允许Gradient。为此,它应该接受Paint, 但事实并非如此。

所以我们必须寻找不同的替代方案。

漫反射贴图

如果你检查PhongMaterial,您可以设置漫反射贴图带有图像。这意味着您可以使用具有某种渐变的现有图像并将其应用到球体。

像这样的东西:

Sphere sphere = new Sphere(100);
PhongMaterial material = new PhongMaterial();
material.setDiffuseMap(new Image("http://westciv.com/images/wdblogs/radialgradients/simpleclorstops.png"));
sphere.setMaterial(material);

将产生以下结果:

动态漫反射贴图

显然,这具有依赖静态图像的缺点。如果你想动态修改它怎么办?

您可以做到这一点,如果您生成径向渐变,将其渲染在辅助场景上并拍摄它的快照。该快照返回一个WritableImage您可以直接用作漫反射贴图。

像这样的东西:

Scene aux = new Scene(new StackPane(), 100, 100, 
        new RadialGradient(0, 0, 0.5, 0.5, 1, true, CycleMethod.REPEAT, 
                new Stop(0, Color.GREEN), new Stop(0.4, Color.YELLOW), 
                new Stop(0.6, Color.BLUE), new Stop(0.7, Color.RED)));
WritableImage snapshot = aux.snapshot(null);

Sphere sphere = new Sphere(100);
PhongMaterial material = new PhongMaterial();
material.setDiffuseMap(snapshot);
sphere.setMaterial(material);

您现在将拥有:

密度图

还有另一种选择是使用数学函数生成密度图,并且颜色将通过该函数的映射给出。

为此,您不能使用内置的Sphere,但你必须创建自己的TriangleMesh并使用纹理坐标,或者您可以简单地使用 FXyz,一个开源 JavaFX 3Dlibrary具有许多不同的基元和纹理选项。

对于这种情况,您可以从 Maven Central 获取该库(org.fxyz3d:fxyz3d:0.3.0), 用一个SegmentedSphereMesh控制,然后选择纹理模式`Vertices3D:

SegmentedSphereMesh sphere = new SegmentedSphereMesh(100);
sphere.setTextureModeVertices3D(1530, p -> p.z);

请注意,本例中的函数仅基于z坐标,但显然您可以根据需要对其进行修改。

检查库(有一个采样器),以探索其他选项。

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

使用 JavaFX 将渐变应用于球体对象 的相关文章

随机推荐

  • IE11 Selenium WebDriverException:无法导航。 (org.openqa.selenium.WebDriverException ...IWebBrowser2::Navigate2() 失败

    我是自动化测试新手 虽然我的 Selenium 测试在 Chrome 和 Firefox 上运行 但它们没有在 IE11 上运行 我做了下面详细说明的所有检查 但我不断遇到此错误 org openqa selenium WebDriverE
  • 如何一次只打开 1 个手风琴

    accordion on click accordion control function e e preventDefault this next accordion panel not animated slideToggle ul c
  • 将 SMB 添加到 Windows,这有多安全?

    我遇到了一个小黑客 它声称它可以在 Windows 上启用 smb 抱怨是这样的事情 a href text a 没工作 虽然您确实可以在 url 中使用 file 但用户希望使用 smb 以便它是跨平台的 黑客攻击的过程如下 1 创建这个
  • MySQL IFNULL“N/A”产生“在集合中找不到项目”错误

    我一直在使用 ISNULL 函数在 mySQL 查询中将 NULL 值转换为零 如下所示 SELECT IFNULL mem comment count 0 FROM members 这很好用 我现在尝试使用 IFNULL 函数将 NULL
  • 使用 Python gtk3 在 X 上进行全局键绑定

    我正在寻找一些可以与 gtk3 一起使用的 python xlib 全局键绑定示例 就像为 gtk2 所做的那样http www siafoo net snippet 239 这里的代码非常相似 from Xlib display impo
  • 如何添加NodeJs、S3、heroku直接上传到android?

    我试图了解如何将他们提供示例的方式从网站转换为 android retrofit 这是该网站的代码示例 function get signed request file var xhr new XMLHttpRequest xhr open
  • 多个子进程在同一管道上读/写

    我目前正在Linux环境中使用C语言学习套接字编程 作为一个项目 我试图编写一个基本的聊天服务器和客户端 目的是让服务器为每个连接的客户端分叉一个进程 我遇到的问题是读取一个孩子的数据并将其写入所有连接的客户端 我尝试通过在子级中循环调用
  • 是否可以在 ES6 Set 实例上使用数组迭代方法?

    我正在使用 ES6 Set 实例 我需要对它们应用一些转换 如果它们是数组的话 这些转换就会很简单 这是一个例子 let s new Set s add 1 s add 2 s add 3 let n s filter val gt val
  • 求和常量时的隐式缩小与求和变量时的显式缩小

    我写了一个程序 class First public static void main String args int c 5 byte b c 6 System out println b 我的 javac 输出是 error incom
  • 将一行转置为多行 Oracle

    我有一个总是返回一行的查询many列 我想把它变成 2 列和许多行 原始结果 Col1 Col2 Col3 Col4 val1 val2 val3 val4 我想要的是 ColName Value Col1 val1 Col2 val2 C
  • 了解 Chrome 网络日志“停滞”状态

    我在 Chrome 中有以下网络登录 我不明白其中的一件事 填充的灰色条和透明的灰色条有什么区别 谷歌对这些字段进行了细分评估网络性能他们的 DevTools 文档的部分 摘自资源网络时序 停滞 阻塞 请求在发送之前等待所花费的时间 该时间
  • 为什么不调用成员变量的移动构造函数?

    考虑以下课程 如果我自己实现移动构造函数如下 为什么是 bar 成员b不是移动而是复制 但如果我使用默认的移动构造函数 那么b被感动了 为什么b rhs b 不打电话bar bar 我使用 g 9 2 1 和 std c 11 class
  • jQuery滚动显示隐藏内容

    如何使默认情况下页面上显示 6 个 div 元素 并且当用户滚动到页面底部时 再加载 6 个元素 如果你看到这个example 它有多个div 我希望最初只显示其中 6 个 每次用户到达页面底部时 我希望再加载 6 个 直到您 用完 div
  • 使用什么语法从 JavaDB 数据库中选择常量字段值?

    我在用着UNION ALL结合几个结果SELECT查询成一ResultSet 我使用常量字段值来标识哪条语句生成了每一行 这适用于 MySQL 但 Java DB 会抛出异常SQLSyntaxErrorException 指向第一个常量字段
  • Mac OSx 10.8 上 IDLE (Python 3.3.2) 中的 NumPy

    我知道这可能是一个重复的问题 但我在这里找到的所有答案都超出了我的想象 我对 Python 很陌生 但我想在 IDLE 中使用 NumPy python 3 3 2 IDLE 似乎无法访问 OSX 10 8 即 python 2 7 附带的
  • 按关键字对数组中的元素进行分组

    我正在 AngularJS 1 上开发一个应用程序 但我不知道如何按项目拆分另一个数组中的项目数组 我的意思是我有一系列不同的项目 我会按 uuid 对项目进行分组 如下所示 name toto uuid 1111 name tata uu
  • 做 {...} while(false)

    我正在查看一个人的一些代码 注意到他的函数中似乎有一个模式
  • 可以使用“new”位置来更改“const”数据吗?

    这是后续memcpy 可以用来更改 const 成员数据吗 And 声明 C 不可变类的惯用方式真正解决这个问题 尤其是this回答 在围绕不可变数据设计的语言中 它知道它可以 移动 您的数据 尽管它具有 逻辑 不变性 Given a st
  • 如何在 AutoFixture 中设置更复杂(类似 IoC)的注册

    使用 AutoFixture 时 是否可以在集成测试中重用生产 IoC 容器注册 问题是 如果未注册依赖项并注入 真实 数据库相关依赖项 我需要以下固定装置设置来注入模拟 var fixture new Fixture WithMocks
  • 使用 JavaFX 将渐变应用于球体对象

    我正在 JavaFX 中工作 我正在尝试将渐变应用于球体 但是 显然 我不知道该怎么做 我被困住了 因为我知道球体是一个对象 所以它需要有一种材质 但是 就颜色而言 PhongMaterial 只采用一种颜色 所以它不会采用渐变 因为渐变是