Hello i need your help once again.
I have modified the TestPhysicsHingeJoint example and added two keys to move the top cube. Also on the bottom cube(hammerNode) i have applied a force so that the movement of the bottom cube fades out faster. I have noticed that when the bottom cube stops moving (even for a moment) the joint breaks and the top cube moves alone. I have tested other joint types such as PhysicsConeJoint and Physics6DofJoint and they both seem to have the problem.
Also is there another way to fade out the bottom cubes movement without applying the force?
Here's the modified example code
package physics;
import com.jme3.app.SimpleBulletApplication;
import com.jme3.bullet.collision.shapes.BoxCollisionShape;
import com.jme3.bullet.joints.PhysicsHingeJoint;
import com.jme3.bullet.nodes.PhysicsNode;
import com.jme3.input.KeyInput;
import com.jme3.input.controls.AnalogListener;
import com.jme3.input.controls.KeyTrigger;
import com.jme3.material.Material;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f;
public class TestPhysicsHingeJoint extends SimpleBulletApplication implements AnalogListener {
private PhysicsHingeJoint joint;
private PhysicsNode holderNode;
private PhysicsNode hammerNode;
public static void main(String[] args) {
TestPhysicsHingeJoint app = new TestPhysicsHingeJoint();
app.start();
}
private void setupKeys() {
inputManager.addMapping("Lefts", new KeyTrigger(KeyInput.KEY_H));
inputManager.addMapping("Rights", new KeyTrigger(KeyInput.KEY_K));
inputManager.addMapping("Space", new KeyTrigger(KeyInput.KEY_SPACE));
inputManager.addMapping("Left_move", new KeyTrigger(KeyInput.KEY_N));
inputManager.addMapping("Right_move", new KeyTrigger(KeyInput.KEY_M));
inputManager.addListener(this, "Lefts", "Rights", "Space", "Right_move", "Left_move");
}
public void onAnalog(String binding, float value, float tpf) {
if(binding.equals("Lefts")){
joint.enableMotor(true, 1, .1f);
}
else if(binding.equals("Rights")){
joint.enableMotor(true, -1, .1f);
}
else if(binding.equals("Space")){
joint.enableMotor(false, 0, 0);
}
else if(binding.equals("Right_move")){
Vector3f v = holderNode.getLocalTranslation();
holderNode.setLocalTranslation(v.x + value*speed, v.y, v.z);
}
else if(binding.equals("Left_move")){
Vector3f v = holderNode.getLocalTranslation();
holderNode.setLocalTranslation(v.x - value*speed, v.y, v.z);
}
}
public void onPreUpdate(float tpf) {
}
public void onPostUpdate(float tpf) {
}
@Override
public void simpleInitApp() {
setupKeys();
setupJoint();
}
public void setupJoint() {
Material mat = new Material(getAssetManager(), "Common/MatDefs/Misc/WireColor.j3md");
mat.setColor("m_Color", ColorRGBA.Yellow);
holderNode=new PhysicsNode(new BoxCollisionShape(new Vector3f( .1f, .1f, .1f)),0);
holderNode.setLocalTranslation(new Vector3f(0f,0,0f));
holderNode.attachDebugShape(mat);
holderNode.updateGeometricState();
rootNode.attachChild(holderNode);
getPhysicsSpace().add(holderNode);
hammerNode=new PhysicsNode(new BoxCollisionShape(new Vector3f( .3f, .3f, .3f)),1);
hammerNode.setLocalTranslation(new Vector3f(0f,-1,0f));
hammerNode.attachDebugShape(assetManager);
hammerNode.updateGeometricState();
rootNode.attachChild(hammerNode);
getPhysicsSpace().add(hammerNode);
joint=new PhysicsHingeJoint(holderNode, hammerNode, Vector3f.ZERO, new Vector3f(0f,-1,0f), Vector3f.UNIT_Z, Vector3f.UNIT_Z);
getPhysicsSpace().add(joint);
}
@Override
public void simpleUpdate(float tpf) {
Vector3f velocity = hammerNode.getLinearVelocity();
float b=2;
Vector3f force=new Vector3f(-velocity.x*b,-velocity.y*b,-velocity.z*b);
hammerNode.applyContinuousForce(true, force);
}
}
And a screenshot.