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
100KB
2K SLoC
trackball
通过指数映射实现虚拟跟踪球环绕
这是一种使用指数映射和平行传递来保持距离和角度,以产生一致且直观的跟踪球旋转的替代跟踪球技术。例如,通过屏幕中心的直线位移被传递到跟踪球上的等长弧度。这与使用正交投影的最新技术形成对比,后者会进一步扭曲远离屏幕中心的径向距离。此实现严格遵循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 版本,(LICENSES/Apache-2.0 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证(LICENSES/MIT 或 https://opensource.org/licenses/MIT)
任选其一。
贡献
除非您明确声明,否则根据 Apache-2.0 许可证定义,您提交给本项目以供包含在内的任何贡献都将按上述方式双重许可,不附加任何额外条款或条件。
依赖项
~3.5-5MB
~106K SLoC