Hi,
what I try to do, is to implement a very simple system, that orientates an rigidbody to a given rotation.
I try to follow this one here: c++ - What torque should I apply in Bullet to maintain a vertical orientation? - Game Development Stack Exchange
And have this ‘solution’
My problem is now, that the rotation does not even seem to appear in the correct direction. I do not see where the error is based on the code in the stackexchange thread.
import java.util.Random;
import com.jme3.app.SimpleApplication;
import com.jme3.bullet.BulletAppState;
import com.jme3.bullet.control.RigidBodyControl;
import com.jme3.material.Material;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Quaternion;
import com.jme3.math.Vector3f;
import com.jme3.renderer.queue.RenderQueue.Bucket;
import com.jme3.scene.Geometry;
import com.jme3.scene.debug.Arrow;
import com.jme3.system.AppSettings;
public class PhysicTester extends SimpleApplication {
private static final float MASS = 1000;
private static final float SPEED_LIMIT = 10;
private BulletAppState bapp;
private Geometry geom;
boolean direct = true;
private float time;
private Quaternion targetR;
private RigidBodyControl rbdy;
private float ttime;
private Material mat;;
@Override
public void simpleInitApp() {
getFlyByCamera().setDragToRotate(true);
bapp = new BulletAppState();
getStateManager().attach(bapp);
bapp.getPhysicsSpace().setGravity(new Vector3f(0, 0, 0));
bapp.getPhysicsSpace().setMaxSubSteps(100000);
createPseudoBox();
createRealBox();
createNewTarget();
cam.setLocation(new Vector3f(10, 10, 10));
cam.lookAt(new Vector3f(0, 0, 0), new Vector3f(0, 1, 0));
}
private void createRealBox() {
Vector3f boxSize = new Vector3f(0.5f, 0.5f, 3f);
Arrow b = new Arrow(boxSize); // create cube shape
Geometry rbox = new Geometry(“Target”, b); // create cube geometry from
// the shape
mat = new Material(assetManager, “Common/MatDefs/Misc/Unshaded.j3md”); // create
// a
// simple
// material
mat.setColor(“Color”, ColorRGBA.Yellow);mat.getAdditionalRenderState().setLineWidth(2f); rbox.setMaterial(mat); // set the cube's material rbox.setQueueBucket(Bucket.Opaque); rootNode.attachChild(rbox); // make the cube appear in the scene rbdy = new RigidBodyControl(); rbdy.setMass(MASS); rbox.addControl(rbdy); bapp.getPhysicsSpace().add(rbdy);
}
private void createPseudoBox() {
Arrow b = new Arrow(new Vector3f(0, 0, 10)); // create cube shape
geom = new Geometry(“Target”, b); // create cube geometry from the shape
Material mat = new Material(assetManager, “Common/MatDefs/Misc/Unshaded.j3md”); // create
// a
// simple
// material
mat.setColor(“Color”, new ColorRGBA(255, 0, 0, 50)); // set color of
// material to
// blue
mat.getAdditionalRenderState().setLineWidth(2f);
geom.setMaterial(mat); // set the cube’s material
geom.setQueueBucket(Bucket.Translucent);
rootNode.attachChild(geom); // make the cube appear in the scene
}
@Override
public void simpleUpdate(float tpf) {
ttime += tpf;
time += tpf;
if (time > 20) {
time = 0;
createNewTarget();
}
geom.setLocalRotation(targetR);
Quaternion currentRotation = rbdy.getPhysicsRotation(); Quaternion correction =targetR.mult(currentRotation).inverse(); float[] angles = correction.toAngles(null); Vector3f change = new Vector3f(-angles[0],-angles[1],-angles[2]); change.multLocal(10); rbdy.applyTorque(change);
try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); }
}
private void createNewTarget() {
Random r = new Random();
Vector3f target = new Vector3f(r.nextFloat() - 0.5f, r.nextFloat() - 0.5f, r.nextFloat() - 0.5f);
Quaternion quat = new Quaternion();
quat.lookAt(target, new Vector3f(0, 1, 0));
targetR = quat;
}
public static void main(String args) {
PhysicTester pt = new PhysicTester();
pt.setShowSettings(false);
pt.settings = new AppSettings(true);
pt.settings.setRenderer(AppSettings.LWJGL_OPENGL3);
pt.start();
}
}