- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我开始使用 JavaFX 来可视化 3D 非结构化网格,但我正面临渲染问题。
如 [1] 中所述,除非您使用 CullFace.NONE 选项,否则 JavaFX 只会渲染三角形的正面。但是后面的脸是黑色的。
由于 3D 网格是由外部工具(例如 Gmsh http://geuz.org/gmsh/)生成的,因此我无法控制面的方向。使用网格的科学软件也不需要定向网格。
因此,我不想事后重新定向网格,只是为了相同地渲染三角形的正面和背面。 JavaFX 8 可以做到这一点吗?如何?
感谢您的回答。
值得注意的是:我也在 Oracle 论坛 [2] 上发布了一个类似的问题,但它们似乎很空洞。如果你们中的一些人知道 JavaFX 社区活跃的地方,那么链接会很有用。如果我有有用的答案要分享,我当然会更新这两个线程。
亲切的问候
[1] How to make sense of JavaFX triangle mesh?
[2] https://community.oracle.com/thread/3593434
最佳答案
解决方案 1
您可以通过绘制两组具有不同面方向的网格来解决该问题。请参阅下面的结果和代码。然而,这会使数据量和处理时间加倍。
PS:还有一个问题值得一提。目前尚不清楚在当前版本的 JavaFX (@August 2014) 中,您是否可以为网格边缘着色不同于面的颜色。如果您需要制作平面拼贴的可见单个拼贴,这将是必要的。解决方案是再次添加两组网格对象。但这使所需资源翻了两番。
此外,人们想剔除一些不必要的边缘。在下图中,只需要突出显示地板边缘,而不是对角线。
解决方案 2
将每个网格面替换为 3D 网格对象,即您创建的不是矩形表面,而是创建平板。因此,一个开放的盒子对象将由五块板制成,盒子的内部和外部将具有相同的颜色。这个解决方案,就像第一个一样,仍然是一个黑客,仍然会产生处理开销。
数字
实际 JavaFX 渲染与所需渲染(在 Matlab 中生成)之间的比较:
http://s30.postimg.org/iuotogvgh/3d_tower.jpg
部分解决方案:
http://s30.postimg.org/83dcwtpkx/3d_boxes.png
代码
import javafx.scene.Group;
import javafx.scene.paint.Color;
import javafx.scene.paint.PhongMaterial;
import javafx.scene.shape.CullFace;
import javafx.scene.shape.DrawMode;
import javafx.scene.shape.MeshView;
import javafx.scene.shape.TriangleMesh;
/**
// * Draw polygonal 3D box.
// *
// * INPUT
// * - footprint: 2D polygon coordinates;
// * closed path (i.e. first and last coordinates are identical); ex:
// * float[] footprint = {
// * 10, -1,
// * -1, -1,
// * -1, 5,
// * 10, 5,
// * 10, -1
// * };
// * - zLevel: z-coordinate of actual floor level: int k; float zLevel = k * HEIGHT - HEIGHT;
// * - HEIGHT: height of the box: private static final float HEIGHT = (float) 50;
// *
// * NOTE: we have to use the mesh method since the straightforward way
// * to construct a rectangle - "rectangle" method - produces blurry edges.
// *
// */
public class DrawPolygonalBox {
// Draw polygonal 3D box.
public static Group draw(float[] footprint, float zLevel, float HEIGHT) {
Group box = new Group();
int y = 0;
// for each footprint coordinate make a rectangle
int n = footprint.length - 2;
// one side of the box
for (int k = 0; k < n; k = k + 2) {
float[] points = {
footprint[k], y + zLevel, footprint[k + 1],
footprint[k + 2], y + zLevel, footprint[k + 3],
footprint[k + 2], y + zLevel + HEIGHT, footprint[k + 3],
footprint[k], y + zLevel + HEIGHT, footprint[k + 1]
};
float[] texCoords = {
1, 1,
1, 0,
0, 1,
0, 0
};
int[] faces = {
0, 0, 2, 2, 1, 1,
0, 0, 3, 3, 2, 2
};
int[] faces2 = {
0, 0, 1, 1, 2, 2,
0, 0, 2, 2, 3, 3
};
TriangleMesh mesh1 = new TriangleMesh();
mesh1.getPoints().setAll(points);
mesh1.getTexCoords().setAll(texCoords);
mesh1.getFaces().setAll(faces);
TriangleMesh mesh2 = new TriangleMesh();
mesh2.getPoints().setAll(points);
mesh2.getTexCoords().setAll(texCoords);
mesh2.getFaces().setAll(faces2);
final MeshView rectangle1 = new MeshView(mesh1);
rectangle1.setMaterial(new PhongMaterial(Color.web("#FF0000",0.25)));
rectangle1.setCullFace(CullFace.BACK);
final MeshView rectangle2 = new MeshView(mesh2);
rectangle2.setMaterial(new PhongMaterial(Color.web("#FF0000",0.25)));
rectangle2.setCullFace(CullFace.BACK);
final MeshView wire1 = new MeshView(mesh1);
wire1.setMaterial(new PhongMaterial(Color.web("#000000",0.5)));
wire1.setCullFace(CullFace.BACK);
wire1.setDrawMode(DrawMode.LINE);
final MeshView wire2 = new MeshView(mesh2);
wire2.setMaterial(new PhongMaterial(Color.web("#000000",0.5)));
wire2.setCullFace(CullFace.BACK);
wire2.setDrawMode(DrawMode.LINE);
// add to group
box.getChildren().addAll(rectangle1, wire1, rectangle2, wire2);
}
return box;
}
关于3d - 如何在 JavaFX 中相同地渲染三角形的正面和背面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25190409/
我想以这样的方式实现,当我们单击图像时,所选图像应出现在前面,其余图像应隐藏在所选图像的后面。 我有使用 jquery 实现的类似功能的代码引用。 Click on image to move to
我有一个带有 Fragment 的应用程序。它从屏幕上的两个动态 fragment 开始。在 fragment B 上,我有一个列表。当我点击该项目时,我将这两个 fragment 更改为 C 和 D
我创建了一本这样的 CSS 书:https://fiddle.jshell.net/b1b0642z/现在我需要封面的背面是不同的颜色。我试图在封面之后用这个类创建另一个 div: .front_ba
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我正在开发一个使用 UIView 作为文本背景的应用程序。我已将 View 放在 storyboard 中的文本后面,但出于某种原因,有些 View 似乎仍位于文本前面。有没有办法以编程方式将这些 V
我有一个关于三个 JS 的问题。 fiddle https://jsfiddle.net/syildiz/fk8thLsq/17/ 我想创建一个跟随鼠标移动的眼睛。我上传的图片同时在背景中可见,并且在
我是一名优秀的程序员,十分优秀!