There is probably a way to achieve this using
camera properties, but how could the field of view of the current camera be displayed onto another scene in Makie ?
In terms of rendering, one could expect something like
take from https://www.rerun.io/
This is of particular interest when zooming in a large scene but while having an overall picture in a corner. The idea would be to show the current vision cone upon updating of the camera of the main scene.
I’ll try to provide an example of what I have in mind.
One way to do it is to do an inverse transform from clip space back to data space. (And maybe that’s also a good way to do it since you don’t depend on what kind of projection the camera uses.)
fig = Figure()
ax = LScene(fig[1, 1], show_axis = false)
mesh!(ax, Rect2f(-10, -10, 20, 20), color = :lightgray)
meshscatter!(ax, [2 .* rand(Point3f) .- 1 for _ in 1:100], color = rand(100))
# generate clip space rectangle coordinates
frustum_ps = Observable(Point3f)
r = Rect3f(Point3f(-1, -1, 0), Vec3f(2, 2, 1))
rect_ps = coordinates(r) .|> Point3f
insert!(rect_ps, 13, Point3f(1, -1, 1)) # fix bad line
# on key press, convert clip space back to data space
on(events(fig).keyboardbutton) do e
if (e.key == Keyboard.t) && (e.action == Keyboard.press)
inv_pv = inv(ax.scene.camera.projectionview)
ps = map(rect_ps) do p
p = inv_pv * to_ndim(Point4f, p, 1)
return p[Vec(1,2,3)] / p
frustum_ps = ps
# show frustum
lines!(ax, frustum_ps, color = :red)
update_cam!(ax.scene, Rect3f(Point3f(-1), Vec3f(2)))
Thanks for you answer @ffreyer ! My Makie seems to complain about the
coordinates function though. I’m running this on GLMakie v0.8.2, is this function part of master ?
It’s part of GeometrBasics