23个版本 (13个重大更新)

0.14.0 2024年7月6日
0.12.0 2024年2月21日
0.11.2 2023年8月19日
0.10.0 2023年7月25日
0.2.2 2021年3月31日

#24无标准库

25 每月下载量
用于 2 crates

MIT/Apache

100KB
2K SLoC

Rust 1.5K SLoC // 0.0% comments C 306 SLoC // 0.3% comments

trackball

通过指数映射实现虚拟跟踪球环绕

Build Documentation Downloads Version Rust License

这是一种使用指数映射和平行传递来保持距离和角度,以产生一致且直观的跟踪球旋转的替代跟踪球技术。例如,通过屏幕中心的直线位移被传递到跟踪球上的等长弧度。这与使用正交投影的最新技术形成对比,后者会进一步扭曲远离屏幕中心的径向距离。此实现严格遵循Stantchev, G.的论文中给出的配方。“虚拟跟踪球建模和指数映射。” S2CID 44199608.

功能

  • 将常见的跟踪球操作分成几个操作处理器。
  • 通过指数映射实现一致且直观的环绕,请参阅Orbit操作处理器。
  • cc特性门后面实现相同的C11Orbit操作处理器。
  • 一致的第一人称视图,也称为自由视图或鼠标查看,相对于Orbit操作处理器。
  • 使用世界空间中的 Frame 结构体和 Frame::slide()Frame::orbit()Frame::scale() 操作及其在相机空间中的局部补充,以及在世界或相机空间中围绕任意点进行轨道和滑动操作。
  • 滑翔 Clamp 操作处理者特质,确保观察者 Frame 的边界条件。当初始和最终 Frame 之间的 Delta 不垂直于边界 Plane 时,Delta 将以使其夹持运动沿平面滑行的方式改变。
  • Bound 实现 Clamp,提供可定制的垂直边界条件。
  • 对象检查模式通过从目标测量而不是眼睛来调整剪切平面的距离。
  • 保持缩放在正射投影和透视投影模式之间切换。
  • 在视场与 Fixed 量之间转换,请参阅 Scope::set_fov()
  • 对滑动、轨道、缩放和聚焦操作进行时间无关的 Touch 手势识别。

查看 发布历史记录 以跟踪开发情况。

示例

通过将您选择的 3D 图形库的事件委派给 Orbit 操作处理程序以及其他处理程序,跟踪球相机模式实现可以非常简单。

use trackball::{
	nalgebra::{Point2, Vector3},
	Frame, Image, Orbit,
};

/// Trackball camera mode.
pub struct Trackball {
	// Frame wrt camera eye and target.
	frame: Frame<f32>,
	// Image as projection of `Scope` wrt `Frame`.
	image: Image<f32>,
	// Orbit induced by displacement on screen.
	orbit: Orbit<f32>,
}

impl Trackball {
	// Usually, a cursor position event with left mouse button being pressed.
	fn handle_left_button_displacement(&mut self, pos: &Point2<f32>) {
		// Maximum position as screen's width and height.
		let max = self.image.max();
		// Induced rotation in camera space.
		let rot = self.orbit.compute(&pos, max).unwrap_or_default();
		// Apply induced rotation to local observer frame.
		self.frame.local_orbit(&rot);
	}
	// Event when left mouse button is released again.
	fn handle_left_button_release(&mut self) {
		// Can also or instead be invoked on `Self::handle_left_button_press()`.
		self.orbit.discard();
	}
}

C11 实现

使用与 cc 功能门后面的 Orbit 操作处理程序相同的 C11 实现

许可证

版权所有 © 2021-2024 Rouven Spreckels [email protected]

此项目受以下其中之一许可:

任选其一。

贡献

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

依赖项

~3.5-5MB
~106K SLoC