9个版本 (破坏性)

0.7.0 2024年7月6日
0.6.0 2024年5月1日
0.5.0 2024年3月19日
0.4.1 2024年3月6日
0.1.1 2023年8月20日

#113 in 游戏开发

Download history 112/week @ 2024-04-28 5/week @ 2024-05-05 5/week @ 2024-05-19 1/week @ 2024-06-02 89/week @ 2024-06-30 73/week @ 2024-07-07 3/week @ 2024-07-14 57/week @ 2024-07-28 2/week @ 2024-08-04

每月62次下载

MIT/Apache

67KB
1K SLoC

bevy_trackball

Bevy的连贯虚拟轨道球控制器/相机插件

Build Downloads Version Rust License

文档

使用WebAssemblyWebGL在你的浏览器中运行交互式示例

注意:默认情况下未启用所有功能,请参阅可选功能

相机模式

支持多种相机模式

  • 轨道球模式围绕目标旋转相机。
  • 第一人称模式围绕相机旋转目标。
  • 观众模式平移目标和相机。

连贯功能

这是一种使用指数映射和平行传输的替代轨道球技术,以保持距离和角度,从而实现连贯且直观的轨道球旋转。例如,通过屏幕中心的直线上的位移被带到轨道球的等长弧上(例如,沿着轨道球的八分之一周长拖动鼠标可以使相机旋转360/8=45度,从屏幕中心到其边缘的线性拖动可以使相机旋转1弧度,其中轨道球的直径是屏幕宽度和高度的较大值)。这与使用正交投影的最新技术形成对比,这些技术会进一步扭曲远离屏幕中心的径向距离(例如,旋转会加速到边缘)。

  • 通过指数映射实现连贯且直观的环绕,请参阅trackball crate,该crate遵循Stantchev, G.在其论文中给出的配方。“虚拟轨道球建模和指数映射”。S2CID 44199608。请参阅exponential_map示例。
  • 一致的第一人称模式,也称为自由视角或以世界跟踪球为中心的鼠标视角,中心在眼睛而非目标上。
  • 通过转换鼠标滚轮设备单位进行一致缩放,请参阅TrackballWheelUnit。通过将当前光标位置或手指位置在焦点平面的质心投影来缩放眼睛距离。
  • 通过基于时间的输入(例如,按下的键)进行滑动/环绕或自由视角的一致线性/角速度TrackballVelocity。默认情况下,线性速度从角速度推导出来(其中目标和眼睛位置定义了世界半径),而角速度以每秒垂直视野单位定义,因此与世界单位缩放无关。

附加功能

  • 对环绕、缩放、滑动和聚焦(即滑动到光标/手指位置)操作的时间无关的多点触控手势识别。
  • 以与fps无关的指数平滑方式实现移动平滑。
  • 使用四元数而不是欧拉角来实现无陀螺仪锁定。
  • 滑动夹具(实验性):可以将摄像机的移动限制到用户定义的边界条件(例如,不会在地面平面下方环绕)。当移动不垂直于边界平面时,将其改变为摄像机沿边界平面滑动。目前,仅针对环绕和滑动操作实现,请参阅gliding_clamp示例。
  • 相机星座:将相机与其输入控制器解耦,而是可以使用多个相机对零个或多个选定的控制器(例如,主视口相同控制器的缩略图)敏感。
  • 星座夹具:对同一控制器敏感的相机称为一组,并且可以配置为在组成员跨越边界条件时夹住整个组的移动(例如,刚性或松散星座夹具),请参阅constellation_clamp示例。
  • 视口窃取:这允许UI系统(例如,egui在bevy_egui功能门后面的)窃取视口,从而捕获输入,请参阅egui示例。
  • 保持缩放在正交和透视投影模式之间过渡。
  • 在缩放模式之间转换(即固定垂直或水平视野或固定每像素单位)。这定义了场景是否缩放或相应的垂直或水平视野在视口高度或宽度调整时是否调整,请参阅scaling_modes示例。
  • 对象检查模式通过测量目标而不是眼睛来缩放裁剪平面距离。这有助于提高深度图的精度。适用于当已知要检查的对象范围时,因此可以将近裁剪平面安全地放置在其前面。
  • f64已准备好用于大型世界(例如,太阳系规模),只要Bevy是,请参阅问题#1680

可选功能

以下功能除非启用相应的功能门,否则都将禁用

  • egui想要焦点时,启用bevy_egui以自动窃取视口。
  • 启用serialize以支持此crate及其依赖项的各种结构的serde
  • 启用c11-orbit以测试指数映射的C实现的行为。

查看发布历史路线图以跟踪开发进度。

路线图

  • 实现第一人称模式和缩放操作的光滑夹具,见问题
  • 通过为每种模式添加专用控制器,支持更多默认的相机模式,见问题
  • 支持游戏手柄输入,见问题

输入映射

以下映射是默认映射,可进行自定义,见TrackballInput

鼠标(按钮) 触摸(手指) 键盘 操作
左键按下 + 拖动 一 + 拖动 ijkl 围绕目标旋转。
↳在轨道球边缘 二 + 滚动 uo 绕视图方向滚动。
中键按下 + 拖动 任何 + 拖动 + 左 shift ↑←↓→ 第一人称模式。
右键按下 + 拖动 二 + 拖动 esdf 在焦点平面上滑动轨道球。
    gv 滑动轨道球进/出。
滚动进/出 二 + 握拳进/出 hn 通过缩放进行远近调节。
左键按下 + 释放 任何 + 释放   滑动到光标/手指位置。
    m 切换 esdf/wasd 映射。
    p 切换正交/透视。
    Enter 重置相机变换。

或者,TrackballInput::map_wasdwasd/Space/ControlLeft 映射到滑动操作,其中 ws 用于滑动进出,Space/ControlLeft 用于滑动上下(跳跃/蹲下)。

用法

添加TrackballPlugin,然后创建一个TrackballController和一个TrackballCamera以及一个Camera3dBundle或尝试交互式示例

use bevy::prelude::*;
use bevy_trackball::prelude::*;

// Add the trackball plugin.
fn main() {
	App::new()
		.add_plugins(DefaultPlugins)
		.add_plugins(TrackballPlugin)
		.add_systems(Startup, setup)
		.run();
}

// Add a trackball controller and trackball camera to a camera 3D bundle.
fn setup(mut commands: Commands) {
	let [target, eye, up] = [Vec3::ZERO, Vec3::Z * 10.0, Vec3::Y];
	commands.spawn((
		TrackballController::default(),
		TrackballCamera::look_at(target, eye, up),
		Camera3dBundle::default(),
	));

	// Set up your scene...
}

许可证

版权 © 2023-2024 Rouven Spreckels [email protected]

本项目受以下任一许可证的许可:

您可选择其中一种。

贡献

除非您明确声明,否则根据Apache-2.0许可证定义,您有意提交给本项目并包含在内的任何贡献都将按上述方式双许可,不附加任何额外条款或条件。

依赖项

~38–76MB
~1.5M SLoC