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模拟

Download history 8/week @ 2024-04-12 13/week @ 2024-04-19 18/week @ 2024-04-26 17/week @ 2024-05-03 31/week @ 2024-05-10 45/week @ 2024-05-17 36/week @ 2024-05-24 37/week @ 2024-05-31 25/week @ 2024-06-07 32/week @ 2024-06-14 27/week @ 2024-06-21 7/week @ 2024-06-28 27/week @ 2024-07-05 26/week @ 2024-07-12 21/week @ 2024-07-19 9/week @ 2024-07-26

每月83次下载
2 个存储库中使用

MIT/Apache

12MB
222K SLoC

C++ 205K SLoC // 0.1% comments Rust 18K SLoC // 0.0% comments Shell 8 SLoC // 0.4% comments

🎳 physx

Build Status Crates.io Docs Contributor Covenant Embark Embark

这是一个进行中的工作 🚧

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_ptras_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()) }
    }
    // ...
}

许可

根据您的选择,以下任一许可协议

任您选择。

请注意,PhysX C++ SDK有自己的BSD 3许可证,并且依赖于额外的C++第三方库

贡献

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

依赖关系