This commit is contained in:
2026-02-12 15:24:31 +02:00
parent 157971b2db
commit f3c3ee8146

View File

@@ -35,6 +35,25 @@ function setLinePoints(line, a, b) {
line.geometry.computeBoundingSphere();
}
function computePoseCenter(near, far) {
const points = [];
for (const key of JOINT_KEYS) {
const np = near?.[key];
const fp = far?.[key];
if (np && Number.isFinite(np.x) && Number.isFinite(np.y)) points.push(np);
if (fp && Number.isFinite(fp.x) && Number.isFinite(fp.y)) points.push(fp);
}
if (!points.length) return null;
let sx = 0;
let sy = 0;
for (const p of points) {
sx += p.x;
sy += p.y;
}
return { x: sx / points.length, y: sy / points.length };
}
export function create3DRenderer(mountEl) {
const scene = new THREE.Scene();
scene.background = new THREE.Color(0x0f1116);
@@ -52,6 +71,9 @@ export function create3DRenderer(mountEl) {
controls.target.set(0, 0, 0);
controls.update();
const trackedTarget = new THREE.Vector3(0, 0, 0);
let hasTrackedTarget = false;
scene.add(new THREE.AmbientLight(0xffffff, 0.65));
const keyLight = new THREE.DirectionalLight(0xffffff, 0.55);
@@ -159,6 +181,21 @@ export function create3DRenderer(mountEl) {
grid.position.y = -floorY;
}
const center = computePoseCenter(near, far);
if (center) {
const nextTarget = new THREE.Vector3(center.x, -center.y, 0);
if (!hasTrackedTarget) {
trackedTarget.copy(nextTarget);
controls.target.copy(nextTarget);
hasTrackedTarget = true;
} else {
const delta = nextTarget.clone().sub(trackedTarget);
trackedTarget.copy(nextTarget);
camera.position.add(delta);
controls.target.lerp(nextTarget, 0.2);
}
}
controls.update();
renderer.render(scene, camera);
}