Hi, I’m a newbie and this is my for first question. I’ve read and searched as much as I can but I have not been able to figure out how to dynamically add a new spatial to the root node. I can run the tutorials fine but they all only add geometry in the simpleInitApp method. If I try to add geometry later, it seems to add ok but it’s not visible; I’ve tried using node.updateGeometricState() and node.updateLogicalState() but to no avail.
Any hints would be greatly appreciated.
Larry
Does it have a material?
Any sample code to help us see what might be going wrong?
Thanks for your reply,
As the simplest test I could think of I modified HelloNode.java and moved the static scene creation stuff into a new method buildScene() that I called from main or simpleInitApp. Calling it from simpleInitApp works, calling it from main doesn’t. Heres the code that doesn’t work:
package jme3test.helloworld;
import com.jme3.app.SimpleApplication;
import com.jme3.material.Material;
import com.jme3.math.Vector3f;
import com.jme3.scene.Geometry;
import com.jme3.scene.shape.Box;
import com.jme3.math.ColorRGBA;
import com.jme3.scene.Node;
/** Sample 2 - How to use nodes as handles to manipulate objects in the scene graph.
- You can rotate, translate, and scale objects by manipulating their parent nodes.
- The Root Node is special: Only what is attached to the Root Node appears in the scene. */
public class HelloNode extends SimpleApplication {
public static void main(String[] args){
HelloNode app = new HelloNode();
app.start();
app.buildScene();
app.getRootNode().updateGeometricState();
}
@Override
public void simpleInitApp() {
// buildScene();
}
public void buildScene() {
// create a blue box at coordinates (1,-1,1)
Box box1 = new Box( new Vector3f(1,-1,1), 1,1,1);
Geometry blue = new Geometry(“Box”, box1);
Material mat1 = new Material(assetManager, “Common/MatDefs/Misc/SolidColor.j3md”);
mat1.setColor(“m_Color”, ColorRGBA.Blue);
blue.setMaterial(mat1);
// create a red box straight above the blue one at (1,3,1)
Box box2 = new Box( new Vector3f(1,3,1), 1,1,1);
Geometry red = new Geometry(“Box”, box2);
Material mat2 = new Material(assetManager, “Common/MatDefs/Misc/SolidColor.j3md”);
mat2.setColor(“m_Color”, ColorRGBA.Red);
red.setMaterial(mat2);
// create a pivot node at (0,0,0) and attach it to root
Node pivot = new Node(“pivot”);
rootNode.attachChild(pivot);
// attach the two boxes to the pivot node!
pivot.attachChild(blue);
pivot.attachChild(red);
// rotate pivot node: Both boxes have rotated!
pivot.rotate( 0.4f , 0.4f , 0.0f );
}
}
Larry
You are not on the GL thread if you are calling it from the main method. Keep the adding of geometry and modifying geometry on the open GL thread by doing it in your app class in the update loop. Or you can add your method call to the scene’s queue ifyou realy want to do it outside:
[snippet id=“10”]
Well, that makes sense (I hope). I’ll peel that layer of the onion in the morning.
Thanks!