Files
cocos-engine/tests/physics/stability.ts
jiaxin.lai 4cda45bfd9 physics unit-test and features base 3.3 (#9027)
* support ccd

* clearState after change type

* fix Instantiate rigid body with custom group

* add some extra functions

* update physics libs

* tweaks rigid body component

* add EVENT_UPDATE to PhysicsMaterial

* tweaks

* support switch physics backend

* remove redundant constants

* add config & min volume size

* update @cocos/physx to 1.0.4

* fix destroy cannon world

* correct init if manual construct physics system

* disable log info in test

* add some physics unit test

* add physics unit test

* make the config optional

* add runInEditor to selector

* pack physx js libs by default

* fix

* STASH

* stash

* tweaks

* rename

* update test

* support query trigger

* update @cocos/ammo to 1.1.6

* fix raycast with query trigger in physx

* raycast test with query trigger

* rename

* docs

* fix calculate local inertia (#8956)

* rename

* delete

* allow generate mesh/terrain collider at runtime

* tweaks

* use sap by default

* update @cocos/ammo to  1.1.8

* update @cocos/physx to 1.0.7

* update @cocos/cannon to 1.2.8

* update package-lock

* add ccd test

* remove config

* rename

* fix 2d phy sys typing

* support global allow sleep toggle for bullet

* tweaks

* use naive broadphase by default

* rename

* docs

* tweaks

* add missing jugement
2021-07-22 15:52:18 +08:00

55 lines
1.8 KiB
TypeScript

import { director, Node, Vec3 } from "../../cocos/core";
import { physics } from "../../exports/physics-framework";
/**
* This function is used to test stability of the physics
*/
export default function (parent: Node, steps = 500, scale = 0.5) {
const nodeStatic = new Node('StaticB');
parent.addChild(nodeStatic);
nodeStatic.addComponent(physics.BoxCollider);
nodeStatic.worldScale = new Vec3(20, 0.01, 20);
nodeStatic.worldPosition = new Vec3(0, -0.005, 0);
const size = new Vec3(scale, scale, scale);
const X = 8, Y = 8, Z = 4;
let x = 0, y = 0, z = 0;
for (let i = 0; i < Y; i++) {
y = size.y / 2 + size.y * i;
const CX = X - i;
for (let j = 0; j < CX; j++) {
x = CX * -size.x / 2 + j * size.x;
for (let k = 0; k < Z; k++) {
const nodeDynamic = new Node(`${i}-${j}`);
parent.addChild(nodeDynamic);
nodeDynamic.worldScale = size;
nodeDynamic.worldPosition = new Vec3(x, y, z + k * size.z * 2);
nodeDynamic.addComponent(physics.RigidBody);
nodeDynamic.addComponent(physics.BoxCollider);
}
}
}
const dt = physics.PhysicsSystem.instance.fixedTimeStep;
const bodies = parent.getComponentsInChildren(physics.RigidBody) as physics.RigidBody[];
const middle = Math.floor(steps / 2);
for (let i = 0; i < steps; i++) {
if (i === middle) {
bodies.forEach((v) => {
v.wakeUp();
expect(v.isSleeping).toBe(false);
expect(v.isAwake).toBe(true);
});
}
director.tick(dt);
}
bodies.forEach((v) => {
expect(v.isSleeping).toBe(true);
expect(v.isAwake).toBe(false);
})
parent.destroyAllChildren();
parent.removeAllChildren();
}