#camera #controller #cad #bevy

bevy_editor_cam

编辑器和CAD的相机控制器

19次发布

0.3.1 2024年7月11日
0.3.0-rc.02024年6月30日
0.2.0 2024年3月19日

游戏开发中排名第782

Download history 255/week @ 2024-05-01 364/week @ 2024-05-08 155/week @ 2024-05-15 410/week @ 2024-05-22 341/week @ 2024-05-29 366/week @ 2024-06-05 521/week @ 2024-06-12 846/week @ 2024-06-19 1653/week @ 2024-06-26 1499/week @ 2024-07-03 2613/week @ 2024-07-10 1017/week @ 2024-07-17 3088/week @ 2024-07-24 4214/week @ 2024-07-31 2749/week @ 2024-08-07 3503/week @ 2024-08-14

每月下载量14,063

MIT/Apache

110KB
2K SLoC

bevy_editor_cam

一个适用于2D/3D编辑器和CAD的生产级相机控制器。

CI docs.rs crates.io

https://github.com/aevyrie/bevy_editor_cam/assets/2632925/50e342ac-9cb3-4ab5-8577-45b3955fe423

支持的Bevy版本

bevy bevy_editor_cam
0.14 0.3
0.13 0.2
0.12 0.1

lib.rs:

一个适用于3D编辑器的生产级相机控制器;旨在满足任何需要快速直观地导航虚拟空间的人。

相机控制器是非常主观的!作为一名在机械工程CAD软件中使用相机控制器多年的开发者,我对相机控制器中哪些因素重要有自己的看法。这是我尝试制作我一直想要的控制器,修复了我遇到的烦恼。

因为相机控制器如此主观,我觉得有必要写下制作这个产品的动机,对我而言什么是重要的,以及我如何在冲突的目标之间做出决定。不知何故,这最终变成了某种宣言。如果你来到这里是为了学习如何使用或扩展这个插件,我已经将宣言简化为两句话

相机控制器需要响应迅速、稳健,并且使用起来令人满意。当这些需求之间发生冲突时,应该按照这个顺序进行优先排序。

现在你已经吸收了我的智慧,可以自由地跳转到使用部分。

或者不跳。由你决定。

哲学

以下是良好编辑器相机控制器的属性,按重要性排序。这些是我在这里做出的选择背后的驱动价值观。你可能不同意,有不同的价值观或优先级!

响应性

一个好的相机控制器永远不会感觉飘忽不定或断开连接。它应该精确地到达用户命令的位置。响应性不仅仅是“低延迟”,它关乎尊重用户的意图。

一级输入

最精确的输入是一级输入,即直接控制某物的位置,而不是其速度(二级)或加速度(三级)。例如,使用鼠标与使用手柄控制第一人称视角的旋转。鼠标是一级输入,鼠标垫上鼠标的位置直接对应于玩家面对的方向。相反,摇杆控制视图旋转的速度。所有这些都意味着,在可能的情况下,相机控制器应直接使用指针输入。

像素级平移

当你点击并拖动场景进行平移时,你点击的东西应该粘在你的指针上,永不漂移。即使在进行平滑处理的情况下,这也应该成立。

直观的缩放

相机应该在你指向的方向上放大和缩小。如果用户悬停在某个物体上,相机的速度应自动调整,以便快速缩放到它,而不穿过它。

可预测的旋转

当您点击并拖动以在3D中环绕场景时,旋转中心应位于拖动开始时指针所在的位置。

直观的视角切换

在切换不同的视场或透视与正交投影之间时,相机视图不应跳跃或突然改变。视图应平滑变形,保持屏幕上最后交互的点静止。

健壮

相机控制器应在任何场景下工作,并在输入模糊时优雅地处理失败,不会令人意外。

在所有条件下工作

上一节中的所有功能都应该在帧率、距离、缩放、相机视场和相机投影(包括正交)不受影响的情况下工作。

优雅的回退

如果相机运动开始时指针下没有东西,应使用最后已知的深度,以防止在击中测试失败时出现不规律的行为。如果用户正在围绕物体上的一个点环绕,然后单击以在空空间中旋转,相机不应因为光标下没有东西而飞向太空。

令人满意

控制器应感觉使用起来很舒服。

动量

平移和环绕应支持可配置的动量,允许您“轻扫”相机以覆盖场景,并使相机感觉可调。这对于轨迹球和触摸用户尤其有用。

平滑度

输入的平滑度应可配置,以在运动流畅性和响应速度之间进行权衡。这在向其他人展示屏幕时特别有用,因为快速动作可能会让人感到头晕或恶心。

使用方法

此插件仅需要三个东西才能工作。用于击中测试的 bevy_mod_picking 插件、DefaultEditorCamPlugins 插件组,以及 EditorCam 组件。控制器设置在每个 EditorCam 组件中配置。

入门指南

1. 添加 bevy_mod_picking

相机控制器使用 bevy_picking_core 进行指针交互。如果您已经使用击中测试插件,则使用此相机控制器基本上是免费的,因为它可以重用您已经运行的相同击中测试。

如果您尚未使用击中测试插件,您只需要默认插件即可开始。

app.add_plugins(bevy_mod_picking::DefaultPickingPlugins);

2. 添加 DefaultEditorCamPlugins

这是一个插件组,它添加了相机控制器以及所有扩展。您也可以添加 controller::MinimalEditorCamPlugin,尽管您需要添加自己的输入插件。

app.add_plugins(bevy_editor_cam::DefaultEditorCamPlugins);

3. 插入 EditorCam 组件

最后,将 controller::component::EditorCam 插入到您想要控制的任何相机上。这标志着相机为可控制,并持有所有相机控制器设置。

commands.spawn((
    // Camera
    EditorCam::default(),
));

其他显著功能

我还实现了一些对这种相机控制器有用的其他功能。

与浮动原点和其他控制器兼容

此控制器在视图空间中进行所有计算。这意味着您可以将相机移动到任何位置,更新其变换,只要在执行此操作时用户没有控制相机,它将继续正常工作。这意味着您可以用另一个相机控制器控制此相机,或者在浮动原点系统中使用它。

独立的天空盒

在CAD环境中工作时,通常使用正交投影从图像中去除透视畸变。然而,由于正交投影的视场为零,天空盒的视图无限小,即只有天空盒的一个像素可见。为了解决这个问题,提供了一个扩展,将天空盒附加到与该相机视场独立的相机。

指针和击中测试无关

此库的用户不应被迫使用任何特定的击中测试方法,如CPU光线投射。控制器使用bevy_picking_core

  • 任意击中测试后端一起工作,包括用户编写的后端。有关更多信息,请参阅bevy_picking_core::backend
  • 任意数量的指针输入,包括触摸。
  • 视口和多通道渲染。

依赖关系

~34–71MB
~1M SLoC