Skip to main content

oxihuman_physics/
lib.rs

1// Copyright (C) 2026 COOLJAPAN OU (Team KitaSan)
2// SPDX-License-Identifier: Apache-2.0
3
4//! Physics simulation and collision proxy generation for OxiHuman meshes.
5//!
6//! This crate provides two distinct capabilities:
7//!
8//! **Collision proxies** — a set of [`CapsuleProxy`], [`SphereProxy`], and
9//! [`BoxProxy`] primitives assembled into a [`BodyProxies`] set that
10//! approximates the humanoid body for use in external physics engines (Rapier,
11//! PhysX, Bullet, etc.). The [`sampling`] sub-module fits capsules via PCA on
12//! surface-sampled point clouds for higher accuracy.
13//!
14//! **Simulation subsystems** — cloth ([`ClothSim`]), soft-body tetrahedra
15//! ([`SoftBody`]), hair strands ([`HairSystem`]), aerodynamics ([`AeroConfig`]),
16//! garment fitting ([`GarmentFitConfig`]), wind forces ([`WindConfig`]),
17//! distance/bend/volume constraints ([`DistanceConstraint`] etc.), and a
18//! contact solver ([`ContactSolverConfig`]).
19//!
20//! # Example: generate body proxies
21//!
22//! ```rust,no_run
23//! use oxihuman_physics::BodyProxies;
24//! // proxies are normally produced by oxihuman_physics::rig::build_rig
25//! let proxies = BodyProxies::new();
26//! println!("total proxy count: {}", proxies.total_count());
27//! ```
28
29pub mod oxirs_adapter;
30pub use oxirs_adapter::{
31    BodyHandle, BodyRigMapper, ColliderShape, ContactPair as OxiRsContactPair, OxiRsConfig,
32    OxiRsWorld, RayCastHit, RigidBodyDef,
33};
34
35pub mod cloth;
36pub mod joint_limits;
37pub mod sampling;
38pub mod self_intersection;
39pub mod soft_body_v2;
40pub use cloth::{ClothParticle, ClothSim, Spring, SpringKind};
41pub mod material;
42pub use material::{ClothMaterial, ClothStack};
43pub mod hair;
44pub use hair::{HairConfig, HairStrand, HairSystem};
45pub mod collision;
46pub use collision::{
47    aabb_aabb, aabb_plane, capsule_capsule, capsule_plane, capsule_sphere, closest_point_on_aabb,
48    closest_point_on_segment, resolve_contact, sphere_aabb, sphere_plane, sphere_sphere,
49    sq_dist_point_segment, Capsule, CollisionAabb, CollisionPlane, Contact, Sphere,
50};
51pub mod rig;
52pub use rig::{build_rig, CapsuleChain, PhysicsRig, RigJoint};
53
54pub mod constraint;
55pub use constraint::{
56    apply_bend_constraint, apply_distance_constraint, apply_volume_constraint, constraint_energy,
57    tet_volume, BendConstraint, ConstraintKind, DistanceConstraint, VolumeConstraint,
58};
59pub mod contact_solver;
60pub use contact_solver::{
61    contact_energy, detect_sphere_contacts, resolve_contacts, Contact as SolverContact,
62    ContactSolverConfig,
63};
64pub mod soft_body;
65pub use soft_body::{build_tet_edges, make_cube_soft_body, SoftBody, Tetrahedron};
66pub mod aerodynamics;
67pub mod garment_fit;
68pub mod garment_fit_v2;
69pub mod sdf_gen;
70pub mod self_collision;
71pub mod wind_force;
72pub use aerodynamics::{
73    apply_aero_to_particles, compute_aero_force, drag_force_magnitude, reynolds_number,
74    stokes_drag, terminal_velocity, AeroConfig, AeroForce,
75};
76pub use garment_fit::{
77    fit_garment_to_proxies, garment_clearance_stats, point_to_capsule_sdf, point_to_sphere_sdf,
78    push_out_of_capsule, spring_pull, GarmentFitConfig, GarmentFitResult, GarmentVertex,
79};
80pub use wind_force::{
81    apply_wind_to_cloth, dynamic_pressure, value_noise_3d, wind_force_on_face, wind_speed_beaufort,
82    WindConfig, WindField, WindSample,
83};
84
85pub mod proxy_types;
86pub use proxy_types::{
87    proxies_from_json, proxies_to_json, BodyProxies, BoxProxy, CapsuleProxy, SphereProxy,
88};
89
90pub mod proxy_gen;
91pub use proxy_gen::{
92    generate_fitted_proxies, generate_proxies, proxies_from_measurements, voxelize_to_proxies,
93    BODY_PART_BANDS,
94};
95
96pub mod proxy_tests;
97
98pub mod modules_a;
99pub use modules_a::*;
100
101pub mod modules_b;
102pub use modules_b::*;
103
104pub mod modules_c;
105pub use modules_c::*;
106
107pub mod modules_d;
108pub use modules_d::*;
109
110pub mod modules_e;
111pub use modules_e::*;
112
113pub mod modules_f;
114pub use modules_f::*;
115
116pub mod modules_g;
117pub use modules_g::*;