Add dynamics behavior

This commit is contained in:
2022-03-30 16:19:29 +08:00
parent c811b5b1e5
commit e5ae05e737
7 changed files with 179 additions and 24 deletions
+5 -4
View File
@@ -64,7 +64,7 @@ interface IBehaviorParameterOptionItem<T extends IParamType = IParamType> {
/**
* 参数类型
*/
type: T;
type: T | string;
/**
* 参数默认值
@@ -269,6 +269,7 @@ class BehaviorRecorder<
this.behaviorId = this.behaviorInstance.behaviorId;
this.behaviorName = this.behaviorInstance.behaviorName;
this.describe = this.behaviorInstance.describe;
this.category = this.behaviorInstance.category;
this.terms = this.behaviorInstance.terms;
}
}
@@ -371,7 +372,7 @@ class Behavior<
* @param model 模型
* @param t 经过时间
*/
public beforeEffect(individual: Individual, group: Group, model: Model, t: number): void {};
public effect(individual: Individual, group: Group, model: Model, t: number): void {};
/**
* 作用影响于个体
@@ -380,7 +381,7 @@ class Behavior<
* @param model 模型
* @param t 经过时间
*/
public effect(individual: Individual, group: Group, model: Model, t: number): void {};
public afterEffect(individual: Individual, group: Group, model: Model, t: number): void {};
/**
* 全部影响作用后
@@ -389,7 +390,7 @@ class Behavior<
* @param model 模型
* @param t 经过时间
*/
public afterEffect(individual: Individual, group: Group, model: Model, t: number): void {};
public finalEffect(individual: Individual, group: Group, model: Model, t: number): void {};
}
+1 -1
View File
@@ -330,7 +330,7 @@ class Group extends CtrlObject {
* 执行行为影响
* @param
*/
public runner(t: number, effectType: "beforeEffect" | "effect" | "afterEffect" ): void {
public runner(t: number, effectType: "finalEffect" | "effect" | "afterEffect" ): void {
this.individuals.forEach((individual) => {
for(let j = 0; j < this.behaviors.length; j++) {
this.behaviors[j][effectType](individual, this, this.model, t);
+41 -8
View File
@@ -12,9 +12,9 @@ class Individual {
* @param y y 坐标
* @param z z 坐标
*/
public static vectorLength(x: number[]): number;
public static vectorLength(x: number, y: number, z: number): number;
public static vectorLength(x: number | number[], y?: number, z?: number): number {
public vectorLength(x: number[]): number;
public vectorLength(x: number, y: number, z: number): number;
public vectorLength(x: number | number[], y?: number, z?: number): number {
if (Array.isArray(x)) {
return ((x[0] ?? 0)**2 + (x[1] ?? 0)**2 + (x[2] ?? 0)**2)**.5;
} else {
@@ -28,10 +28,10 @@ class Individual {
* @param y y 坐标
* @param z z 坐标
*/
public static vectorNormalize(x: number[]): [number, number, number];
public static vectorNormalize(x: number, y: number, z: number): [number, number, number];
public static vectorNormalize(x: number | number[], y?: number, z?: number): [number, number, number] {
let length = Individual.vectorLength(x as number, y as number, z as number);
public vectorNormalize(x: number[]): [number, number, number];
public vectorNormalize(x: number, y: number, z: number): [number, number, number];
public vectorNormalize(x: number | number[], y?: number, z?: number): [number, number, number] {
let length = this.vectorLength(x as number, y as number, z as number);
if (Array.isArray(x)) {
return [
(x[0] ?? 0) / length,
@@ -52,6 +52,39 @@ class Individual {
*/
public position: number[] = [0, 0, 0];
/**
* 速度
*/
public velocity: number[] = [0, 0, 0];
/**
* 加速度
*/
public acceleration: number[] = [0, 0, 0];
/**
* 作用力
*/
public force: number[] = [0, 0, 0];
/**
* 施加力
*/
public applyForce(x: number[]): [number, number, number];
public applyForce(x: number, y: number, z: number): [number, number, number];
public applyForce(x: number | number[], y?: number, z?: number): [number, number, number] {
if (Array.isArray(x)) {
this.force[0] += x[0] ?? 0;
this.force[1] += x[1] ?? 0;
this.force[2] += x[2] ?? 0;
} else {
this.force[0] += x ?? 0;
this.force[1] += y ?? 0;
this.force[2] += z ?? 0;
}
return this.force as [number, number, number];
}
/**
* 所属群组
*/
@@ -107,7 +140,7 @@ class Individual {
* @param position 目标位置
*/
public distanceTo(position: Individual | number[]): number {
return Individual.vectorLength(this.vectorTo(position));
return this.vectorLength(this.vectorTo(position));
}
/**
+3 -3
View File
@@ -258,7 +258,7 @@ class Model extends Emitter<ModelEvent> {
for (let i = 0; i < this.objectPool.length; i++) {
let object = this.objectPool[i];
if (object instanceof Group && object.update) {
object.runner(t, "beforeEffect");
object.runner(t, "effect");
}
}
@@ -266,7 +266,7 @@ class Model extends Emitter<ModelEvent> {
for (let i = 0; i < this.objectPool.length; i++) {
let object = this.objectPool[i];
if (object instanceof Group && object.update) {
object.runner(t, "effect");
object.runner(t, "afterEffect");
}
}
@@ -274,7 +274,7 @@ class Model extends Emitter<ModelEvent> {
for (let i = 0; i < this.objectPool.length; i++) {
let object = this.objectPool[i];
if (object instanceof Group && object.update) {
object.runner(t, "afterEffect");
object.runner(t, "finalEffect");
}
}