mylingo3d
Version:
Lingo3D is a React/Vue 3d game development framework that ships with a complete visual editor
56 lines • 2.13 kB
JavaScript
import { distance3d } from "@lincode/math";
import randomColor from "randomcolor";
import { getSelectionTarget } from "../states/useSelectionTarget";
import Octahedron from "./primitives/Octahedron";
import diffQuaternions from "./utils/diffQuaternions";
import getWorldPosition from "./utils/getWorldPosition";
import { vec2Point } from "./utils/vec2Point";
export default class Bone extends Octahedron {
constructor(target, child) {
super();
// hiddenAppendables.add(this)
const color = randomColor();
this.wireframe = true;
this.material.depthTest = false;
this.color = color;
this.width = 2;
this.height = 2;
this.depth = 2;
const joint = new Octahedron();
this.append(joint);
joint.scale = 0.05;
joint.wireframe = true;
//@ts-ignore
joint.material.depthTest = false;
joint.color = color;
this.createEffect(() => {
if (getSelectionTarget() !== this)
return;
this.color = "blue";
joint.color = "blue";
return () => {
this.color = color;
joint.color = color;
};
}, [getSelectionTarget]);
const from = vec2Point(getWorldPosition(target));
const to = vec2Point(getWorldPosition(child));
const { x: x0, y: y0, z: z0 } = from;
const { x: x1, y: y1, z: z1 } = to;
this.x = x0;
this.y = y0;
this.z = z0;
const h = (this.depth = distance3d(x0, y0, z0, x1, y1, z1));
this.innerZ = h * 0.5;
const t = (this.width = this.height = h * 0.2);
joint.scale = t * 0.01;
// this.lookAt(to)
const targetQuat = target.quaternion.clone();
const myQuat = this.outerObject3d.quaternion.clone();
this.onLoop = () => {
const diff = diffQuaternions(this.outerObject3d.quaternion, myQuat);
target.quaternion.copy(targetQuat.clone().multiply(diff));
};
}
}
//# sourceMappingURL=Bone.js.map