Commit 7d7241f0 authored by Wenyuan  Cui's avatar Wenyuan Cui
Browse files

Update PhysicsEngine.java

parent ceb08a77
Loading
Loading
Loading
Loading
+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;
@@ -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;
@@ -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();
@@ -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));
@@ -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();
@@ -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;
                }
            }
        }
    }
}