Language Bindings
Python
If the python bindings have been generated using the F3D_BINDINGS_PYTHON
CMake option, the libf3d can be used directly from python. Make sure to set PYTHONPATH
to path where the python module is built. Here is an example showing how to use libf3d python bindings:
import f3d
eng = f3d.Engine.create(False)
eng.options.update({
"model.scivis.array-name": "Normals",
"model.scivis.component": 0,
"ui.bar": True,
"render.grid.enable": True,
})
eng.scene.add("f3d/testing/data/dragon.vtu")
eng.interactor.start()
You can see more examples using python bindings in the dedicated example directory here.
Stubs
It’s also possible to generate Python stubs automatically by enabling the CMake option F3D_BINDINGS_PYTHON_GENERATE_STUBS
. Python stubs are .pyi
files defining the public interface, allowing IDEs to auto-complete and do static analysis.
Java (experimental)
If the Java bindings have been generated using the F3D_BINDINGS_JAVA
CMake option, the libf3d can be used directly from Java. You can import the f3d.jar
package and use the provided Java classes directly. Make sure to set java.library.path
to the path where the JNI library is built. Here is an example showing how to use libf3d Java bindings:
import app.f3d.F3D.*;
public class F3DExample {
public static void main(String[] args) {
Engine.autoloadPlugins();
// Always use try-with-resources idiom to ensure the native engine is released
try (Engine engine = new Engine(Window.Type.NATIVE)) {
Scene scene = engine.getScene();
scene.add("f3d/testing/data/dragon.vtu");
engine.getWindow().render();
}
}
}
Javascript (experimental)
If the Javascript bindings have been generated by building F3D with webassembly and emscriptem, the libf3d can be used directly from a browser.
See this example app which you can test live here!
The package can be installed using npm, by running the following command:
npm install f3d
Create the target DOM element <canvas id="canvas"></canvas>
in your app, then use the following javascript code:
// import the module
import f3d from "f3d";
// setup a setting object
const settings = {
canvas: document.getElementById("canvas"),
setupOptions: (options) => {
// background must be set to black for proper blending with transparent canvas
options.set_color("render.background.color", 0, 0, 0);
// make it look nice
options.toggle("render.effect.antialiasing.enable");
options.toggle("render.effect.tone_mapping");
options.toggle("render.effect.ambient_occlusion");
options.toggle("render.hdri.ambient");
// display widgets
options.toggle("ui.axis");
options.toggle("render.grid.enable");
},
};
f3d(settings)
.then(async (Module) => {
// write a 3D file located on the server to the internal filesystem
const modelFile = await fetch("/assets/example.obj").then((b) =>
b.arrayBuffer(),
);
Module.FS.writeFile("example.obj", new Uint8Array(modelFile));
// automatically load all supported file format readers
Module.Engine.autoloadPlugins();
// create an engine
Module.engineInstance = Module.Engine.create();
Module.setupOptions(Module.engineInstance.getOptions());
// setup the window size based on the canvas size
const scale = window.devicePixelRatio;
Module.engineInstance
.getWindow()
.setSize(Module.canvas.clientWidth, scale * Module.canvas.clientHeight);
const scene = Module.engineInstance.getScene();
scene.add("/example.obj");
// do a first render and start the interactor
Module.engineInstance.getWindow().render();
Module.engineInstance.getInteractor().start();
})
.catch((error) => {
console.error("Internal exception: " + error);
});