Hopefully I can covey my question with some clarity (no promises :D)
I have created a .j3o file from an orgrescene/ogremesh: an array of 3 long cylindrical meshes with their z axes parallel, each displaced in the xy plane and rotated about the z axis. I use the following to import the spatial and create a CompoundCollisionShape:
Spatial model = getAssetManager().loadModel("Models/3CYL_ALL.j3o");
CollisionShape cs = CollisionShapeFactory.createDynamicMeshShape(model);
When rendered the geometry displays as it should. However the collision shape(s) do not appear to be created in their translated (relative to the spatial origin) positions: the Spatial freely rolls (on a floor) about the spatial's z axis (only).
Also, if each cylinder's axis is skewed by some amount such that their z axes are no longer parallel, the Spatial no longer rolls freely (about any axis). From observation of how the spatial comes to a rest, it appears that the individual collision shapes are locally rotated (correctly???) but once again the are not displaced.
Am I using the CollisionShapeFactory correctly, or do I still need to position the individual collision shapes to coincide with their corresponding geometry?
public void simpleInitApp()
{
getInputManager().addListener(this);
this.getPhysicsSpace().setGravity(Vector3f.UNIT_Z.mult(-3f));
this.getFlyByCamera().setMoveSpeed(50f);
Vector3f v3F = new Vector3f(0, 10000, 10000);
PointLight pl = new PointLight();
pl.setColor(new ColorRGBA(.25f,.25f,.25f,.5f));
pl.setRadius(100000f);
pl.setPosition(v3F);
v3F.set(2f, 2f, -2f);
DirectionalLight dl = new DirectionalLight();
dl.setColor(new ColorRGBA(.25f,.25f,.25f,.5f));
dl.setDirection(v3F);
this.rootNode.addLight(pl);
this.rootNode.addLight(dl);
Spatial model = getAssetManager().loadModel("Models/3CYL_ALL.j3o");
CollisionShape cs = CollisionShapeFactory.createDynamicMeshShape(model);
this.physicsNode = new PhysicsNode(model, cs, 10);
this.physicsNode.setFriction(2f);
this.physicsNode.updateModelBound();
this.physicsNode.setRestitution(0f);
this.physicsNode.updateGeometricState();
this.physicsNode.setSleepingThresholds(0f, 0f);
this.rootNode.attachChild(physicsNode);
this.getPhysicsSpace().addQueued(physicsNode);
Box bx = new Box(Vector3f.ZERO, 10000.f, 10000.f, 5f);
Geometry gm = new Geometry("TEST", bx);
Material mat = new Material(getAssetManager(), "Common/MatDefs/Misc/ShowNormals.j3md");
mat.setColor("m_Color", ColorRGBA.Blue);
gm.setMaterial(mat);
BoxCollisionShape bs = new BoxCollisionShape( new Vector3f(10000.f, 10000.f, 5f));
PhysicsNode pNode= new PhysicsNode(gm, bs, 0);
pNode.setLocalTranslation(Vector3f.UNIT_Z.mult(-50f));
pNode.updateGeometricState();
this.rootNode.attachChild(pNode);
this.getPhysicsSpace().add(pNode);
inputManager.addMapping("FWD", new KeyTrigger(KeyInput.KEY_U));
getInputManager().addMapping("AFT", new KeyTrigger(KeyInput.KEY_J));
getInputManager().addMapping("LEFT", new KeyTrigger(KeyInput.KEY_H));
getInputManager().addMapping("RIGHT", new KeyTrigger(KeyInput.KEY_K));
getInputManager().addMapping("STOP", new KeyTrigger(KeyInput.KEY_RETURN));
this.inputManager.addListener(this, "FWD");
this.inputManager.addListener(this, "AFT");
this.inputManager.addListener(this, "LEFT");
this.inputManager.addListener(this, "RIGHT");
this.inputManager.addListener(this, "STOP");
}