- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在为 JavaFX 使用 JCSG 库。
我有一些 MeshView
对象,我想将它们转换为 CSG
对象,有什么办法可以实现吗?
最佳答案
组合 javafx.scene.shape.Mesh
的最简单方法如果你有一个 TriangleMesh
,就用 CSG 对象正在将三角形面转换为多边形 ( eu.mihosoft.vrl.v3d.Polygon
)。
一旦有了 CSG 对象,就可以对其执行常规操作,然后可以将其导出回 MeshView
。例如。
原始形状(Box
、Sphere
、...)的问题是您无法访问它们的TriangleMesh
。 .所以你可以去F(X)yz库并选择任何可用的 3D 形状。
例如,让我们使用 FrustumMesh
对象。
您可以轻松地创建一个:
FrustumMesh cone = new FrustumMesh(1,0.2,4,2);
您将可以访问其网格:cone.getMesh()
.
现在我们需要转换这个 TriangleMesh
进入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);
}
}
关于java - 如何使用 JavaFX 中的 JCSG 库将 MeshView 转换为 CSG 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29908059/
问题 我想将漫反射贴图应用到 MeshView。当我将具有漫反射贴图的 Material 应用到 MeshView 时,它不可见。然而,应用于盒子的相同 Material 是可见的。 问题 要将漫反射
我想在 JavaFX 中的 MeshView 上显示 3D 图形。因为我想构建一个简单的模型查看器,所以为了清晰起见,我创建了选项卡。其中一个包含一个组 (meshGroup),我在其中添加了一个 S
我正在尝试使用 phongmaterial 将图像应用到我的 meshview 立方体,但屏幕上只显示没有颜色的黑色立方体。它曾经与 Box 和立方体一起工作,但现在也不能与它们一起工作。 还有,谁能
我正在为 JavaFX 使用 JCSG 库。 我有一些 MeshView 对象,我想将它们转换为 CSG 对象,有什么办法可以实现吗? 最佳答案 组合 javafx.scene.shape.Mesh
我是一名优秀的程序员,十分优秀!