Loading src/main/java/bouncingshape/PhysicsEngine.java +214 −195 Original line number Diff line number Diff line package bouncingshape; import com.bulletphysics.collision.narrowphase.ManifoldPoint; import com.bulletphysics.dynamics.RigidBody; import com.jme3.bullet.BulletAppState; import com.jme3.bullet.PhysicsSpace; import com.jme3.bullet.collision.PhysicsCollisionEvent; import com.jme3.bullet.collision.PhysicsCollisionListener; import com.jme3.bullet.control.RigidBodyControl; import com.jme3.bullet.collision.shapes.HullCollisionShape; import com.jme3.bullet.objects.PhysicsRigidBody; Loading @@ -15,11 +19,16 @@ import com.jme3.util.BufferUtils; import java.util.Arrays; public class PhysicsEngine { private BulletAppState bulletAppState; public class PhysicsEngine implements PhysicsCollisionListener { private float gravity=-10f; private float influenceRadius=1f; private float deformationStrength=1f; private float proportionalCoefficient=100f; private float inverseProportionalCoefficient=0.5f; private PhysicsSpace physicsSpace; private Mesh mesh; private RigidBodyControl meshControl; private VertexBufferObject vbo; private VertexBufferObject initialVBO; Loading @@ -28,6 +37,8 @@ public class PhysicsEngine { private VertexBufferObject obstaclesVBO; public PhysicsEngine ( VertexBufferObject obstaclesVBO, VertexBufferObject vbo, float size, float initialSpeed, float[] initialSpeedDirection) { BulletAppState bulletAppState = new BulletAppState(); bulletAppState.startPhysics(); Loading Loading @@ -85,14 +96,14 @@ public class PhysicsEngine { } private void initPhysicsWorld(float size) { physicsSpace.setGravity(new Vector3f(0, -0f, 0)); physicsSpace.setGravity(new Vector3f(0, this.gravity, 0)); addBoxBoundaries(size); } private void addBoxBoundaries(float size) { float thickness = 0.1f; float thickness = 0.05f; // Bottom face BoxCollisionShape bottomShape = new BoxCollisionShape(new Vector3f(size, thickness, size)); Loading Loading @@ -148,26 +159,11 @@ public class PhysicsEngine { for (PhysicsRigidBody control : physicsSpace.getRigidBodyList()) { if (control.getUserObject() instanceof VertexBufferObject) { VertexBufferObject vbo = (VertexBufferObject) control.getUserObject(); updateVBOFromPhysics(vbo, (RigidBodyControl) control, deltaTime); // 传入 deltaTime 参数 updateVBOFromPhysics(vbo, (RigidBodyControl) control, deltaTime); } } } // private void printVBO(VertexBufferObject vbo) { // System.out.println("Vertex Buffer Object:"); // System.out.println("Vertices:"); // for (int i = 0; i < vbo.vertexBuffer.length; i++) { // Vector3D vertex = vbo.vertexBuffer[i]; // System.out.println("x: " + vertex.x + ", y: " + vertex.y + ", z: " + vertex.z); // } // System.out.println("Indices:"); // for (int i = 0; i < vbo.indexBuffer.length; i++) { // System.out.println(vbo.indexBuffer[i]); // } // } private void updateVBOFromPhysics(VertexBufferObject vbo, RigidBodyControl control, float deltaTime) { Vector3f location = control.getPhysicsLocation(); Quaternion rotation = control.getPhysicsRotation(); Loading @@ -191,5 +187,28 @@ public class PhysicsEngine { } } @Override public void collision(PhysicsCollisionEvent event) { if (event.getNodeA().getName().equals("Mesh") || event.getNodeB().getName().equals("Mesh")) { float collisionImpulse = event.getAppliedImpulse(); Vector3f collisionNormal = event.getNormalWorldOnB(); for (int i = 0; i < vbo.vertexCount; i++) { Vector3f vertex = new Vector3f(vbo.vertexBuffer[i].x, vbo.vertexBuffer[i].y, vbo.vertexBuffer[i].z); float distance = vertex.distance(collisionNormal.mult(collisionImpulse)); if (distance < influenceRadius) { float baseMoveAmount = (influenceRadius - distance) / influenceRadius * collisionImpulse * deformationStrength; float adjustedMoveAmount = baseMoveAmount * (proportionalCoefficient - (distance * inverseProportionalCoefficient)); Vector3f displacement = collisionNormal.negate().multLocal(adjustedMoveAmount); vertex.addLocal(displacement); vbo.vertexBuffer[i].x = vertex.x; vbo.vertexBuffer[i].y = vertex.y; vbo.vertexBuffer[i].z = vertex.z; } } } } } Loading
src/main/java/bouncingshape/PhysicsEngine.java +214 −195 Original line number Diff line number Diff line package bouncingshape; import com.bulletphysics.collision.narrowphase.ManifoldPoint; import com.bulletphysics.dynamics.RigidBody; import com.jme3.bullet.BulletAppState; import com.jme3.bullet.PhysicsSpace; import com.jme3.bullet.collision.PhysicsCollisionEvent; import com.jme3.bullet.collision.PhysicsCollisionListener; import com.jme3.bullet.control.RigidBodyControl; import com.jme3.bullet.collision.shapes.HullCollisionShape; import com.jme3.bullet.objects.PhysicsRigidBody; Loading @@ -15,11 +19,16 @@ import com.jme3.util.BufferUtils; import java.util.Arrays; public class PhysicsEngine { private BulletAppState bulletAppState; public class PhysicsEngine implements PhysicsCollisionListener { private float gravity=-10f; private float influenceRadius=1f; private float deformationStrength=1f; private float proportionalCoefficient=100f; private float inverseProportionalCoefficient=0.5f; private PhysicsSpace physicsSpace; private Mesh mesh; private RigidBodyControl meshControl; private VertexBufferObject vbo; private VertexBufferObject initialVBO; Loading @@ -28,6 +37,8 @@ public class PhysicsEngine { private VertexBufferObject obstaclesVBO; public PhysicsEngine ( VertexBufferObject obstaclesVBO, VertexBufferObject vbo, float size, float initialSpeed, float[] initialSpeedDirection) { BulletAppState bulletAppState = new BulletAppState(); bulletAppState.startPhysics(); Loading Loading @@ -85,14 +96,14 @@ public class PhysicsEngine { } private void initPhysicsWorld(float size) { physicsSpace.setGravity(new Vector3f(0, -0f, 0)); physicsSpace.setGravity(new Vector3f(0, this.gravity, 0)); addBoxBoundaries(size); } private void addBoxBoundaries(float size) { float thickness = 0.1f; float thickness = 0.05f; // Bottom face BoxCollisionShape bottomShape = new BoxCollisionShape(new Vector3f(size, thickness, size)); Loading Loading @@ -148,26 +159,11 @@ public class PhysicsEngine { for (PhysicsRigidBody control : physicsSpace.getRigidBodyList()) { if (control.getUserObject() instanceof VertexBufferObject) { VertexBufferObject vbo = (VertexBufferObject) control.getUserObject(); updateVBOFromPhysics(vbo, (RigidBodyControl) control, deltaTime); // 传入 deltaTime 参数 updateVBOFromPhysics(vbo, (RigidBodyControl) control, deltaTime); } } } // private void printVBO(VertexBufferObject vbo) { // System.out.println("Vertex Buffer Object:"); // System.out.println("Vertices:"); // for (int i = 0; i < vbo.vertexBuffer.length; i++) { // Vector3D vertex = vbo.vertexBuffer[i]; // System.out.println("x: " + vertex.x + ", y: " + vertex.y + ", z: " + vertex.z); // } // System.out.println("Indices:"); // for (int i = 0; i < vbo.indexBuffer.length; i++) { // System.out.println(vbo.indexBuffer[i]); // } // } private void updateVBOFromPhysics(VertexBufferObject vbo, RigidBodyControl control, float deltaTime) { Vector3f location = control.getPhysicsLocation(); Quaternion rotation = control.getPhysicsRotation(); Loading @@ -191,5 +187,28 @@ public class PhysicsEngine { } } @Override public void collision(PhysicsCollisionEvent event) { if (event.getNodeA().getName().equals("Mesh") || event.getNodeB().getName().equals("Mesh")) { float collisionImpulse = event.getAppliedImpulse(); Vector3f collisionNormal = event.getNormalWorldOnB(); for (int i = 0; i < vbo.vertexCount; i++) { Vector3f vertex = new Vector3f(vbo.vertexBuffer[i].x, vbo.vertexBuffer[i].y, vbo.vertexBuffer[i].z); float distance = vertex.distance(collisionNormal.mult(collisionImpulse)); if (distance < influenceRadius) { float baseMoveAmount = (influenceRadius - distance) / influenceRadius * collisionImpulse * deformationStrength; float adjustedMoveAmount = baseMoveAmount * (proportionalCoefficient - (distance * inverseProportionalCoefficient)); Vector3f displacement = collisionNormal.negate().multLocal(adjustedMoveAmount); vertex.addLocal(displacement); vbo.vertexBuffer[i].x = vertex.x; vbo.vertexBuffer[i].y = vertex.y; vbo.vertexBuffer[i].z = vertex.z; } } } } }