使用JavaFX8 3D将两个球体与圆柱体连接起来

使用JavaFX8 3D将两个球体与圆柱体连接起来,java,3d,javafx,javafx-2,Java,3d,Javafx,Javafx 2,我想用JavaFX8(3D)绘制一个3D图形。我已经知道了一些3D的基础知识,比如绘制球体,首先给球体着色并添加阴影,然后是一些光线和球体的初始化。我的问题是我想用圆柱体连接球体,但如果两个球体之间有两个圆柱体,那么它必须是圆弧或曲线圆柱体(我不知道这是否可行)。我已经试过了,但是什么也没有出现,即使有东西出现了,它只是一个圆柱体(不像一条很小的线) 另一个问题,我想知道在这种情况下,旋转是如何起作用的 最后一个问题,是可以制作一个滚动条还是仅仅使用缩放事件?谢谢 照片取自: 这是我的代码:

我想用JavaFX8(3D)绘制一个3D图形。我已经知道了一些3D的基础知识,比如绘制球体,首先给球体着色并添加阴影,然后是一些光线和球体的初始化。我的问题是我想用圆柱体连接球体,但如果两个球体之间有两个圆柱体,那么它必须是圆弧或曲线圆柱体(我不知道这是否可行)。我已经试过了,但是什么也没有出现,即使有东西出现了,它只是一个圆柱体(不像一条很小的线)

另一个问题,我想知道在这种情况下,旋转是如何起作用的

最后一个问题,是可以制作一个滚动条还是仅仅使用缩放事件?谢谢

照片取自:

这是我的代码:

import java.util.ArrayList;
import java.util.Random;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.PerspectiveCamera;
import javafx.scene.PointLight;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.scene.paint.PhongMaterial;
import javafx.scene.shape.CullFace;
import javafx.scene.shape.DrawMode;
import javafx.scene.shape.Sphere;
import javafx.stage.Stage;

public class Graphe3D extends Application {
    Group root;
    PhongMaterial material;
    ArrayList<Sphere> sphere;
    @Override
    public void start(Stage primaryStage) {
        sphere=new ArrayList<>();
        root=new Group();
        material= new PhongMaterial();
        for(int i=0;i<3;i++){
            sphere.add(new Sphere(50));
        //Sphere Color
        material.setDiffuseColor(Color.RED);
        //Shadow Color
        material.setSpecularColor(Color.rgb(30, 30, 30));
        //Init Sphere
        sphere.get(i).setMaterial(material); 
        sphere.get(i).setTranslateX(new Random().nextInt(600));//set location X,Y and Z
        sphere.get(i).setTranslateY(new Random().nextInt(600));
        sphere.get(i).setTranslateZ(50); // ? 
        sphere.get(i).setDrawMode(DrawMode.FILL);
        sphere.get(i).setCullFace(CullFace.BACK);// ?
        //Create Light
        PointLight pointLight = new PointLight(Color.ANTIQUEWHITE);
        pointLight.setTranslateX(800);
        pointLight.setTranslateY(-100);
        pointLight.setTranslateZ(-1000); 
        root.getChildren().add(pointLight); //ajout de lumiere
        root.getChildren().add(sphere.get(i)); //ajout des spheres au scene(root)
        }
        //Display
         Scene scene = new Scene(root);
        scene.setFill(Color.rgb(10, 10, 40));
        scene.setCamera(new PerspectiveCamera(false));
        primaryStage.setScene(scene);
        primaryStage.show();

    }

    public static void main(String[] args) {
        launch(args);
    }

}
import java.util.ArrayList;
导入java.util.Random;
导入javafx.application.application;
导入javafx.scene.Group;
导入javafx.scene.PerspectiveCamera;
导入javafx.scene.PointLight;
导入javafx.scene.scene;
导入javafx.scene.paint.Color;
导入javafx.scene.paint.PhongMaterial;
导入javafx.scene.shape.CullFace;
导入javafx.scene.shape.DrawMode;
导入javafx.scene.shape.Sphere;
导入javafx.stage.stage;
公共类Graph3D扩展应用程序{
群根;
语音材料;
阵列球面;
@凌驾
公共无效开始(阶段primaryStage){
sphere=newarraylist();
root=新组();
材质=新的PhongMaterial();
for(inti=0;i完成了您的大部分要求。请阅读链接教程并研究为示例应用程序提供的源代码

关于你的几个问题

例如,如果两个球体之间有两个圆柱体,则必须是圆弧或曲线圆柱体

这是可能的。您必须生成一个自定义类,而不是使用预构建的类。基本上,您需要创建一个椭圆,并且只显示两个节点之间的圆环体的圆弧部分。我将不在StackOverflow答案的上下文中提供如何执行此操作的详细说明

我想知道在这种情况下,旋转是如何起作用的,最后一个问题是,可以制作滚动条还是仅仅使用缩放事件


研究前面链接的分子样本代码,因为它具有旋转和缩放功能。

您可以使用

 Shape.getTransforms().add(new Rotate(angle, x, y, z, Rotate.Z_AXIS))

这是一个在2D中工作的示例

    Sphere var = null;
    for(Sphere sphere: myListSphere {
        if(var!=null) {
            double x = sphere.getTranslateX()-var.getTranslateX();
            double y = sphere.getTranslateY()-var.getTranslateY();

            //the distance from each sphere
            Cylinder cyl = new Cylinder(5, Math.sqrt((x*x)+(y*y)), 5);
            cyl.setMaterial(this.redMaterial);
            cyl.setTranslateX(sphere.getTranslateX()-(x/2));
            cyl.setTranslateY(sphere.getTranslateY()-(y/2));

            //the angle from both dots with Math.atan
            cyl.getTransforms().add(new Rotate(90+Math.toDegrees(Math.atan2(y, x)), 0, 0, 0, Rotate.Z_AXIS));
        }
        var = shape;
    }

对于代码,我测试了Zoom,但它不工作(使用触摸板),但无论如何,感谢代码是完美的
    Sphere var = null;
    for(Sphere sphere: myListSphere {
        if(var!=null) {
            double x = sphere.getTranslateX()-var.getTranslateX();
            double y = sphere.getTranslateY()-var.getTranslateY();

            //the distance from each sphere
            Cylinder cyl = new Cylinder(5, Math.sqrt((x*x)+(y*y)), 5);
            cyl.setMaterial(this.redMaterial);
            cyl.setTranslateX(sphere.getTranslateX()-(x/2));
            cyl.setTranslateY(sphere.getTranslateY()-(y/2));

            //the angle from both dots with Math.atan
            cyl.getTransforms().add(new Rotate(90+Math.toDegrees(Math.atan2(y, x)), 0, 0, 0, Rotate.Z_AXIS));
        }
        var = shape;
    }