36 个版本 (18 个破坏性版本)
0.19.0 | 2023年10月11日 |
---|---|
0.18.0 | 2023年3月3日 |
0.17.0 | 2023年3月3日 |
0.16.0 | 2022年10月20日 |
0.4.0 | 2019年10月31日 |
#10 在 模拟
每月83次下载
在 2 个存储库中使用
12MB
222K SLoC
🎳 physx
physx
旨在为 physx-sys
绑定提供易于使用的封装。目标是使所有权更清晰并利用 Rust 的安全性。
总体目标是保持与底层 PhysX API 的紧密映射,同时提高代码的安全性和可靠性。这意味着,例如,我们不公开 PxLoadExtensions()
函数,而是将其附加到 Physics
构建器。
请参阅包含不安全低级绑定的仓库。
示例
基本用法
let mut physics = PhysicsFoundation::default();
let mut scene = physics.create(
SceneDescriptor {
gravity: PxVec3::new(0.0, 0.0, -9.81),
..SceneDescriptor::new(MySceneUserData::default())
}
);
// Your physics simulation goes here
有关完整示例,请参阅弹跳球示例,并将其与原始系统示例进行比较。
工作原理
将C++ API包装成Rust并非易事,需要一些额外步骤才能正常工作。第一步也是最基本的一步是创建一个C包装器,覆盖C++ API。使用C作为中介,我们可以利用稳定的ABI,通过它C++和Rust可以进行通信。《code>physx-sys crate提供了这个接口。
PhysX
大量使用了继承,这不能直接翻译成Rust。类接口直接翻译成特质,具有完整的默认实现,这些实现只是调用不安全的FFI函数。这些特质受其超类特质以及一个Class<T>
特质约束,其中T
是在physx_sys
中找到的类数据结构。类接口方法都接受指向自身的指针,而Class<T>
特质提供了as_ptr
和as_mut_ptr
方法,以检索到*const
和*mut
指针到T
。具有userData
类成员的类型也有一个UserData
特质约束。
trait RigidDynamic: RigidActor + Class<physx_sys::PxRigidDynamic> + UserData {
fn get_sleep_threshold(&self) -> f32 {
unsafe { PxRigidDynamic_getSleepThreshold(self.as_ptr()) }
}
// ...
}
许可
根据您的选择,以下任一许可协议
- Apache License,版本2.0,(LICENSE-APACHE或http://www.apache.org/licenses/LICENSE-2.0)
- MIT许可协议(LICENSE-MIT或http://opensource.org/licenses/MIT)
任您选择。
请注意,PhysX C++ SDK有自己的BSD 3许可证,并且依赖于额外的C++第三方库。
贡献
除非您明确声明,否则根据Apache-2.0许可证定义的,您有意提交的任何贡献,包括在本作品中包含的,将按照上述方式双重许可,不附加任何额外条款或条件。