• Home
    • View
    • Login
    This page
    • Normal
    • Export PDF
    • Export Word
    • Attachments
    • Page Information

    Loading...
  1. Dashboard
  2. OpenJFX
  3. Main
  4. Discussions
  5. 3D Features

3D Features

  • Created by J. Duke, last modified by Iris Clark on Apr 04, 2013

3D Features Planned for Version 8

Introduction

This page contains the list of 3D features schedule for JavaFX 8.0

We have been thinking about the possible 3D features for JavaFX 8 for a while. We are now ready to present the plan to the community for review. This information has also been presented at this year's JavaOne 3D Made Easy with JavaFX technical session.

Three umbrella JIRA issues were created to capture most of the work: Movable Camera , 3D Geometry, and 3D Attributes

Here this a link to FX Experience blog on JavaFX 3D Early Access

A list simple examples

  • A blue sphere and a red box with mouse control: SphereAndBox.java
  • A rectangular mesh: SimpleMeshView.java

Proposed API

Proposed Features

Movable cameras and SubScene

  • Camera is now a Node
  • Camera can be added to a scene graph
  • Camera's position and aim (or orientation) is set using standard Node transform properties and methods
  • For backward compatibility, fixed camera need not be added to the scene
  • Added new properties for near & far clipping plane
  • SubScene is a special Node for scene separation
  • It can be used to render part of the Scene with different camera
  • Possible use cases are:
    • Overlay for UI controls (needs a static camera)
    • Underlay for background (static or updated less frequently)
    • "Heads-up" display
Camera Class Hierarchy
  • javafx.scene.Node
    • javafx.scene.Camera (abstract)
      • javafx.scene.ParallelCamera
      • javafx.scene.PerspectiveCamera
    • javafx.scene.SubScene
Code segment

Specifying a fixed Camera (existing 2.2 API)

// Create a camera and add it to the Scene
Camera camera = new PerspectiveCamera();
scene.setCamera(camera);

Specifying a movable Camera

// Create a camera and add it to the Scene
Camera camera = new PerspectiveCamera();
scene.setCamera(camera);

// Add camera to scene graph (so it can move)
Group cameraGroup = new Group();
cameraGroup.getChildren().add(camera);
root.getChildren().add(cameraGroup);

// Rotate the camera
camera.rotate(45);

// Move the cameraGroup (camera moves with it)
cameraGroup.setTranslateZ(-75);

3D primitives

  • Added two type of 3D shapes, extending from an abstract Shape3D base class:
    • User-defined shapes (MeshView)
    • Predefined shapes
User-defined shapes
  •  User defined mesh (geometry) of a shape by specifying a set of points, texture coordinates, and faces (triangles that describe the topology)
  •  User defined smoothing group to specify group of faces that are part of the same curved surface
  •  A mesh is sharable among mutiple user-defined shapes
Predefined shapes
  •  Three commonly used predefined 3D shapes are introduced: Box, Cylinder and Sphere
Shape3D Class Hierarchy
  • javafx.scene.Node
    • javafx.scene.shape.Shape3D (abstract)
      • javafx.scene.shape.MeshView
      • javafx.scene.shape.Box
      • javafx.scene.shape.Cylinder
      • javafx.scene.shape.Sphere
Mesh Class Hierarchy
  • java.lang.Object
    • javafx.scene.shape.Mesh (abstract)
      • javafx.scene.shape.TriangleMesh
Code Segment

Defining a MeshView

// Create the arrays of positions, texCoords
float[] positions = createPositions();
float[] texCoords = createUVs();

// Create faces (indices into the positions, texCoord arrays)
int[] faces = createFaces();

// Create a mesh
TriangleMesh mesh = new TriangleMesh();
mesh.setPositions(positions);
mesh.setTexCoords(texCoords);
mesh.setFaces(faces);

// Create meshView
MeshView mv = new MeshView(mesh);

Using Predefined Shapes

// Create a sphere with the given radius
Sphere sphere = new Sphere(10.0);

// Create a sphere with the given radius, number of divisions
Sphere sphere = new Sphere(10.0, 40);

// Create a cylinder with the given radius, and height
Cylinder cylinder = new Cylinder(10.0, 30.0);

// Create a box with the given width, height, and depth
Box box = new Box(1.0, 1.0, 1.0);

// NOTE: Predefined 3D shapes are centered at (0,0,0)

3D attributes

  • Added lights and 3D materials to add realism for 3D shapes.
  • Material specifies the appearance of a 3D shape
  • Light interacts with the geometry of a Shape3D and its material to provide the rendering result
  • A Shape3D can be rendered as a filled shape or as a wireframe
  • A Shape3D has a face culling property (front, back or none)
Light
  • Light is defined as a node in the scene graph
  • A scene contains a set of active lights
    • A default light is provided when the set of active light is empty
  • Each light contains a set of affected nodes
    • If a Parent is in the set, all its children are affected
    • Default is the root node of the Scene
  • Added 2 type of light sources:
    • AmbientLight and PointLight
    • May add more in the future
Material
  • Material contains a set of rendering properties 
  • PhongMaterial is a concrete subclass of Material
    • It has the following properties:
      • Ambient color
      • Diffuse color, diffuse map
      • Specular color, specular map
      • Specular power
      • Bump map
      • Self-illumination map
  • Sharable among multiple Shape3D nodes
