From e2b1b0bbd2053000c3fc242c10a58dde5dbec051 Mon Sep 17 00:00:00 2001 From: yangfengzzz Date: Fri, 22 Oct 2021 13:37:32 +0800 Subject: [PATCH 1/3] feat: modify physics-related class for editor --- packages/core/src/physics/index.ts | 1 + .../loader/src/scene-loader/AbilityManager.ts | 6 +- .../src/scene-loader/ColliderConfigure.ts | 66 +++++++++++++++++++ packages/oasis-engine/src/index.ts | 6 +- packages/physics-physx/src/PhysXCollider.ts | 2 +- 5 files changed, 78 insertions(+), 3 deletions(-) create mode 100644 packages/loader/src/scene-loader/ColliderConfigure.ts diff --git a/packages/core/src/physics/index.ts b/packages/core/src/physics/index.ts index ad0cadfa12..42f10a8b36 100644 --- a/packages/core/src/physics/index.ts +++ b/packages/core/src/physics/index.ts @@ -10,5 +10,6 @@ export { SphereColliderShape } from "./shape/SphereColliderShape"; export { PlaneColliderShape } from "./shape/PlaneColliderShape"; export { CapsuleColliderShape } from "./shape/CapsuleColliderShape"; +export { Collider } from "./Collider"; export { StaticCollider } from "./StaticCollider"; export { DynamicCollider } from "./DynamicCollider"; diff --git a/packages/loader/src/scene-loader/AbilityManager.ts b/packages/loader/src/scene-loader/AbilityManager.ts index 34ca5ec368..4e558308f7 100644 --- a/packages/loader/src/scene-loader/AbilityManager.ts +++ b/packages/loader/src/scene-loader/AbilityManager.ts @@ -6,6 +6,8 @@ import { pluginHook } from "./plugins/PluginManager"; import { scriptAbility } from "./resources"; import { ComponentConfig, Props } from "./types"; import { switchElementsIndex } from "./utils"; +import { colliderConfigure } from "./ColliderConfigure"; + export class AbilityManager { private abilityMap: { [id: string]: Component } = {}; @@ -18,7 +20,7 @@ export class AbilityManager { const node = this.oasis.nodeManager.get(nodeId); const AbilityConstructor = this.getCompConstructor(type); if (!AbilityConstructor) { - Logger.error(`${type} abiltiy is not defined`); + Logger.error(`${type} ability is not defined`); return; } @@ -38,6 +40,8 @@ export class AbilityManager { if (abilityProps.material) { (ability as any).material = abilityProps.material; } + } else if (type === "StaticCollider" || type === "DynamicCollider") { + colliderConfigure(ability as any, abilityProps); } else { for (let k in abilityProps) { if (abilityProps[k] !== null) { diff --git a/packages/loader/src/scene-loader/ColliderConfigure.ts b/packages/loader/src/scene-loader/ColliderConfigure.ts new file mode 100644 index 0000000000..ed48ae3b8e --- /dev/null +++ b/packages/loader/src/scene-loader/ColliderConfigure.ts @@ -0,0 +1,66 @@ +import { + BoxColliderShape, + CapsuleColliderShape, + Collider, + ColliderShapeUpAxis, + PlaneColliderShape, + SphereColliderShape +} from "@oasis-engine/core"; + +// 根据Schema构造Component +export function colliderConfigure(collider: Collider, props: any) { + (collider).isShowCollider = props.isShowCollider; + + const shapes = props.colliderShapes; + for (let i = 0; i < shapes.length; i++) { + const shape = shapes[i]; + switch (shape._shapes) { + case "BoxColliderShape": { + const box = new BoxColliderShape(); + shape.size && box.setSize(shape.size[0], shape.size[1], shape.size[2]); + shape.position && box.setPosition(shape.position[0], shape.position[1], shape.position[2]); + shape.isTrigger && (box.isTrigger = shape.isTrigger); + collider.addShape(box); + break; + } + case "CapsuleColliderShape": { + const capsule = new CapsuleColliderShape(); + shape.radius && (capsule.radius = shape.radius); + shape.height && (capsule.height = shape.height); + if (shape.upAxis) { + switch (shape.upAxis) { + case "X-Axis": + capsule.upAxis = ColliderShapeUpAxis.X; + break; + case "Y-Axis": + capsule.upAxis = ColliderShapeUpAxis.Y; + break; + case "Z-Axis": + capsule.upAxis = ColliderShapeUpAxis.Z; + break; + } + } + shape.position && capsule.setPosition(shape.position[0], shape.position[1], shape.position[2]); + shape.isTrigger && (capsule.isTrigger = shape.isTrigger); + collider.addShape(capsule); + break; + } + case "PlaneColliderShape": { + const plane = new PlaneColliderShape(); + shape.rotation && plane.setRotation(shape.position[0], shape.position[1], shape.position[2]); + shape.position && plane.setPosition(shape.position[0], shape.position[1], shape.position[2]); + shape.isTrigger && (plane.isTrigger = shape.isTrigger); + collider.addShape(plane); + break; + } + case "SphereColliderShape": { + const sphere = new SphereColliderShape(); + shape.radius && (sphere.radius = shape.radius); + shape.position && sphere.setPosition(shape.position[0], shape.position[1], shape.position[2]); + shape.isTrigger && (sphere.isTrigger = shape.isTrigger); + collider.addShape(sphere); + break; + } + } + } +} diff --git a/packages/oasis-engine/src/index.ts b/packages/oasis-engine/src/index.ts index f54216fa1b..9da430151f 100644 --- a/packages/oasis-engine/src/index.ts +++ b/packages/oasis-engine/src/index.ts @@ -11,7 +11,9 @@ import { PointLight, SpriteRenderer, SpriteMask, - Animator + Animator, + StaticCollider, + DynamicCollider } from "@oasis-engine/core"; import { GLTFModel, Parser, Model } from "@oasis-engine/loader"; @@ -26,6 +28,8 @@ Parser.registerComponents("o3", { Camera, Model, Component, + StaticCollider, + DynamicCollider, Animator }); diff --git a/packages/physics-physx/src/PhysXCollider.ts b/packages/physics-physx/src/PhysXCollider.ts index d038980466..801ae33534 100644 --- a/packages/physics-physx/src/PhysXCollider.ts +++ b/packages/physics-physx/src/PhysXCollider.ts @@ -32,7 +32,7 @@ export abstract class PhysXCollider implements ICollider { return value == shape; }); this._shapes.splice(removeID, 1); - this._pxActor.detachShape(shape._pxShape); + this._pxActor.detachShape(shape._pxShape, true); } /** From 43983c2099d5e387e1757f03efafb8673d2ebb97 Mon Sep 17 00:00:00 2001 From: yangfengzzz Date: Mon, 25 Oct 2021 09:44:54 +0800 Subject: [PATCH 2/3] feat: update collider feature --- .../src/scene-loader/ColliderConfigure.ts | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/packages/loader/src/scene-loader/ColliderConfigure.ts b/packages/loader/src/scene-loader/ColliderConfigure.ts index ed48ae3b8e..9369d3d163 100644 --- a/packages/loader/src/scene-loader/ColliderConfigure.ts +++ b/packages/loader/src/scene-loader/ColliderConfigure.ts @@ -3,9 +3,11 @@ import { CapsuleColliderShape, Collider, ColliderShapeUpAxis, + DynamicCollider, PlaneColliderShape, SphereColliderShape } from "@oasis-engine/core"; +import { Vector3 } from "@oasis-engine/math"; // 根据Schema构造Component export function colliderConfigure(collider: Collider, props: any) { @@ -29,13 +31,13 @@ export function colliderConfigure(collider: Collider, props: any) { shape.height && (capsule.height = shape.height); if (shape.upAxis) { switch (shape.upAxis) { - case "X-Axis": + case "X": capsule.upAxis = ColliderShapeUpAxis.X; break; - case "Y-Axis": + case "Y": capsule.upAxis = ColliderShapeUpAxis.Y; break; - case "Z-Axis": + case "Z": capsule.upAxis = ColliderShapeUpAxis.Z; break; } @@ -47,7 +49,7 @@ export function colliderConfigure(collider: Collider, props: any) { } case "PlaneColliderShape": { const plane = new PlaneColliderShape(); - shape.rotation && plane.setRotation(shape.position[0], shape.position[1], shape.position[2]); + shape.rotation && plane.setRotation(shape.rotation[0], shape.rotation[1], shape.rotation[2]); shape.position && plane.setPosition(shape.position[0], shape.position[1], shape.position[2]); shape.isTrigger && (plane.isTrigger = shape.isTrigger); collider.addShape(plane); @@ -63,4 +65,16 @@ export function colliderConfigure(collider: Collider, props: any) { } } } + + if (collider instanceof DynamicCollider) { + const force = props.force; + if (force) { + (collider).applyForce(new Vector3(force[0], force[1], force[2])); + } + + const torque = props.torque; + if (torque) { + (collider).applyTorque(new Vector3(torque[0], torque[1], torque[2])); + } + } } From 2a5d93b0eee1e593cb7c47e45c9b9fe328f1dd0a Mon Sep 17 00:00:00 2001 From: yangfengzzz Date: Mon, 25 Oct 2021 16:05:06 +0800 Subject: [PATCH 3/3] fix: remove default physx params --- packages/physics-physx/src/PhysXCollider.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/physics-physx/src/PhysXCollider.ts b/packages/physics-physx/src/PhysXCollider.ts index 801ae33534..d038980466 100644 --- a/packages/physics-physx/src/PhysXCollider.ts +++ b/packages/physics-physx/src/PhysXCollider.ts @@ -32,7 +32,7 @@ export abstract class PhysXCollider implements ICollider { return value == shape; }); this._shapes.splice(removeID, 1); - this._pxActor.detachShape(shape._pxShape, true); + this._pxActor.detachShape(shape._pxShape); } /**