Need Help on minimal project setup


I started with sdk and first steps work fine so far.

My plans may sound boring, as I don’t plan to create a game. Just want a canvas, where I can show some 3D-models created on my own and move that around.
No mesh import, just created on the fly.
First test were promising.

My real project is an eclipse-project, but I don’t want to include all libs from jme3. So I did not follow the setup-steps from jme-Wiki related to eclipse.

But I followed the hard steps for manual setup of commandline usage.
Which means, I copied “some” libs from jme3 into my projects lib directory and added them to the projects build-path (in projects properties). Additionally I exported the jme3 libs.

I started with the testCanvas tutorial.

Currently I have jme3-core.jar and jme3-desktop.jar attached to my eclipse project.

testCanvas import compiled without problems, but when I try to start it, I get NoClassDefFoundError for JmeFormatter.
I guess, that eclipse uses the attached libs for runtime-classpath too, so I have no idea, where to start searching.

A quick grep showed, that JmeFormatter is part of jme3-core.jar - so it should get found.

What have I overlooked?
Any hint is appreciated!

I can’t really comment on the specific way you’ve gone about it, but there are a lot easier ways. At a guess it’s classpath related. JME pulls in some transient dependencies that probably aren’t in your classpath.

You can create a project in any IDE - or none at all - though the latter will probably be annoyingly elaborate for most.

The easiest and quickest way is to create a new gradle project in any IDE and provide the required libraries in the build script. The link below shows the minimum required steps to get up and running.


thank you for your attention!

May be. But I’m not interested in “easy”. Easy will bloat my harddisks and my mind …
I like to know what’s going on. Therefore I don’t use gradle. I’m stil an ant-user :slight_smile:

That was the hint, that helped my find the reason!
I added the jars from lwjgl and now the apps work as expected :slight_smile:

May I ask another question?
Is there a way to invert mouse controls?
The mouse it attached to the camera, but I’d like to simulate the object gripping and moving around …

And does this editor has a preview function?

The default camera controls use FlyCam - which is great for a lot of test cases, but you probably want a custom camera if you delve any further. I think what you’re describing is something like the FocusCamera I made.

First disable the flycam by either setting flyCam.setEnabled(false) in your simpleInit method or overriding the constructor to something like:

private MyMainClass {
    super(new StatsAppState())

And then add this camera controller instead - If I remember, it’s just a single class.

I’m not entirely sure what you mean by “preview” function, but for the SDK @Darkchaos is the man with the answers.


thank you for the code-link!
Great stuff. Love it!
I love that verbose coding!

I inverted the mouse buttons and created a separate speed setting for translations …
… now its close to what I want :slight_smile:

Your code is great for learning about internals. So will stay at it to get to understand bit more about focussing and the like.

Is there a way to calculate initial zoom factor based on the models size? When I wonna show an elefant, I might need another zoom factor as on showing a fly.
My models are quite different in size and I only know the size after creating it …

LOL, I was talking about this forum editor (javascript at the bottom of the browser - not related to jme3).


thanks for the preview :smiley:

… don’t know - your CameraSettings behave different in my app, than in your Main-class. I checked all twice - can’t see any difference - beside that I have only one geometry.
I changed the strings for Mouse_Move_Up and Mouse_Move_Down but it looks like none of the strings is used in my app. It works fine from your Main-class.
I realized, that the mapping is set up in function onEnable - looks like implicit calling does not work.
… but as the function is protected - I can’t call it on my own (without breaking your concept), and I don’t know enuf to break it.

Here’s some old code I have that positions the camera so it fully includes a bounding box in its view frustum. Not sure if it’s 100% correct but it should be a starting point.

private static final float s_camFov       = 30;
private static final float s_camElevation = 40 * FastMath.DEG_TO_RAD;

private void updateCamera()
    BoundingBox bbox = (BoundingBox)_rootNode.getWorldBound();
    if(bbox == null)
    float extent = bbox.getXExtent();
    if(bbox.getYExtent() > extent)
        extent = bbox.getYExtent();
    if(bbox.getZExtent() > extent)
        extent = bbox.getZExtent();

    // Calculate camera distance where BoundingBox is fully visible
    float dist = extent / (float)Math.tan(s_camFov*0.5 * FastMath.DEG_TO_RAD);
    _cam.setLocation(new Vector3f(0, dist * (float)Math.sin(s_camElevation), dist * (float)Math.cos(s_camElevation)));
    float y = bbox.getCenter().y * 0.666f;
    _cam.lookAt(new Vector3f(0, y, 0), Vector3f.UNIT_Y);

You’re supposed to add it to the appStateManager.

FocusCameraState focusCameraState = new FocusCameraState();

// set a spatial to focus on.


Thank you for your help!

Of cause it is.
I did it following your sequence:

  • disable FlyCamera
  • create FocusCamera
  • attach it to stateManager
  • setFocusPoint to existing Geometry

The point is, the app behaves as if no settings have been changed. And it does not change anything, if I change the strings in FocusCamera class.

Could it be, that other settings have precedence?

Just to repeat it: my environment is like testCanvas from awt-package, which is not related to jme3 class tree, but uses another Class that itself extends SimpleApplication.
So I added the FocusCamera to that class, that extends SimpleApplication.
The “caller” application uses AppSettings …
I gonna strip that class down to the absolute minimum …
… but thats work in progress - or better said: I’m just stumbling around …