Engee 文档

照相机

该页面正在翻译中。

A 照相机 仅仅是一个视口,通过它场景被可视化。 马基 提供2D和3D投影,2D绘图可以在3D投影!

要指定要用于场景的摄像机,可以设置 照相机 属性。 目前,我们提供以下相机/构造函数

这将使场景的相机突变为指定的类型。

像素相机

像素相机(campixel!)在像素空间中投影场景,即显示数据中的每个整数步将对应一个像素。 这台照相机没有控制装置. 削波限制设置为 (-10_000, 10_000).

相对相机

相对相机(cam_relative!)将场景投影为0。.1乘0。.1空间。 这台照相机没有控制装置. 削波限制设置为 (-10_000, 10_000).

2D相机

2D相机(cam2d!)使用具有固定旋转和宽高比的正投影。 您可以通过关键字参数设置以下属性 cam2d! 或者通过访问相机结构 cam=cameracontrols(场景):

  • zoomspeed=0.10f0 设置鼠标滚轮缩放的速度。

  • zoombutton=什么都没有 设置一个额外的键,需要按下以缩放。 默认为无键。

  • panbutton=鼠标。对 设置翻译视图时需要按下的鼠标按钮。

  • selectionbutton=(键盘。空间,老鼠。左) 设置一组需要按下以执行矩形缩放的按钮。

请注意,此相机不是由 轴心,轴心. 默认情况下,它用于2D LScene,LScenes和 场景s.

3D相机

Camera3D(scene[; kwargs...])

设置带有鼠标和键盘控制的3d相机。

相机的行为可以通过关键字参数或字段进行调整 设置控制措施.

设置

设置包括任何不是鼠标或键盘按钮的内容。

  • projectiontype=透视 设置投影的类型。 可以是 正字法视角.

  • rotation_center=:lookat 设置摄像机旋转的默认中心。 目前允许 :看:眼位.

  • fixed_axis=true:如果真平移使用(世界/情节)z轴而不是相机向上方向。

  • zoom_shift_lookat=true:如果true在缩放时保持光标下的数据。

  • cad=错误:如果true旋转视图 看,看 当偏离中心缩放时。

  • clipping_mode=:自适应:控制方式 附近 得到处理。 选项:

    • :静态 通行证 附近 如斯

    • :适应性 比例尺 附近norm(eyeposition-lookat) 并通过 如斯

    • :view_relative 比例尺 附近norm(eyeposition-lookat)

    • :bbox_relative 比例尺 附近 到场景边界框传递给相机 update_cam!(...,bbox). (更具体地说 远=1 缩放到边界球体的最远点, 附近 通常被复盖为最接近的点。)

  • 中心=真:控制调用时相机放置是否重置 中心!(场景),这是当一个新的情节被添加调用。

  • keyboard_rotationspeed=1.0 设置基于键盘的旋转速度。

  • keyboard_translationspeed=0.5 设置基于键盘的翻译速度。

  • keyboard_zoomspeed=1.0 设置基于键盘的缩放速度。

  • mouse_rotationspeed=1.0 设置鼠标旋转的速度。

  • mouse_translationspeed=0.5 设置鼠标翻译的速度。

  • mouse_zoomspeed=1.0 设置鼠标缩放(mousewheel)的速度。

  • circular_rotation=(假,假,假) 为(固定x,固定y,固定z)旋转轴启用圆形旋转。 (这意味着用鼠标围绕场景中心绘制一个圆圈将导致连续旋转。)

控制

控件包括任何类型的热键设置。

  • up_key=键盘。r 将翻译的键设置到屏幕顶部。

  • down_key=键盘。f 在屏幕底部设置翻译的键。

  • left_key=键盘。a 在屏幕左侧设置翻译键。

  • right_key=键盘。d 在屏幕右侧设置翻译键。

  • forward_key=键盘。w 设置翻译到屏幕的键。

  • backward_key=键盘。s 设置屏幕外翻译的键。

  • zoom_in_key=键盘。u 设置缩放到场景中的键(将eyeposition转换为lookat)。

  • zoom_out_key=键盘。o 设置缩小场景的键(从lookat转换eyeposition)。

  • increase_fov_key=键盘。b 设置增加fov的关键。

  • decrease_fov_key=键盘。n 设置降低fov的关键。

  • pan_left_key=键盘。j 设置围绕屏幕垂直轴旋转的键。

  • pan_right_key=键盘。l 设置围绕屏幕垂直轴旋转的键。

  • tilt_up_key=键盘。i 设置围绕屏幕水平轴旋转的键。

  • tilt_down_key=键盘。k 设置围绕屏幕水平轴旋转的键。

  • roll_clockwise_key=键盘。e 设置屏幕旋转的键。

  • roll_counterclockwise_key=键盘。q 设置屏幕旋转的键。

  • fix_x_key=键盘。x 设置将平移和旋转固定到(世界/绘图)x轴的键。

  • fix_y_key=键盘。y 设置将平移和旋转固定到(世界/绘图)y轴的键。

  • fix_z_key=键盘。z 设置将平移和旋转固定到(世界/绘图)z轴的键。

  • 重置=键盘。left_control和鼠标。左图 设置重置相机的键。 这相当于调用 中心!(场景).

  • reposition_button=键盘。left_alt&鼠标.左图 设置将摄像机聚焦在绘图对象上的键。

  • translation_button=鼠标。对 设置拖动翻译的鼠标按钮. (上/下/左/右)

  • scroll_mod=true 为基于滚动的缩放设置额外的修改器按钮。 (真正的中立)

  • rotation_button=鼠标。左图 设置拖动旋转的鼠标按钮. (平移,倾斜)

