!1662 优化:矩形灯增加夹点 拉伸 捕捉

pull/1672/head
林三 3 years ago committed by ChenX
parent c94b215e83
commit e6a520ac9b

@ -1,5 +1,6 @@
import { Group, Matrix4, Object3D, RectAreaLight as TRectAreaLight, Vector3 } from "three";
import { Box3, Group, Matrix4, Object3D, RectAreaLight as TRectAreaLight, Vector3 } from "three";
import { UpdateDraw } from "../../Common/Status";
import { equalv3, YAxis, ZeroVec } from "../../Geometry/GeUtils";
import { RenderType } from "../../GraphicsSystem/RenderType";
import { AutoRecord } from "../AutoRecord";
import { Factory } from "../CADFactory";
@ -8,6 +9,8 @@ import { ObjectId } from "../ObjectId";
import { Light } from "./Light";
import { RectAreaLightHelper } from "./RectAreaLightHelper";
const TARGET_DISTANCE = -1000;
@Factory
export class RectAreaLight extends Light
{
@ -25,7 +28,6 @@ export class RectAreaLight extends Light
@AutoRecord BarnDoorAngle: number = 90;//0-90 挡光板角度
@AutoRecord BarnDoorLength: number = 20;//0-100 挡光板长度
@AutoRecord SourceTexture: ObjectId;//Texture 源纹理 默认无 可以追加一张贴图
protected _ShowHelper = true;
get Target()
@ -47,15 +49,73 @@ export class RectAreaLight extends Light
}
GetGripPoints(): Array<Vector3>
{
return [this.Position, this._Target];
let heightHalf = this._Height * 0.5;
let widthHalf = this.Width * 0.5;
let pos = this.Position;
let pts: Vector3[] = [
new Vector3(-widthHalf, -heightHalf, 0).applyMatrix4(this.OCSNoClone),
new Vector3(widthHalf, -heightHalf, 0).applyMatrix4(this.OCSNoClone),
new Vector3(widthHalf, heightHalf, 0).applyMatrix4(this.OCSNoClone),
new Vector3(-widthHalf, heightHalf, 0).applyMatrix4(this.OCSNoClone),
pos,
pos.clone().add(this.Normal.multiplyScalar(TARGET_DISTANCE))
];
return pts;
}
MoveGripPoints(indexList: number[], vec: Vector3)
{
let vecInv = vec.clone().applyMatrix4(this.OCSInv.setPosition(0, 0, 0));
if (equalv3(vecInv, ZeroVec, 1e-4)) return;
this.WriteAllObjectRecord();
if (indexList[0] === 0)
let heightHalf = this._Height * 0.5;
let widthHalf = this.Width * 0.5;
let pts: Vector3[] = [
new Vector3(-widthHalf, -heightHalf, 0),
new Vector3(widthHalf, -heightHalf, 0),
new Vector3(widthHalf, heightHalf, 0),
new Vector3(-widthHalf, heightHalf, 0),
];
let i = indexList[0];
if (i < 4)
{
pts[i].add(vecInv);
let newBox = new Box3;
if (i === 0 || i === 2)
newBox.setFromPoints([pts[0], pts[2]]);
else
newBox.setFromPoints([pts[1], pts[3]]);
//变量复用
let size = newBox.getSize(new Vector3);
this._Width = size.x;
this._Height = size.y;
//新的中心
let center = newBox.getCenter(size);
center.setZ(0);
center.applyMatrix4(this.OCSNoClone);
this._Matrix.setPosition(center);
this.Update();
}
else if (i === 4)
{
this.Position = this.Position.add(vec);
else
this.Target = this.Target.add(vec);
this.Update(UpdateDraw.Matrix);
}
else if (i === 5)
{
let target = pts[0].setFromMatrixPosition(this._Matrix).add(this.Normal.multiplyScalar(TARGET_DISTANCE)).add(vec);
target.applyMatrix4(this.OCSInv).negate().applyMatrix4(this.OCSNoClone);
this._Matrix.lookAt(target, this.Position, YAxis);
this.Update(UpdateDraw.Matrix);
}
}
get Height()
{
@ -92,6 +152,7 @@ export class RectAreaLight extends Light
this.UpdateDrawObject(renderType, lightGroup);
return lightGroup;
}
UpdateDrawObject(type: RenderType, obj: Object3D)
{
let light = obj.children[0] as TRectAreaLight;
@ -99,10 +160,9 @@ export class RectAreaLight extends Light
light.width = this._Width;
light.height = this._Height;
light.color.copy(this.Color);
light.lookAt(this._Target);
// light.castShadow = true;//threejs没有支持这个影子
if (this._ShowHelper || true)
if (this._ShowHelper)
{
let help: RectAreaLightHelper;
if (obj.children.length === 1)
@ -115,12 +175,8 @@ export class RectAreaLight extends Light
help.updateMatrixWorld();
}
else
{
if (obj.children.length > 1)
obj.children[1].visible = false;
}
}
protected _ReadFile(file: CADFiler)
{
super._ReadFile(file);
@ -137,6 +193,7 @@ export class RectAreaLight extends Light
this.BarnDoorLength = file.Read();
this.SourceTexture = file.Read();
}
}
//对象将自身数据写入到文件.
WriteFile(file: CADFiler)

Loading…
Cancel
Save