#animation #deterministic #fixed-point #api-bindings #ozz-animation #skeletal-animation

nightly ozz-animation-rs

A rust运行时库,用于ozz-animation的跨平台确定性

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游戏开发

Download history 146/week @ 2024-05-06 11/week @ 2024-05-20 133/week @ 2024-06-10 23/week @ 2024-06-17 8/week @ 2024-07-01 106/week @ 2024-08-12

每月106次下载

MPL-2.0 许可证

440KB
9K SLoC

Release Doc Crate github actions CircleCI

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

demo

./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