Update object.loc in list_objects_inner to reflect the coordinate system change

This commit is contained in:
numzero 2024-06-11 00:02:43 +03:00
parent 17ed87035a
commit 39a4ee5824

View File

@ -200,9 +200,8 @@ impl Space {
objects: hits.into_iter().filter_map(|HitInternal { object, distance }| objects: hits.into_iter().filter_map(|HitInternal { object, distance }|
if distance < dist { if distance < dist {
let pos = ray.forward(distance).pos; let pos = ray.forward(distance).pos;
// NB: object.loc.rot задан относительно object.loc.pos, поэтому и ray_to_global надо делать относительно object.loc.pos, а не pos. let rel = object.loc.rot.inverse() * (pos - object.loc.pos);
let rel = object.loc.rot.inverse() * cell.ray_to_global(Ray { pos: object.loc.pos, dir: pos - object.loc.pos }).dir; let dir = object.loc.rot.inverse() * ray.dir;
let dir = object.loc.rot.inverse() * cell.ray_to_global(Ray { pos: object.loc.pos, dir: ray.dir }).dir;
Some(Hit { id: object.id, distance, pos: cell.pos_to_global(pos), rel: Ray { pos: rel, dir } }) Some(Hit { id: object.id, distance, pos: cell.pos_to_global(pos), rel: Ray { pos: rel, dir } })
} else { None } } else { None }
).collect(), ).collect(),
@ -265,11 +264,12 @@ impl Space {
match self.which_subspace(obj.loc.pos) { match self.which_subspace(obj.loc.pos) {
Inner | Outer => { Inner | Outer => {
// NB: не работает для частей Outer с |y| < external_halflength. Но они и не нужны. // NB: не работает для частей Outer с |y| < external_halflength. Но они и не нужны.
let m = mat2(vec2(1., 0.), vec2(0., self.rect.du(obj.loc.pos.y)));
Object { Object {
id: obj.id, id: obj.id,
loc: Location { loc: Location {
pos: cell.pos_to_local(obj.loc.pos), // в плоской СК для Inner или её продолжении на Outer pos: cell.pos_to_local(obj.loc.pos), // в плоской СК для Inner или её продолжении на Outer
rot: obj.loc.rot, rot: m * obj.loc.rot,
}, },
r: obj.r, r: obj.r,
} }