fix(camera): orbit target in f64 to avoid extent-scale jitter
`orbit` revolved the target around the pivot as `p + (delta * (self.target - p).as_vec3()).as_dvec3()`, casting the target-to-pivot offset to f32. For a large model that offset is extent-scale (the cursor can sit far from the view centre), so the f32 cast quantized it — nudging the whole view a fraction of a unit each orbit step regardless of the drawing's origin. Do the revolve entirely in f64. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
626031de00
commit
aa63634d95
1 changed files with 11 additions and 1 deletions
|
|
@ -294,9 +294,19 @@ impl Camera {
|
||||||
|
|
||||||
// Revolve the target around the pivot by the same rotation delta so the
|
// Revolve the target around the pivot by the same rotation delta so the
|
||||||
// view orbits the chosen centre instead of the fixed file centre (#229).
|
// view orbits the chosen centre instead of the fixed file centre (#229).
|
||||||
|
// Do it in f64: casting `self.target - p` to f32 first quantizes the
|
||||||
|
// offset to the drawing's extent scale (a large model at ANY origin, not
|
||||||
|
// just UTM), so every orbit step nudged the whole view by a visible
|
||||||
|
// fraction of a unit — the "jump" when starting a rotate on big files.
|
||||||
if let Some(p) = pivot {
|
if let Some(p) = pivot {
|
||||||
let delta = self.rotation * old_rot.conjugate();
|
let delta = self.rotation * old_rot.conjugate();
|
||||||
self.target = p + (delta * (self.target - p).as_vec3()).as_dvec3();
|
let delta = glam::DQuat::from_xyzw(
|
||||||
|
delta.x as f64,
|
||||||
|
delta.y as f64,
|
||||||
|
delta.z as f64,
|
||||||
|
delta.w as f64,
|
||||||
|
);
|
||||||
|
self.target = p + delta * (self.target - p);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sync legacy yaw/pitch for hit-test functions.
|
// Sync legacy yaw/pitch for hit-test functions.
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue