19次发布
0.3.1 | 2024年7月11日 |
---|---|
0.3.0-rc.0 | 2024年6月30日 |
0.2.0 | 2024年3月19日 |
在游戏开发中排名第782
每月下载量14,063
110KB
2K SLoC
bevy_editor_cam
一个适用于2D/3D编辑器和CAD的生产级相机控制器。
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