Changes
Co-authored-by: Reifonas <211114984+Reifonas@users.noreply.github.com>
This commit is contained in:
@@ -246,6 +246,18 @@ function GLBModel({ sceneModel, isActive }: { sceneModel: SceneModel; isActive:
|
|||||||
? 'y'
|
? 'y'
|
||||||
: 'z';
|
: 'z';
|
||||||
|
|
||||||
|
// Calibration quaternion (applied innermost, around center). We render with identity
|
||||||
|
// while calibration is in progress for this model so face normals reflect the
|
||||||
|
// un-calibrated frame; the result is committed at the end.
|
||||||
|
const calQuatArr = sceneModel.calibrationQuat;
|
||||||
|
const isCalibratingThis = calibration.modelId === sceneModel.id && calibration.step !== 'idle' && calibration.step !== 'done';
|
||||||
|
const calQuat = useMemo(() => {
|
||||||
|
if (isCalibratingThis) return new THREE.Quaternion();
|
||||||
|
if (!calQuatArr) return new THREE.Quaternion();
|
||||||
|
return new THREE.Quaternion(calQuatArr[0], calQuatArr[1], calQuatArr[2], calQuatArr[3]);
|
||||||
|
}, [calQuatArr, isCalibratingThis]);
|
||||||
|
const calGroupRef = useRef<THREE.Group>(null);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<group
|
<group
|
||||||
scale={[renderFactor, renderFactor, renderFactor]}
|
scale={[renderFactor, renderFactor, renderFactor]}
|
||||||
@@ -253,6 +265,27 @@ function GLBModel({ sceneModel, isActive }: { sceneModel: SceneModel; isActive:
|
|||||||
e.stopPropagation();
|
e.stopPropagation();
|
||||||
if ((e.delta ?? 0) > 4) return;
|
if ((e.delta ?? 0) > 4) return;
|
||||||
|
|
||||||
|
// Calibration: capture model face normal in world space.
|
||||||
|
if (
|
||||||
|
calibration.modelId === sceneModel.id &&
|
||||||
|
(calibration.step === 'await-model-1' || calibration.step === 'await-model-2' || calibration.step === 'await-model-3') &&
|
||||||
|
e.face && e.object
|
||||||
|
) {
|
||||||
|
const n = e.face.normal.clone();
|
||||||
|
const nm = new THREE.Matrix3().getNormalMatrix(e.object.matrixWorld);
|
||||||
|
n.applyMatrix3(nm).normalize();
|
||||||
|
const wq = new THREE.Quaternion();
|
||||||
|
(calGroupRef.current ?? e.object).getWorldQuaternion(wq);
|
||||||
|
pushModelFaceNormal(n, wq);
|
||||||
|
if (calibration.step === 'done') {
|
||||||
|
const q = computeCalibrationQuaternion(calibration.pairs);
|
||||||
|
if (q) {
|
||||||
|
useModelStore.getState().setCalibration(sceneModel.id, [q.x, q.y, q.z, q.w]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (selectionMode) {
|
if (selectionMode) {
|
||||||
const element = findElementRoot(e.object);
|
const element = findElementRoot(e.object);
|
||||||
if (element) {
|
if (element) {
|
||||||
@@ -273,9 +306,8 @@ function GLBModel({ sceneModel, isActive }: { sceneModel: SceneModel; isActive:
|
|||||||
rotation={[rotXRad, rotYRad, rotZRad]}
|
rotation={[rotXRad, rotYRad, rotZRad]}
|
||||||
scale={[s, s, s]}
|
scale={[s, s, s]}
|
||||||
>
|
>
|
||||||
{/* Shift geometry so its center sits at the parent's origin (pivot = center).
|
{/* Calibration rotation (innermost, around center). */}
|
||||||
This is the local frame where measurement points are stored, so measurements
|
<group ref={calGroupRef} quaternion={calQuat}>
|
||||||
follow the model when posX/Y/Z or rotX/Y/Z change in "Posicionar" mode. */}
|
|
||||||
<ModelLocalFrame modelId={sceneModel.id} center={modelInfo.center}>
|
<ModelLocalFrame modelId={sceneModel.id} center={modelInfo.center}>
|
||||||
<primitive object={scene} />
|
<primitive object={scene} />
|
||||||
<ModelMeasurements modelId={sceneModel.id} />
|
<ModelMeasurements modelId={sceneModel.id} />
|
||||||
@@ -283,6 +315,7 @@ function GLBModel({ sceneModel, isActive }: { sceneModel: SceneModel; isActive:
|
|||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
|
</group>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user