Jzy3d is a framework for easily drawing 3d and 2d charts in Java, using either fast native GPU rendering or CPU based rendering to enhance portability across combination of OS/JVM/GPU.
The framework targets simplicity and portability across Java windowing toolkits (AWT, SWT, NEWT, Swing, JavaFX, Offscreen rendering), running either on MacOS, Windows and Linux. Jzy3d is available for other languages or platforms such as Scala, Groovy, Matlab, C#, and even Python.
The API can be used freely in commercial applications. You can explore the tutorials. an then purchase the extended developper guide to support the development effort.
Refer to the tutorial README file to get help on creating your first chart project with the help of example code.
As this library focuses on portability of the charts, the org.jzy3d.demos.surface
package in jzy3d-tutorials demonstrates the same chart running on AWT, SWT, Swing using native OpenGL powered by JOGL and jGL CPU rendering.
public class SurfaceDemoAWT extends AWTAbstractAnalysis {
public static void main(String[] args) throws Exception {
SurfaceDemoAWT d = new SurfaceDemoAWT();
AnalysisLauncher.open(d);
}
@Override
public void init() {
// Define a function to plot
Mapper mapper = new Mapper() {
@Override
public double f(double x, double y) {
return x * Math.sin(x * y);
}
};
// Define range and precision for the function to plot
Range range = new Range(-3, 3);
int steps = 80;
// Create the object to represent the function over the given range.
final Shape surface = new SurfaceBuilder().orthonormal(new OrthonormalGrid(range, steps), mapper);
surface.setColorMapper(new ColorMapper(new ColorMapRainbow(), surface, new Color(1, 1, 1, .5f)));
surface.setFaceDisplayed(true);
surface.setWireframeDisplayed(true);
surface.setWireframeColor(Color.BLACK);
// Create a chart
GLCapabilities c = new GLCapabilities(GLProfile.get(GLProfile.GL2));
IPainterFactory p = new AWTPainterFactory(c);
IChartFactory f = new AWTChartFactory(p);
chart = f.newChart(Quality.Advanced);
chart.getScene().getGraph().add(surface);
}
}
Multiple chart types
- Surface charts
- Scatter charts
- Volume charts
- Bar charts
- 3D and 2D graphs charts
- Many primitives to build custom charts (spheres, triangles, polygons, ...)
Flexible layout
- Colorbars
- Colormappers for coloring objects
- Axis box layout with detailed tick definition and tick rendering tools
- Contour functions
- Tooltips
- Background images
- 2D post renderers
- Lights
Algorithms
- Grid based and Delaunay surface tesselation methods
- 3d line strip interpolation to smooth pathes (Bernstein 3d)
- 2d envelopes (Convex hulls)
- Polygon ordering for improved transparency rendering
- Dual depth peeling: scene graph order independent transparency (expected for 1.0)
- Matlab-like array processors and statistics tools
- Experimental Support Vector Machine integration (Svm3d)
Interactions
- Mouse interaction with objects (selection & picking methods)
- Mouse interaction with chart (rotation, zoom, scale)
- Key interaction with chart (rotation, zoom, scale)
- Thread Controllers
- Animation of objects' structures (surface, series of lines, etc)
High and low level OpenGL programming
- Hide complexity and provide out of the box solutions for common low level OpenGL tasks
- Fully cutomizable framework with access to all OpenGL native features through JOGL
Cross platforms and compatible
- Straightforward integration to either AWT, Swing, Eclipse RCP (SWT), or JavaFX
- Windows, Unix, and MacOS. Android supposed to work if enable appropriate JOGL jars
- Offscreen rendering
- Multiple file formats (Ply, Obj, Matlab, CSV)
- C# port
- Python binding
- Scala example
- Matlab integration
Extensions
- jzy3d-graph : 3d graphs layout and rendering using Gephi toolkit
- jzy3d-spectro : 3d spectrogram
- jzy3d-bigpicture : drivers to few big data storage to draw massive amount of points
Creating a chart implies building and wiring the below high-level components.
The IChartFactory
builds all objects that will define how the chart will look (Axis
, View
, Camera
, Chart
).
The IPainterFactory
builds every objects that allow compatibility across windowing toolkits and GPU/CPU. The chart factories and drawable have no knowledge of concrete AWT, SWT, Swing, etc. This is all powered by the painter factory introduced in Jzy3d 2.0.
The Drawable
class hierarchy defines geometries able to use a IPainter
to draw something.
Jzy3d depends on the following libraries that are available on Jzy3d Maven repository (See tutorials for recommended Maven setup)
- jGL provides a pure Java implementation of OpenGL hence allowing CPU rendering as an alternative to GPU rendering (JOGL)
- jPLY supports the PLY format for loading 3d objects
- vecmath is a clone of a former java package
mvn clean install
The integration tests might be disabled on purpose, as they are still
sometime sensitive to thin rendering differences across computers. If they are enabled, you may have tests named ITTest*
failing. In this case, you may
- Comment it from Surefire plugin configuration. The best is to edit the Maven pom to only disable ITTest*. If you are busy, you may simply run
mvn install -DskipTests
- Skip it from Faisafe if this plugin is currently active in the Maven pom. To do so run
mvn install -DskipITs
- Google Discussion group
- Gitlab Discussions
- StackOverflow Tag
- If you are looking for professional services related to 3d rendering, contact me
Version 2.0 is a major refactor to allow using multiple OpenGL implementations, which opened the door to EmulGL. To ease porting your 1.* charts, we add the following cheatsheet.
Class name in 1.* | Class name in 2.0 |
---|---|
AbstractDrawable | Drawable |
AbstractWireframeable | Wireframeable |
AxeBox | AxisBox |
DrawableTexture | NativeDrawableImage & EmulGLDrawableImage |
IChartComponentFactory | IChartFactory |
AWTChartComponentFactory | AWTChartFactory |
NewtChartComponentFactory | NewtChartFactory |
JavaFXChartComponentFactory | ❗ JavaFXChartFactory |
SwingChartComponentFactory | SwingChartFactory |
SWTChartComponentFactory | SWTChartFactory |
FallbackChartFactory | |
ColorbarViewportLayout | ViewAndColorbarsLayout |
ViewMouseController | NewtViewCameraController |
Halign | Horizontal |
Valign | Vertical |
Surface | SurfaceBuilder |
❗ work in progress.
SurfaceBuilder is not static anymore to be overridable.
IPainter
IPainterFactory
EmulGLPainterFactory
IAnimator
IImageWrapper
andSymbolHandler