2014-04-14 53 views
3

请使用JavaFX 8(3D)绘制3D图形。我已经知道一些像绘制球体一样的3D基础知识,首先着色球体并添加阴影,然后对球体进行一些光照和初始化。我的问题是我想通过使用一个圆柱来加入这个球体,但是如果在两个球体之间有两个圆柱体,它必须是一个圆弧或者圆柱体(我不知道这是否可能)。我已经试过,但没有出现,即使出现某种东西,它只是一个圆柱体(不像一条线很小)。使用JavaFX8加入两个带圆柱体的球体3D

另一个问题,我想知道如何旋转可以帮助在这种情况下。

最后一个问题,有可能使一个滚动条或只使用缩放事件?谢谢。

的图片摘自:Here

这是我的代码:

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); 
    } 

} 

回答

6

molecule sample application from Oracle做很多你所要求的。阅读链接教程并研究为示例应用程序提供的源代码。

moleculesample

关于几个你的问题。

如果存在例如两个球体之间2气缸它必须弧形的或弯曲的筒

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

我想知道如何旋转可以帮助在这种情况下,最后一个问题是有可能使滚动条或只使用缩放事件?

研究之前链接的Molecule示例代码,因为它具有旋转和缩放功能。

+0

好的谢谢你很多的链接和代码信息 –

+0

,我测试了缩放,但它没有工作(与触摸板),但感谢代码是完美的 –

0

可以计算使用

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

Math.toDegrees(Math.atan2(y, x)) 

这里缸的位置和旋转在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; 
    }