0
我正在嘗試使用gdx-bullet進行一些一般的模擬。 更具體地說,我試圖設置一個球體從傾斜平面上滾動時的滾動摩擦。libgdx Bullet 3D和Rolling Friction導致NaN
我將球體的滾動摩擦力設置爲非零。我把它放在斜面上方。球落下直到它碰到飛機,在這一點上它應該滾下飛機。然而,作爲替代方案,矩陣替換所有的NaN(除了最後一行):
Step 36
[1.0|0.0|0.0|0.0]
[0.0|1.0|0.0|0.0]
[0.0|0.0|1.0|2.0862775]
[0.0|0.0|0.0|1.0]
Step 37
[NaN|NaN|NaN|NaN]
[NaN|NaN|NaN|NaN]
[NaN|NaN|NaN|NaN]
[0.0|0.0|0.0|1.0]
可執行的代碼示例:
import com.badlogic.gdx.math.Matrix4;
import com.badlogic.gdx.math.Quaternion;
import com.badlogic.gdx.math.Vector3;
import com.badlogic.gdx.physics.bullet.Bullet;
import com.badlogic.gdx.physics.bullet.collision.btBoxShape;
import com.badlogic.gdx.physics.bullet.collision.btCollisionDispatcher;
import com.badlogic.gdx.physics.bullet.collision.btCollisionShape;
import com.badlogic.gdx.physics.bullet.collision.btDbvtBroadphase;
import com.badlogic.gdx.physics.bullet.collision.btDefaultCollisionConfiguration;
import com.badlogic.gdx.physics.bullet.collision.btSphereShape;
import com.badlogic.gdx.physics.bullet.dynamics.btDiscreteDynamicsWorld;
import com.badlogic.gdx.physics.bullet.dynamics.btRigidBody;
import com.badlogic.gdx.physics.bullet.dynamics.btSequentialImpulseConstraintSolver;
import com.badlogic.gdx.physics.bullet.linearmath.btMotionState;
public class TestRollingFriction {
private static class BasicMotion extends btMotionState
{
Matrix4 m4 = new Matrix4();
@Override
public void setWorldTransform(Matrix4 transform) {
m4.set(transform);
}
@Override
public void getWorldTransform(Matrix4 transform) {
transform.set(m4);
}
public String toString() {
return m4.toString();
}
}
public static void main(String[] args)
{
Bullet.init();
btDefaultCollisionConfiguration collisionConfiguration = new btDefaultCollisionConfiguration();
btCollisionDispatcher dispatcher = new btCollisionDispatcher(collisionConfiguration);
btDbvtBroadphase broadphase = new btDbvtBroadphase();
btSequentialImpulseConstraintSolver solver = new btSequentialImpulseConstraintSolver();
btDiscreteDynamicsWorld collisionWorld = new btDiscreteDynamicsWorld(dispatcher, broadphase, solver, collisionConfiguration);
collisionWorld.setGravity(new Vector3(0, 0, -9.8f));
// Create a box at the origin, of size 1,1,1
btCollisionShape boxShape = new btBoxShape(new Vector3(1, 1, 1));
// Rotate it by 20 degrees about the y axis so that the sphere will roll off it
btMotionState boxMotion = new BasicMotion();
Quaternion q = new Quaternion(new Vector3(0,1,0),20);
boxMotion.setWorldTransform(new Matrix4(q));
// Print out the box's matrix
System.out.println(boxMotion);
btRigidBody boxBody = new btRigidBody(0, boxMotion, boxShape);
boxBody.setFriction(2);
boxBody.setRollingFriction(0.2f);
collisionWorld.addRigidBody(boxBody);
btCollisionShape sphereShape = new btSphereShape(1);
btMotionState sphereMotion = new BasicMotion();
// Set the sphere's position, rotation, and scale
Matrix4 tempM2 = new Matrix4(new Vector3(0, 0, 4), new Quaternion(), new Vector3(1,1,1));
sphereMotion.setWorldTransform(tempM2);
btRigidBody sphereBody = new btRigidBody(3, sphereMotion, sphereShape);
// Does not matter what I put in here;
// If it's non-zero, then the matrix ends up with NaN in it.
sphereBody.setRollingFriction(0.2f);
sphereBody.setFriction(2);
collisionWorld.addRigidBody(sphereBody);
int count = 0;
while(count < 100)
{
collisionWorld.stepSimulation(0.05f);
System.out.println(count);
System.out.println(sphereMotion);
count++;
}
}
}
我得到相同的結果在Android和Linux桌面都運行。
任何想法我做錯了什麼? 謝謝!