其他夸格

一些关键字参数用于初始化字段。 其中包括

  • 眼位=Vec3d(3):相机的位置。

  • 外观=Vec3d(0):相机聚焦的点。

  • upvector=Vec3d(0,0,1):屏幕向上方向对应的世界方向。

  • fov=45.0 是视场。 如果相机使用正投影,这是无关紧要的。

  • 近=自动 设置近夹平面的位置。 相机和近剪辑平面之间的任何东西都被隐藏。 必须大于0。 使用情况取决于 clipping_mode.

  • far=自动 设置远夹平面的位置。 任何比远夹平面更远的东西都是隐藏的。 使用情况取决于 clipping_mode. 默认值为 1clipping_mode=:bbox_relative, 2:view_relative 或从以下限制派生的值 :静态.

请注意,在活动摄像机中更新这些可观察对象需要调用 update_cam(场景) 供它们应用。 更新资料 [医]眼定位, 看,看 和/或upvector update_cam!(scene,eyeposition,lookat,upvector=Vec3d(0,0,1)) 是优选的。

相机的位置和方向也可以通过功能进行调整

  • translate_cam!(场景,v) 将通过给定的世界/绘图空间矢量翻译相机 v.

  • rotate_cam!(场景、角度) 将以相应的角度围绕其轴旋转相机。 第一个角度将围绕相机"右"旋转,即屏幕水平轴,第二个围绕向上矢量/垂直轴或 Vec3d(0,0,+-1) 如果 fixed_axis=true,第三个将围绕视图方向即屏幕外的轴旋转。 旋转尊重电流 旋转中心 照相机的。

  • 放大!(场景,zoom_step) 将改变场景的缩放级别,而无需平移或旋转场景。 zoom_步 以乘法方式应用于 凯。[医]动物学 其用作fov(透视投影)或宽度和高度(正投影)的乘数。

cam3d!cam3d_cad! 但创建一个 相机3d 有一些具体的选择。

示例-可视化摄像机视图框

using GeometryBasics, LinearAlgebra

function frustum_snapshot(cam)
    r = Rect3f(Point3f(-1, -1, -1), Vec3f(2, 2, 2))
    rect_ps = coordinates(r) .|> Point3f
    insert!(rect_ps, 13, Point3f(1, -1, 1)) # fix bad line

    inv_pv = inv(cam.projectionview[])
    return map(rect_ps) do p
        p = inv_pv * to_ndim(Point4f, p, 1)
        return p[Vec(1,2,3)] / p[4]
    end
end


ex = Point3f(1,0,0)
ey = Point3f(0,1,0)
ez = Point3f(0,0,1)

fig = Figure()
scene = LScene(fig[1, 1])
cc = Makie.Camera3D(scene.scene, projectiontype = Makie.Perspective)

行距!(场景,Rect3f(Point3f(-1),Vec3f(2)),颜色=:黑色)
行距!(场景,
    [-ex,ex,-ey,ey,-ez,ez],
    颜色=[:红色,:红色,:绿色,:绿色,:蓝色,:蓝色]
)
中心!(场景。景)

凸轮=场景。场景。照相机
eyeposition=cc。[医]眼定位
lookat=cc。看,看
frustum=map(pv->frustum_snapshot(cam),cam。projectionview)

场景=LScene(图[1,2])
_cc=Makie。Camera3D(场景。场景,projectiontype=Makie。正字)
台词!(scene,frustum,color=:blue,linestyle=:dot)
散开!(场景,眼睛位置,颜色=:黑色)
散开!(场景,lookat,颜色=:黑色)

行距!(场景,
    [-ex,ex,-ey,ey,-ez,ez],
    颜色=[:红色,:红色,:绿色,:绿色,:蓝色,:蓝色]
)
行距!(场景,Rect3f(Point3f(-1),Vec3f(2)),颜色=:黑色)

无花果

一般评论

要强制在3d中显示绘图,可以将限制设置为具有非零(z)轴间隔,或确保使用3D相机类型。 例如,您可以传递关键字参数 限制=Rect([0,0,0],[1,1,1]),或 相机=cam3d!.

通常,在修改场景时,相机可能会与场景"不同步"。 要解决这个问题,你可以打电话给 update_cam!现场的功能。

传递到2D和3d相机的按钮被转发到 [医]受压. 因此,你可以通过 错误 禁用交互, 真的 要忽略修饰符,任何按钮,按钮的集合甚至按钮的逻辑表达式。 有关更多详细信息,请参阅事件文档。