9个不稳定版本 (3个破坏性更新)
新 0.9.2 | 2024年8月15日 |
---|---|
0.9.1 | 2024年6月15日 |
0.9.0 | 2024年5月6日 |
0.8.1 | 2024年3月26日 |
0.0.1 | 2024年1月20日 |
#109 在 游戏开发 中
每月106次下载
440KB
9K SLoC
Ozz-animation-rs
Ozz-animation-rs是一个跨平台确定性的rust版本骨骼动画库。
Ozz-animation-rs基于ozz-animation库,这是一个开源的C++ 3D骨骼动画库和工具集。Ozz-animation-rs仅实现了ozz-animation的运行时部分。您应与ozz-animation的工具集一起使用此库。
为了引入跨平台确定性,ozz-animation-rs不仅简单地封装了ozz-animation的运行时,而且还用rust重写了整个运行时库。因此,它可以用于网络游戏场景,例如锁步网络同步。
功能
该库支持C++版ozz几乎所有的运行时功能,包括
- 动画播放
- 关节附加
- 动画混合(部分/添加混合)
- 双骨骼IK
- 瞄准(注视)IK
- 用户通道
- 蒙皮
- 多线程
- SIMD(SSE2 + NEON)
- WASM
以下功能目前不支持
- 烘焙物理模拟(无计划)
- 所有离线功能(无计划,请使用C++库代替)
Ozz-animation离线功能不受支持,并且没有计划支持。请使用原始的C++库,它有许多工具和插件。
示例
一个简单的演示在./demo文件夹中。进入文件夹,并执行cargo run
。
./tests下的测试用例可以作为示例。
Ozz-animation-rs与原始ozz-animation库保持相同的API风格。因此,您也可以参考ozz-animation的示例。
以下是一个非常简单的示例
use glam::Mat4;
use ozz_animation_rs::*;
use std::cell::RefCell;
use std::rc::Rc;
// Load resources
let skeleton = Rc::new(Skeleton::from_path("./resource/skeleton.ozz").unwrap());
let animation = Rc::new(Animation::from_path("./resource/animation.ozz").unwrap());
// Init sample job (Rc style)
let mut sample_job: SamplingJobRc = SamplingJob::default();
sample_job.set_animation(animation.clone());
sample_job.set_context(SamplingContext::new(animation.num_tracks()));
let sample_out = Rc::new(RefCell::new(vec![SoaTransform::default(); skeleton.num_soa_joints()]));
sample_job.set_output(sample_out.clone());
// Init local to model job (Ref style)
let mut l2m_job: LocalToModelJobRef = LocalToModelJob::default();
l2m_job.set_skeleton(&skeleton);
let sample_out_ref = sample_out.borrow();
l2m_job.set_input(sample_out_ref.as_ref());
let mut l2m_out = vec![Mat4::default(); skeleton.num_joints()];
l2m_job.set_output(&mut l2m_out);
// Run the jobs
let ratio = 0.5;
sample_job.set_ratio(ratio);
sample_job.run().unwrap();
l2m_job.run().unwrap();
l2m_out.buf().unwrap(); // Outputs here, are model-space matrices
工具链
由于rust simd功能尚未稳定,您需要nightly版本的rust来编译此库。
平台
从理论上讲,ozz-animation-rs支持rust支持的所有平台。但我只测试了以下平台
- Windows/Ubuntu/Mac x64(GitHub actions)
- X64/Arm64 docker(《CircleCI》)
也许您可以在目标平台上,在./tests目录下运行跨平台的确定性测试用例。
为什么不用定点数呢?
最初,我尝试使用定点数实现类似的功能。但定点数的性能较差,并且难以与其他库兼容。
经过进一步的研究,我发现x64/arm64平台现在对IEEE浮点标准有很好的支持。因此,我基于f32重新实现了这个库。
依赖项
~6MB
~160K SLoC