Light Class Hierarchy
  • javafx.scene.Node
    • javafx.scene.LightBase (abstract)
      • javafx.scene.AmbientLight
      • javafx.scene.PointLight
Material Class Hierarchy
  • java.lang.Object
    • javafx.scene.paint.Material (abstract)
      • javafx.scene.paint.PhongMaterial
Code Segment

Defining Lights

// Create point light and add it to the Scene
PointLight light = new PointLight();
light.setColor(Color.RED);
scene.getLights().add(light);

// Add light to scene graph (so it can move)
Group lightGroup = new Group();
lightGroup.getChildren().add(light);
root.getChildren().add(lightGroup);

// Rotate the light
light.rotate(45);

// Move the lightGroup (light moves with it)
lightGroup.setTranslateZ(-75);

Defining Materials

// Create material
Material mat = new PhongMaterial();
Image diffuseMap = new Image("diffuseMap.png");
Image bumpMap = new Image("normalMap.png");

// Set material properties
mat.setDiffuseMap(diffuseMap);
mat.setBumpMap(normalMap);
mat.setSpecularColor(Color.WHITE);

// Use the material for a shape
shape3d.setMaterial(mat);

3D picking

  • 3D ray picking already used for 2D primitives with PerspectiveCamera
  • Existing limitation when used with depth buffer will be fixed (JIRA: RT-13740)
  • We will add support for picking 3D geometry (JIRA: RT-24646)

Proposed API to support 3D picking: Picking3dAPI

Methods added to Node

  • A LOD helper method that returns the area of the Node projected onto the physical screen in pixel units.
public double computeAreaInScreen()
  • A set of 3D transform  methods
public Point3D sceneToLocal(Point3D scenePoint)
public Point3D sceneToLocal(double sceneX, double sceneY, double sceneZ)
public Point3D localToScene(Point3D localPoint)
public Point3D localToScene(double x, double y, double z)
public Point3D parentToLocal(Point3D parentPoint)
public Point3D parentToLocal(double parentX, double parentY, double parentZ)
public Point3D localToParent(Point3D localPoint)
public Point3D localToParent(double x, double y, double z)

Loader support

  • Many 3D file formats exist, such as:
    •  Obj, Maya, 3D Studio Max, Collada, KRML
  • We will not provide a loader as part of the JavaFX runtime
  • We will make sample code available for one or two popular formats

 

Overview
Content Tools
ThemeBuilder
  • No labels

3 Comments

  1. User icon: duke

    J. Duke

    It is extremely important to support officially at least one file format. I believe Java3D did not get widespread adoption because of this point. Do not underestimate the importance of supporting a file format. Without it there is no workflow from 3D modeling software to JavaFX 3D.

    Instead of obj, maya, 3ds or blender file formats, JavaFX should support the FBX format. This is supported by almost every modeling software. It is also the format supported by the Unity game engine, which means there are enourmous number of available models to purchase or download for free (and most of these are modeled specifically to add to a real time engine/game engine), and also millions of modelers who are already using the workflow of model -> FBX -> 3D engine.

    Please reconsider the lack of a file format loader, it would be a catastrophic error not to include and officially support one.

    • Permalink
    • Oct 17, 2012
  2. User icon: duke

    J. Duke

    This 3D Features is really important for me and all JavaFX Devs. I'm glad to hear about this features updates. I've been making some 3D Maker Software for JavaFX like "Scene Builder". I think JavaFX must be made highly optimized for rendering the 3D objects . I found many glitch while making this software like performance, the memory usage etc. Anyway hope in future JavaFX team will improve for the optimization and high graphics acceleration.

    I'm looking forward for the supported formats which can be imported in javafx for 3D Development.

    Thanks

    • Permalink
    • Oct 21, 2012
  3. User icon: duke

    J. Duke

    In my opinion, what you propose is very difficult and is reinventing the wheel.  I think that the effort would be better spent embracing WebGL support within the WebKit based WebView.  JavaFX already embraces the official HTML5 standards and this seems to be a natural step in its evolution.

    I would think that enabling the WebGL hooks already existing in the WebKit would also be much easier to accomplish.  It's quite easy to facilitate data bindings between the WebEngine and some html content.  WebGL would bring powerful frameworks like Three.js into JavaFX. 

    I have tried to get by with Three.js rendering to a canvas, but the capabilities are very limited and the performance is about 60 times slower than a WebGL renderer.

    Rendering to HTML5 also has the benefit of easily saving JavaFX created assets as standalone html pages and I think that this follows the existing paradigm of embracing existing and emerging web standards in JavaFX.

    • Permalink
    • Dec 30, 2012

Terms of Use
• License: GPLv2
• Privacy • Trademarks • Contact Us

Powered by a free Atlassian Confluence Open Source Project License granted to https://www.atlassian.com/software/views/opensource-community-additional-license-offer. Evaluate Confluence today.

  • Kolekti ThemeBuilder Powered by Atlassian Confluence 8.5.21
  • Kolekti ThemeBuilder printed.by.atlassian.confluence
  • Report a bug
  • Atlassian News
Atlassian
Kolekti ThemeBuilder EngineAtlassian Confluence
{"serverDuration": 250, "requestCorrelationId": "6a56bc3b32d0dc51"}