alice-physics 2.2.0

Deterministic physics engine: 128-bit fixed-point rigid bodies with bit-exact, replayable results, typed observation and rollback for search and planning, plus FEM, CFD and 3D-print analysis modules
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
# Cloth, soft-body and rod coverage of ALICE-Physics (real-time and
# physically based animation of deformable objects), against an external
# reference frame.
#
# What this table is: every capability that the standard texts (Bender et al.,
# Position-Based Simulation Methods in Computer Graphics; Müller et al. 2007
# Position Based Dynamics; Macklin et al. 2016 XPBD; Baraff-Witkin 1998; Bridson
# et al. 2002 cloth collisions; Bergou et al. 2008 Discrete Elastic Rods;
# Bouaziz et al. 2014 Projective Dynamics), reference implementations (NVIDIA
# Flex, PhysX cloth, Houdini Vellum) and standard benchmarks (hanging cloth,
# Cusick drape, crumpling, cantilever rod, catenary, Michell twisted ring, soft
# cube volume) expect of a deformable-object simulator, one [[item]] per
# capability, with what the crate has today. The rows are written by hand: the
# axes and the items come from the reference frame, not from the modules that
# exist, so a missing capability is visible instead of absent.
#
# Boundary with the other tables (one capability lives in one table only):
#   - a single rope joint between two rigid bodies (one unilateral constraint)
#     is the rigid table; rope particles attached to a body are here
#   - continuum solid FE (linear, hyperelastic, shells and membranes as finite
#     elements) and tetrahedral mesh generation are the solid FEM table; here
#     are the XPBD / position-based deformables
#   - fracture mechanics (energy release rate, crack growth) is the fracture
#     table; the geometric operation of cutting and tearing a mesh is here
#   - cloth-fluid and other cloth-flow coupling (cloth_fluid, fsi) are the
#     coupling table; aerodynamic forces evaluated on the cloth itself are here
#   - rigid-body sleeping, rigid contact and the 2D engine (physics2d) are the
#     rigid table
# Functions that exist but are not called by the step of a deformable, and
# module docs that name a capability without an implementation, say so in
# `evidence`.
#
# status (exactly one of):
#   implemented+oracle     implemented, and at least one non-ignored test
#                          checks it against an independent reference
#   implemented-no-oracle  implemented, no such test
#   partial                implemented with a restriction that the source states;
#                          `limitation` quotes it, and the source carries a
#                          `LIMITATION(<id>)` comment at that place
#   missing                not implemented
#   out-of-scope           not a capability of this field (reason in `evidence`)
#
# This axis is separate from the test ignore reasons (`known defect: ...`,
# `src gap: ...`, `diagnostic`, `runtime`). A capability that exists with a
# recorded defect keeps its status and cites the known-defect test in
# `evidence`; it is not `missing`.
#
# keys: id (COV-SOFT-NNN) / axis / item / source (book, chapter, paper or
# reference-implementation feature; no quoted text) / status / evidence
# (`src/...rs::symbol`, `tests/...rs::test_fn`) / oracle_candidate / limitation
# (verbatim quote of the source, required for `partial`). "(推測)" marks a row
# whose status rests on a search that may have missed a synonym.
#
# Reference values marked "参照値要確認" are to be checked against the original
# publication before any test uses them.
#
# Checked by scripts/coverage_check.py (tests: scripts/test_coverage_check.py).

[[item]]
id = "COV-SOFT-001"
axis = "cloth model"
item = "mass-spring cloth (structural / shear / bend springs integrated as forces)"
source = "Provot 1995 (Deformation constraints in a mass-spring model); Baraff-Witkin 1998 §4"
status = "missing"
evidence = "布はばね力でなく位置拘束 (XPBD 距離) だけで表す src/cloth.rs::solve_edge_constraints 力として積分するばねモデルは無い"
oracle_candidate = "単一のばね-質点の振動周期 2π√(m/k) と減衰なしのエネルギー保存"
limitation = ""

[[item]]
id = "COV-SOFT-002"
axis = "cloth model"
item = "stretch: XPBD distance constraints on the mesh edges"
source = "Müller et al. 2007 (Position Based Dynamics) §3; Macklin et al. 2016 (XPBD); Houdini Vellum distance constraint"
status = "implemented+oracle"
evidence = "src/cloth.rs::solve_edge_constraints tests/default_configs.rs::cloth_config_default_pinned_curtain_sags_and_stays_bounded (上端を pin した 2 m の布の下端が非伸長長さ -2 に落ち着く)"
oracle_candidate = "α>0 で一軸に引いた帯の静的伸びが α から決まる値と一致 (COV-SOFT-038 と組で)"
limitation = ""

[[item]]
id = "COV-SOFT-003"
axis = "cloth model"
item = "shear resistance separate from stretch (shear constraint with its own stiffness)"
source = "Provot 1995; Baraff-Witkin 1998 (shear condition); Houdini Vellum cloth (stretch / shear)"
status = "missing"
evidence = "格子の三角形分割の全辺に同じ stretch_compliance を掛ける src/cloth.rs::build_constraints shear 専用の剛性は無い"
oracle_candidate = "単純せん断した正方形片の復元力が shear 剛性だけで決まる"
limitation = ""

[[item]]
id = "COV-SOFT-004"
axis = "cloth model"
item = "anisotropic in-plane stiffness (warp / weft)"
source = "Baraff-Witkin 1998 (u / v stretch conditions); Volino et al. 2009 (A simple approach to nonlinear tensile stiffness for accurate cloth simulation)"
status = "missing"
evidence = "伸びの剛性は 1 値 src/cloth.rs::ClothConfig"
oracle_candidate = "経糸方向と緯糸方向に同じ荷重で引いた伸びの比が剛性比に一致"
limitation = ""

[[item]]
id = "COV-SOFT-005"
axis = "cloth model"
item = "bending: dihedral-angle constraint between adjacent triangles"
source = "Müller et al. 2007 (Position Based Dynamics) Appendix A; Houdini Vellum bend"
status = "implemented+oracle"
evidence = "src/cloth.rs::solve_bend_constraints src/cloth.rs::bend_flat_rest_is_pi_and_flat_cloth_is_a_fixed_point src/cloth.rs::bend_folded_cloth_relaxes_monotonically_toward_flat src/cloth.rs::bend_pinned_vertices_do_not_move"
oracle_candidate = ""
limitation = ""

[[item]]
id = "COV-SOFT-006"
axis = "cloth model"
item = "isometric / quadratic bending (discrete-shell bending energy)"
source = "Bergou et al. 2006 (A Quadratic Bending Model for Inextensible Surfaces); Grinspun et al. 2003 (Discrete Shells)"
status = "missing"
evidence = "曲げは二面角の位置拘束のみ src/cloth.rs::solve_bend_constraints"
oracle_candidate = "円筒に巻いた布の曲げエネルギーが κ²/2 の面積分に一致"
limitation = ""

[[item]]
id = "COV-SOFT-007"
axis = "cloth model"
item = "triangle membrane element (constant-strain triangle, StVK / co-rotational)"
source = "Etzmuss et al. 2003 (A fast finite element solution for cloth modelling); Volino et al. 2009; Abaqus M3D3 membrane"
status = "missing"
evidence = "面内は辺の距離拘束のみで、三角形の面内ひずみを使う要素は無い src/cloth.rs::build_constraints (FE のシェル・膜要素は固体 FEM の表の範囲)"
oracle_candidate = "一軸引張の膜で応力-ひずみが StVK の閉形式に一致"
limitation = ""

[[item]]
id = "COV-SOFT-008"
axis = "cloth model"
item = "implicit cloth with stretch / shear / bend conditions (Baraff-Witkin)"
source = "Baraff-Witkin 1998 (Large Steps in Cloth Simulation)"
status = "missing"
evidence = "時間積分は位置ベースの陽的予測のみ src/cloth.rs::substep"
oracle_candidate = "大きな Δt で吊った布が発散しない (Baraff-Witkin の大ステップ)"
limitation = ""

[[item]]
id = "COV-SOFT-009"
axis = "cloth model"
item = "strain limiting (maximum stretch / biphasic)"
source = "Provot 1995 (deformation constraints); Thomaszewski et al. 2009 (Continuum-based Strain Limiting)"
status = "missing"
evidence = "伸びの上限を課す拘束は無い 伸びは反復回数に依存する距離拘束の残差で決まる src/cloth.rs::solve_edge_constraints"
oracle_candidate = "重りを吊った帯の最大伸びが上限 (例 10%) を超えない"
limitation = ""

[[item]]
id = "COV-SOFT-010"
axis = "cloth model"
item = "long-range attachments (tethers from free vertices to pinned vertices)"
source = "Kim et al. 2012 (Long Range Attachments); PhysX cloth tether constraints"
status = "missing"
evidence = "grep (long range / tether / LRA) は自己接触の文脈のみ 拘束は辺と二面角だけ src/cloth.rs::build_constraints"
oracle_candidate = "高解像度の吊り布で反復回数を減らしても下端の伸びが上限内"
limitation = ""

[[item]]
id = "COV-SOFT-011"
axis = "cloth model"
item = "cloth from an arbitrary triangle mesh (not only a regular grid)"
source = "PhysX / Flex cloth cooking; Houdini Vellum cloth from any polygon mesh"
status = "missing"
evidence = "構築子は src/cloth.rs::new_grid のみ 拘束の構築 src/cloth.rs::build_constraints は private で、triangles を差し替えても拘束は作り直せない"
oracle_candidate = "1 枚の二十面体の殻を作り、辺長が静止長に保たれる"
limitation = ""

[[item]]
id = "COV-SOFT-012"
axis = "cloth model"
item = "seams / sewing (stitch constraints between panels)"
source = "Houdini Vellum stitch / weld; Volino-Magnenat-Thalmann, Virtual Clothing ch.4"
status = "missing"
evidence = "パネル間の縫い目を表す拘束は無い (grep stitch / sew / seam は cloth.rs に 0 件)"
oracle_candidate = "2 枚の布を辺で縫い合わせ、縫い目の間隔が 0 に収束"
limitation = ""

[[item]]
id = "COV-SOFT-013"
axis = "cloth model"
item = "cloth plasticity (rest-angle / rest-length update, permanent wrinkles)"
source = "Houdini Vellum plasticity; Narain et al. 2013 (Folding and Crumpling Adaptive Sheets)"
status = "missing"
evidence = "静止長と静止二面角は構築時の値で固定 src/cloth.rs::build_constraints"
oracle_candidate = "折り曲げて保持した後に放した布の残留角が降伏後の更新則に一致"
limitation = ""

[[item]]
id = "COV-SOFT-014"
axis = "cloth model"
item = "closed-surface pressure / global volume constraint (balloon, inflated soft body)"
source = "Müller et al. 2007 (Position Based Dynamics) §4.4 (closed meshes, overpressure); Houdini Vellum pressure"
status = "missing"
evidence = "体積は軟体の四面体ごとの拘束のみ src/deformable.rs::solve_volume_constraints 閉じた布・表面メッシュ全体の体積や内圧の拘束は無い"
oracle_candidate = "内圧 k の閉じた球殻の静止半径が理想気体の閉形式に一致"
limitation = ""

[[item]]
id = "COV-SOFT-015"
axis = "soft body"
item = "tetrahedral volume constraint (XPBD)"
source = "Müller et al. 2007 (Position Based Dynamics) §4; Macklin et al. 2016 (XPBD); Houdini Vellum tet volume"
status = "implemented-no-oracle"
evidence = "src/deformable.rs::solve_volume_constraints 体積を測る test (tests/default_configs.rs::deformable_config_default_free_cube_translates_rigidly_and_rests_on_floor) は shape matching (既定 0.5) が同時に効いた状態での 5% 以内で、体積拘束だけを照合する test は無い"
oracle_candidate = "shape_stiffness 0 で一軸に押した四面体 1 個の体積が α=0 で厳密に保たれ、α>0 で XPBD の閉形式の比で緩む"
limitation = ""

[[item]]
id = "COV-SOFT-016"
axis = "soft body"
item = "edge-length constraints on the tetrahedral mesh"
source = "Müller et al. 2007 (Position Based Dynamics); Houdini Vellum tet stretch"
status = "implemented-no-oracle"
evidence = "src/deformable.rs::solve_edge_constraints 辺長を確かめる test は自由落下 (全拘束が自明に満たされる) のみ tests/analytic_deformable_wiring.rs::free_falling_cube_follows_the_kinematic_center_of_mass"
oracle_candidate = "1 辺を引き伸ばした初期配置から 1 反復で静止長に戻る量が逆質量比に一致"
limitation = ""

[[item]]
id = "COV-SOFT-017"
axis = "soft body"
item = "shape matching with the optimal rotation (polar decomposition of A_pq)"
source = "Müller et al. 2005 (Meshless Deformations Based on Shape Matching)"
status = "partial"
evidence = "src/deformable.rs::apply_shape_matching 回転を抽出せず、静止形を現在の重心に平行移動した目標へ混ぜる 重心は質量重み無し src/deformable.rs::center_of_mass"
oracle_candidate = "剛体回転を与えた立方体が shape matching で回転を保つ (Müller 2005 は回転不変、現状は静止姿勢へ戻す)"
limitation = "src/deformable.rs::apply_shape_matching 'Simplified shape matching: blend toward rest shape'"

[[item]]
id = "COV-SOFT-018"
axis = "soft body"
item = "cluster / lattice shape matching (overlapping regions)"
source = "Rivers-James 2007 (FastLSM); Müller et al. 2005 §4.4 (cluster-based deformation)"
status = "missing"
evidence = "shape matching は物体全体で 1 つ src/deformable.rs::apply_shape_matching"
oracle_candidate = "片持ちの棒状物体のたわみが領域サイズに応じて単調に変わる"
limitation = ""

[[item]]
id = "COV-SOFT-019"
axis = "soft body"
item = "FEM energy as XPBD constraints (Neo-Hookean / co-rotational, stable at inversion)"
source = "Macklin-Müller 2021 (A Constraint-based Formulation of Stable Neo-Hookean Materials); Bender et al. 2014 (Position-Based Simulation of Continuous Materials)"
status = "missing"
evidence = "module の題名は「FEM-XPBD」(src/deformable.rs) だが拘束は体積・辺・shape matching のみ FE の超弾性は固体 FEM の表 (src/hyperelastic.rs) で別系統"
oracle_candidate = "一軸引張した Neo-Hookean 棒の伸びと横収縮が閉形式に一致、反転した要素が元に戻る"
limitation = ""

[[item]]
id = "COV-SOFT-020"
axis = "soft body"
item = "material parameters in physical units (Young's modulus / Poisson ratio mapped to compliance)"
source = "Macklin-Müller 2021; Bender et al. 2014; Houdini Vellum stiffness in physical units"
status = "missing"
evidence = "設定は compliance と 0..1 の剛性 src/deformable.rs::DeformableConfig のみ E と ν から決める経路は無い"
oracle_candidate = "E を与えた立方体の一軸圧縮の見かけの剛性が E に一致"
limitation = ""

[[item]]
id = "COV-SOFT-021"
axis = "soft body"
item = "simulation from an arbitrary tetrahedral mesh"
source = "Flex / Houdini Vellum soft body from a tetrahedral mesh"
status = "implemented-no-oracle"
evidence = "src/deformable.rs::new (任意の四面体リスト) test は new_cube 経由のみ tests/analytic_deformable_wiring.rs::cube_tetrahedra_fill_the_cube_exactly"
oracle_candidate = "正二十面体を四面体分割した球を落とし、体積と重心の自由落下を照合"
limitation = ""

[[item]]
id = "COV-SOFT-022"
axis = "soft body"
item = "embedded render surface (skinning a fine surface to the simulation mesh)"
source = "Flex soft body skinning; Houdini Vellum point deform"
status = "missing"
evidence = "表面は四面体の頂点から作る三角形のみ src/deformable.rs::DeformableBody"
oracle_candidate = "埋め込み点の重心座標が変形後も保たれる"
limitation = ""

[[item]]
id = "COV-SOFT-023"
axis = "soft body"
item = "soft-body plasticity (rest-shape update)"
source = "Müller et al. 2005 §4.5 (plasticity); Bargteil et al. 2007"
status = "missing"
evidence = "静止形は構築時に固定 src/deformable.rs::build_constraints"
oracle_candidate = "押し込んで離した立方体の残留変形が降伏則に一致"
limitation = ""

[[item]]
id = "COV-SOFT-024"
axis = "rod / rope / hair"
item = "rope: chain of XPBD distance constraints"
source = "Müller et al. 2007 (Position Based Dynamics); Houdini Vellum string / hair stretch"
status = "implemented+oracle"
evidence = "src/rope.rs::solve_distance_constraints tests/audit_rope.rs::one_distance_iteration_restores_rest_length_symmetrically tests/audit_rope.rs::constraint_correction_splits_by_inverse_mass tests/audit_rope.rs::new_places_particles_evenly_with_rest_length_l_over_n known defect: tests/audit_rope.rs::total_particle_mass_is_mass_per_unit_times_length"
oracle_candidate = ""
limitation = ""

[[item]]
id = "COV-SOFT-025"
axis = "rod / rope / hair"
item = "rod bending stiffness between consecutive segments"
source = "Bergou et al. 2008 (Discrete Elastic Rods) §4; Umetani et al. 2014 (Position-based Elastic Rods)"
status = "missing"
evidence = "rope は距離拘束だけで曲げ拘束は無い src/rope.rs::substep"
oracle_candidate = "片持ちロッドの先端たわみ PL³/3EI (COV-SOFT-086)"
limitation = ""

[[item]]
id = "COV-SOFT-026"
axis = "rod / rope / hair"
item = "discrete elastic rods: twist with a material frame (parallel transport)"
source = "Bergou et al. 2008 (Discrete Elastic Rods); Bergou et al. 2010 (Discrete Viscous Threads)"
status = "missing"
evidence = "rope の粒子は位置だけで向き・ねじれの自由度を持たない src/rope.rs::Rope"
oracle_candidate = "一端を回したロッドのねじれ角が他端まで線形に分布 (θ(s) = Θ s/L)"
limitation = ""

[[item]]
id = "COV-SOFT-027"
axis = "rod / rope / hair"
item = "Cosserat rod (per-segment orientation, stretch-shear and bend-twist constraints)"
source = "Kugelstadt-Schömer 2016 (Position and Orientation Based Cosserat Rods); Deul et al. 2018 (Direct Position-Based Solver for Stiff Rods)"
status = "missing"
evidence = "向きを持つ segment は無い src/rope.rs::Rope"
oracle_candidate = "螺旋の静止形を持つロッドが重力下で閉形式のつり合いに収束"
limitation = ""

[[item]]
id = "COV-SOFT-028"
axis = "rod / rope / hair"
item = "inextensible strands by follow-the-leader projection"
source = "Müller et al. 2012 (Fast Simulation of Inextensible Hair and Fur)"
status = "missing"
evidence = "伸びは反復回数に依存する距離拘束の残差で決まる src/rope.rs::solve_distance_constraints"
oracle_candidate = "1 反復で全 segment が静止長に戻る"
limitation = ""

[[item]]
id = "COV-SOFT-029"
axis = "rod / rope / hair"
item = "hair strands (guide strands, interpolation, hair-hair interaction)"
source = "Selle et al. 2008 (A Mass Spring Model for Hair Simulation); Petrovic et al. 2005 (Volumetric Methods for Simulation and Rendering of Hair); Houdini Vellum hair"
status = "missing"
evidence = "hair を名乗るのは風の module の doc (src/wind_zone.rs) のみで、hair の型は無い 分割: 子の行 COV-SOFT-094〜096 この行の status は子のうち最も実装の少ないもの (missing) に合わせて手で保つ (検査器は親子を見ない)"
oracle_candidate = "ガイド 1 本からの補間毛が根元の座標系に追従"
limitation = ""

[[item]]
id = "COV-SOFT-030"
axis = "rod / rope / hair"
item = "pinning rope particles to the world and to moving bodies"
source = "Houdini Vellum pin to animation; PhysX attachments"
status = "implemented+oracle"
evidence = "src/rope.rs::update_pin_targets tests/analytic_rope_wiring.rs::update_pin_targets_follows_a_moving_body_identity_and_180deg_rotation tests/analytic_rope_wiring.rs::pin_start_and_pin_end_hold_exactly_under_gravity_for_many_frames"
oracle_candidate = ""
limitation = ""

[[item]]
id = "COV-SOFT-031"
axis = "rod / rope / hair"
item = "attaching a rod particle to a rigid body (one-way, compliant, breakable)"
source = "PhysX particle-rigid attachment; Houdini Vellum glue / breaking threshold"
status = "implemented+oracle"
evidence = "src/rope_attach.rs::solve_rope_attachments tests/analytic_rope_attach_wiring.rs::rigid_static_anchor_lands_particle_exactly_with_rotated_anchor tests/analytic_rope_attach_wiring.rs::compliance_closes_one_over_one_plus_alpha tests/analytic_rope_attach_wiring.rs::break_threshold_is_strict_and_leaves_the_particle_alone"
oracle_candidate = ""
limitation = ""

[[item]]
id = "COV-SOFT-032"
axis = "rod / rope / hair"
item = "two-way rod-body attachment (the body receives the reaction force and torque)"
source = "Macklin et al. 2014 (Unified Particle Physics for Real-Time Applications) §5; PhysX particle-rigid attachment"
status = "partial"
evidence = "src/rope_attach.rs::solve_rope_attachments_two_way tests/analytic_rope_attach_wiring.rs::two_way_splits_the_gap_by_inverse_mass_and_conserves_momentum tests/analytic_rope_attach_wiring.rs::two_way_with_static_body_equals_one_way"
oracle_candidate = "重心から外した錨点で吊った剛体が受けるトルク r×F と角運動量の保存"
limitation = "src/rope_attach.rs::solve_rope_attachments_two_way 'translation of the centre of mass; the anchor offset's torque is not applied'"

[[item]]
id = "COV-SOFT-033"
axis = "rod / rope / hair"
item = "rope self-contact and rope-rope contact (segment-segment, knots)"
source = "Spillmann-Teschner 2008 (An Adaptive Contact Model for the Robust Simulation of Knots); Houdini Vellum hair collision"
status = "missing"
evidence = "rope の衝突は SdfCollider の粒子判定のみ src/rope.rs::resolve_sdf_collisions"
oracle_candidate = "2 本の rope を交差させて落とし、segment 間距離が太さ未満にならない"
limitation = ""

[[item]]
id = "COV-SOFT-034"
axis = "rod / rope / hair"
item = "rod contact with rigid-body shapes (capsule-segment, two-way)"
source = "Servin-Lacoursière 2008 (Rigid Body Cable for Virtual Environments); PhysX particle collision"
status = "missing"
evidence = "rope の衝突相手は SdfCollider のみで剛体側は動かない src/rope.rs::resolve_sdf_collisions"
oracle_candidate = "動く剛体の箱に掛けた rope が箱を引き戻す運動量交換"
limitation = ""

[[item]]
id = "COV-SOFT-035"
axis = "rod / rope / hair"
item = "adaptive resolution / cable wrapping (nodes inserted at contact)"
source = "Servin-Lacoursière 2008; Houdini Vellum hair resampling"
status = "missing"
evidence = "segment 数は構築時に固定 src/rope.rs::new"
oracle_candidate = "円柱に巻き付けた rope の張力比が capstan 式 e^{μθ} に一致 (参照値要確認)"
limitation = ""

[[item]]
id = "COV-SOFT-036"
axis = "solver"
item = "position-based Gauss-Seidel projection with substeps"
source = "Müller et al. 2007 (Position Based Dynamics) Alg. 1; Macklin et al. 2019 (Small Steps in Physics Simulation)"
status = "implemented+oracle"
evidence = "src/rope.rs::substep tests/audit_rope.rs::more_iterations_leave_a_smaller_length_residual tests/audit_rope.rs::free_fall_follows_symplectic_euler_with_damping_once_per_frame 布 src/cloth.rs::substep と軟体 src/deformable.rs::substep も同じ形"
oracle_candidate = ""
limitation = ""

[[item]]
id = "COV-SOFT-037"
axis = "solver"
item = "XPBD compliance term α/Δt² in the constraint update"
source = "Macklin et al. 2016 (XPBD) eq. 18"
status = "implemented+oracle"
evidence = "src/rope.rs::solve_distance_constraints tests/audit_rope.rs::compliance_softens_the_correction_by_alpha_over_dt_squared 布 src/cloth.rs::solve_edge_constraints と軟体 src/deformable.rs::solve_edge_constraints も同じ式"
oracle_candidate = ""
limitation = ""

[[item]]
id = "COV-SOFT-038"
axis = "solver"
item = "XPBD Lagrange-multiplier accumulation (stiffness independent of the iteration count)"
source = "Macklin et al. 2016 (XPBD) eq. 18 (Δλ update)"
status = "missing"
evidence = "3 module とも反復ごとに λ = C/(Σw+α̃) を新たに計算し、乗数を累積しない (src/rope.rs::solve_distance_constraints / src/cloth.rs::solve_edge_constraints / src/deformable.rs::solve_volume_constraints) 剛体 2D の拘束 (src/physics2d.rs::solve_distance) は累積する別系統"
oracle_candidate = "α>0 の rope の静的伸びが反復回数 1 / 8 / 64 で同じ (Macklin 2016 の比較)"
limitation = ""

[[item]]
id = "COV-SOFT-039"
axis = "solver"
item = "XPBD constraint damping (β term)"
source = "Macklin et al. 2016 (XPBD) eq. 26"
status = "missing"
evidence = "減衰は frame ごとの速度の一律倍のみ src/cloth.rs::apply_frame_damping"
oracle_candidate = "α>0 の 1 自由度の振動が β から決まる減衰率で減る"
limitation = ""

[[item]]
id = "COV-SOFT-040"
axis = "solver"
item = "parallel constraint solve (Jacobi with averaging / graph colouring)"
source = "Macklin et al. 2014 (Unified Particle Physics) §4.2; Fratarcangeli et al. 2016 (Vivace)"
status = "missing"
evidence = "伸び・曲げの拘束は逐次の Gauss-Seidel のみ src/cloth.rs::solve_edge_constraints 自己接触だけが Jacobi 平均 (COV-SOFT-060)"
oracle_candidate = "彩色ごとの並列解が逐次解と同じ収束率"
limitation = ""

[[item]]
id = "COV-SOFT-041"
axis = "solver"
item = "Projective Dynamics (local-global solve)"
source = "Bouaziz et al. 2014 (Projective Dynamics)"
status = "missing"
evidence = "grep (projective) 0 件"
oracle_candidate = "大きな剛性の布で反復ごとの残差が単調に減り、陰的 Euler の解に収束"
limitation = ""

[[item]]
id = "COV-SOFT-042"
axis = "solver"
item = "implicit Euler with Newton / conjugate gradients (filtered constraints)"
source = "Baraff-Witkin 1998 §5; Boxerman-Ascher 2004"
status = "missing"
evidence = "変形体の時間積分は位置ベースのみ src/cloth.rs::substep (陰的な固体 FE は固体 FEM の表)"
oracle_candidate = "線形ばね鎖の陰的 Euler の 1 step が線形系の解に一致"
limitation = ""

[[item]]
id = "COV-SOFT-043"
axis = "solver"
item = "convergence acceleration (Chebyshev semi-iterative / Anderson)"
source = "Wang 2015 (A Chebyshev Semi-Iterative Approach for Accelerating Projective and Position-based Dynamics); Peng et al. 2018 (Anderson Acceleration for Geometry Optimization)"
status = "missing"
evidence = "grep (chebyshev / anderson) は cloth / rope / deformable に 0 件"
oracle_candidate = "同じ反復回数で残差が加速なしより小さい"
limitation = ""

[[item]]
id = "COV-SOFT-044"
axis = "solver"
item = "vertex block descent (per-vertex Newton blocks)"
source = "Chen et al. 2024 (Vertex Block Descent)"
status = "missing"
evidence = "頂点ごとの局所 Newton は無い src/cloth.rs::substep"
oracle_candidate = ""
limitation = ""

[[item]]
id = "COV-SOFT-045"
axis = "solver"
item = "unified particle solver (cloth, ropes, soft bodies, rigid clusters and fluid in one system)"
source = "Macklin et al. 2014 (Unified Particle Physics for Real-Time Applications); NVIDIA Flex"
status = "missing"
evidence = "布 src/cloth.rs::Cloth / rope src/rope.rs::Rope / 軟体 src/deformable.rs::DeformableBody は別々の型と step を持ち、互いに接触しない 分割: 子の行 COV-SOFT-091〜093 この行の status は子のうち最も実装の少ないもの (missing) に合わせて手で保つ (検査器は親子を見ない)"
oracle_candidate = "布の上に落とした rope が布を貫かない"
limitation = ""

[[item]]
id = "COV-SOFT-046"
axis = "solver"
item = "GPU / multi-thread solve"
source = "NVIDIA Flex; PhysX GPU cloth"
status = "missing"
evidence = "変形体の step は単一スレッドの逐次処理 src/cloth.rs::substep"
oracle_candidate = "並列解が逐次解と bit 一致 (決定性を保つ並列化)"
limitation = ""

[[item]]
id = "COV-SOFT-047"
axis = "solver"
item = "bit-exact deterministic stepping"
source = "PhysX enhanced determinism; lockstep networking requirement"
status = "implemented+oracle"
evidence = "tests/determinism_golden.rs::determinism_cloth_drape src/cloth.rs::self_contact_result_is_independent_of_the_pair_order src/cloth.rs::self_collision_is_independent_of_the_pair_order_across_both_stages"
oracle_candidate = ""
limitation = ""

[[item]]
id = "COV-SOFT-048"
axis = "time integration / damping"
item = "symplectic Euler prediction with velocities from the position change"
source = "Müller et al. 2007 (Position Based Dynamics) Alg. 1"
status = "implemented+oracle"
evidence = "src/rope.rs::substep tests/audit_rope.rs::free_fall_follows_symplectic_euler_with_damping_once_per_frame tests/analytic_deformable_wiring.rs::free_falling_cube_follows_the_kinematic_center_of_mass"
oracle_candidate = ""
limitation = ""

[[item]]
id = "COV-SOFT-049"
axis = "time integration / damping"
item = "global velocity damping applied once per frame"
source = "NVIDIA Flex damping; Houdini Vellum velocity damping"
status = "implemented+oracle"
evidence = "src/cloth.rs::apply_frame_damping tests/audit_rope.rs::free_fall_follows_symplectic_euler_with_damping_once_per_frame (substeps 1 / 2 / 4 で同じ減衰)"
oracle_candidate = ""
limitation = ""

[[item]]
id = "COV-SOFT-050"
axis = "time integration / damping"
item = "damping that preserves rigid-body motion (only relative velocities damped)"
source = "Müller et al. 2007 (Position Based Dynamics) §3.5"
status = "missing"
evidence = "速度の一律倍は自由落下・剛体回転も減衰させる src/cloth.rs::apply_frame_damping src/deformable.rs::apply_frame_damping src/rope.rs::apply_frame_damping"
oracle_candidate = "剛体回転させた布片の角運動量が減衰を入れても保存"
limitation = ""

[[item]]
id = "COV-SOFT-051"
axis = "time integration / damping"
item = "sleeping / deactivation of resting deformables"
source = "PhysX cloth sleep threshold; Bullet soft body deactivation"
status = "missing"
evidence = "cloth / rope / deformable に sleep の状態は無い (剛体の sleep は剛体の表)"
oracle_candidate = "静止した布が閾値以下で step を省き、起こすと同じ解に戻る"
limitation = ""

[[item]]
id = "COV-SOFT-052"
axis = "collision"
item = "particle collision against signed-distance colliders (with thickness)"
source = "Bridson et al. 2002 (Robust Treatment of Collisions, Contact and Friction for Cloth Animation) §5; Fuhrmann et al. 2003 (Distance fields for rapid collision detection in physically based modeling)"
status = "implemented+oracle"
evidence = "src/cloth.rs::resolve_sdf_collisions src/cloth.rs::step_with_sdf_drapes_cloth_over_unit_sphere_without_penetration src/rope.rs::step_with_sdf_keeps_free_rope_particles_outside_unit_sphere src/deformable.rs::step_with_sdf_keeps_cube_particles_outside_unit_sphere tests/analytic_rope_wiring.rs::step_with_sdf_plane_exact_resolution_from_below"
oracle_candidate = ""
limitation = ""

[[item]]
id = "COV-SOFT-053"
axis = "collision"
item = "tangential friction against colliders (Coulomb, |Δv_t| <= μ|Δv_n|)"
source = "Bridson et al. 2002 §7"
status = "implemented+oracle"
evidence = "src/rope.rs::resolve_sdf_collisions tests/audit_rope.rs::inbound_contact_scales_normal_by_minus_tenth_and_applies_coulomb_friction tests/audit_rope.rs::tangential_loss_per_frame_is_independent_of_the_substep_count tests/audit_rope.rs::coulomb_friction_stops_at_zero_tangential_speed 布 src/cloth.rs::resolve_sdf_collisions と軟体も同じ形"
oracle_candidate = ""
limitation = ""

[[item]]
id = "COV-SOFT-054"
axis = "collision"
item = "Coulomb friction (static / kinetic, bounded by the normal correction)"
source = "Macklin et al. 2014 (Unified Particle Physics) §6.1; Bridson et al. 2002 §7.2"
status = "missing"
evidence = "摩擦は接触ごとに接線速度を (1−μ) 倍する形で法線力に依らない (COV-SOFT-053)"
oracle_candidate = "傾斜 θ の平板に置いた布片が tanθ < μ_s で静止、超えると μ_k の加速度で滑る"
limitation = ""

[[item]]
id = "COV-SOFT-055"
axis = "collision"
item = "configurable restitution of particle contacts"
source = "Bridson et al. 2002 §7; PhysX particle restitution"
status = "missing"
evidence = "rope は法線速度を −0.1 倍に固定 (src/rope.rs::resolve_sdf_collisions)、布と軟体は法線速度を捨てる 係数を設定する経路は無い known defect: tests/audit_rope.rs::separating_normal_velocity_is_not_reversed_by_the_contact"
oracle_candidate = "粒子を平面に落とし、跳ね返り速度が e·v に一致"
limitation = ""

[[item]]
id = "COV-SOFT-056"
axis = "collision"
item = "continuous collision of particles against colliders (swept test)"
source = "Bridson et al. 2002 §6.2; Harmon et al. 2008"
status = "missing"
evidence = "SDF 接触は substep 末の位置で判定するだけ src/cloth.rs::resolve_sdf_collisions src/sdf_ccd.rs の掃過判定は剛体用で変形体からは呼ばれない"
oracle_candidate = "1 substep で薄い板を跨ぐ速度の粒子が板の手前で止まる"
limitation = ""

[[item]]
id = "COV-SOFT-057"
axis = "collision"
item = "collision against the rigid world's shapes (sphere / capsule / box / triangle mesh)"
source = "PhysX cloth collision shapes; NVIDIA Flex shapes"
status = "missing"
evidence = "布と rope の衝突相手は SdfCollider のみ src/cloth.rs::step_with_sdf src/rope.rs::step_with_sdf"
oracle_candidate = "布を箱の角に落とし、箱の面を貫かない"
limitation = ""

[[item]]
id = "COV-SOFT-058"
axis = "collision"
item = "cloth and rope pushing rigid bodies (two-way contact)"
source = "Macklin et al. 2014 §5; PhysX two-way cloth interaction"
status = "missing"
evidence = "SDF 側は動かない (src/cloth.rs::resolve_sdf_collisions は粒子だけを動かす) 双方向は軟体の球近似のみ (COV-SOFT-059)"
oracle_candidate = "動く剛体の球が布を押し、布から受けた力積で減速 (運動量の保存)"
limitation = ""

[[item]]
id = "COV-SOFT-059"
axis = "collision"
item = "soft-body / rigid-body two-way contact"
source = "Macklin et al. 2014 §5; Houdini Vellum + RBD two-way"
status = "partial"
evidence = "src/deformable.rs::resolve_rigid_body_collisions tests/analytic_deformable_wiring.rs::dynamic_sphere_shares_the_correction_by_inverse_mass_and_the_collision_is_inelastic tests/analytic_deformable_wiring.rs::static_body_is_exact_the_particle_takes_the_whole_correction"
oracle_candidate = "箱の剛体に落とした軟体立方体が箱の面で止まり、運動量が保存"
limitation = "src/deformable.rs::resolve_rigid_body_collisions 'Treats each rigid body as a sphere with given radius for simplicity.'"

[[item]]
id = "COV-SOFT-060"
axis = "collision"
item = "self-collision: vertex-face proximity"
source = "Bridson et al. 2002 §6.1"
status = "implemented+oracle"
evidence = "src/cloth.rs::collect_vertex_face_candidates tests/analytic_self_contact.rs::vertex_face_crossing_matches_the_closed_form_exactly tests/analytic_self_contact.rs::the_point_triangle_metric_matches_the_closed_form src/cloth.rs::the_proximity_projection_restores_exactly_the_contact_thickness src/cloth.rs::the_averaging_denominator_counts_contacts_from_both_stages"
oracle_candidate = ""
limitation = ""

[[item]]
id = "COV-SOFT-061"
axis = "collision"
item = "self-collision: edge-edge proximity"
source = "Bridson et al. 2002 §6.1"
status = "implemented+oracle"
evidence = "src/cloth.rs::accumulate_edge_edge_contacts src/cloth.rs::the_edge_edge_projection_restores_exactly_the_contact_thickness src/cloth.rs::the_edge_edge_projection_weights_s_t_and_the_inverse_masses_separately tests/analytic_self_contact.rs::edge_edge_closest_approach_matches_the_closed_form_exactly 平行な辺対は頂点-面に任せる (src/cloth.rs::closest_points_on_segments) 関数 doc の「no swept edge-edge test」(src/cloth.rs::accumulate_edge_edge_contacts) は掃過修復 (COV-SOFT-062) の追加前の記述"
oracle_candidate = ""
limitation = ""

[[item]]
id = "COV-SOFT-062"
axis = "collision"
item = "self-collision CCD (vertex chords and swept edge pairs repaired over the frame)"
source = "Bridson et al. 2002 §6.2; Provot 1997 (Collision and self-collision handling in cloth model dedicated to design garments) coplanarity cubic"
status = "partial"
evidence = "src/cloth.rs::resolve_self_contact_over_frame tests/analytic_self_contact.rs::a_crumpled_cloth_does_not_pass_through_itself tests/analytic_self_contact.rs::ccd_coplanarity_cubic_is_constructed_exactly_and_its_root_is_bracketed src/cloth.rs::an_edge_pair_that_swaps_sides_in_one_frame_is_seen_by_the_crossings_invariant 1 frame 内で通り抜けて戻る対は数えない src/cloth.rs::a_pair_that_crosses_and_returns_inside_one_interval_is_not_counted"
oracle_candidate = "同時に多数の接触が重なる積み重ね (布を 10 枚重ねて押す) で貫通 0 と辺の伸びの上限"
limitation = "src/cloth.rs::resolve_self_contact_over_frame 'This repair is a **position** projection: it can stretch an edge past what `solve_edge_constraints` would allow, and it does not build rigid impact zones, so a pile-up of simultaneous contacts is resolved approximately rather than exactly.'"

[[item]]
id = "COV-SOFT-063"
axis = "collision"
item = "rigid impact zones / fail-safe for simultaneous collisions"
source = "Bridson et al. 2002 §6.3; Harmon et al. 2008 (Robust Treatment of Simultaneous Collisions)"
status = "missing"
evidence = "修復は位置の射影のみで impact zone を作らない (src/cloth.rs::resolve_self_contact_over_frame)"
oracle_candidate = "多層の積み重ねで反復を増やしても残る貫通が 0 になる"
limitation = ""

[[item]]
id = "COV-SOFT-064"
axis = "collision"
item = "self-collision broad phase (spatial hash / bounding-volume hierarchy)"
source = "Teschner et al. 2003 (Optimized Spatial Hashing for Collision Detection of Deformable Objects); Bridson et al. 2002 §6"
status = "missing"
evidence = "候補は全対の総当たり (src/cloth.rs::substep、辺-辺 src/cloth.rs::collect_edge_edge_candidates) lib の doc の「cloth と共有の hash grid」(src/lib.rs) に対応する呼び出しは cloth.rs に無い"
oracle_candidate = "候補集合が総当たりと一致し、粒子数に対して線形に増える"
limitation = ""

[[item]]
id = "COV-SOFT-065"
axis = "collision"
item = "self-collision and mutual contact of soft bodies"
source = "Teschner et al. 2005 (Collision Detection for Deformable Objects); Houdini Vellum self collision"
status = "missing"
evidence = "軟体は SDF と剛体 (球近似) との接触のみ src/deformable.rs::step_with_sdf"
oracle_candidate = "2 つの立方体を衝突させて表面が交差しない"
limitation = ""

[[item]]
id = "COV-SOFT-066"
axis = "collision"
item = "friction in self-contact"
source = "Bridson et al. 2002 §7.2"
status = "missing"
evidence = "自己接触は法線方向の位置射影のみ (cloth.rs の friction は SDF 接触の sdf_friction だけ src/cloth.rs::ClothConfig)"
oracle_candidate = "傾けた 2 枚重ねの布で上の布が μ に応じて滑る / 止まる"
limitation = ""

[[item]]
id = "COV-SOFT-067"
axis = "collision"
item = "barrier-based intersection-free contact (IPC, codimensional)"
source = "Li et al. 2020 (Incremental Potential Contact); Li et al. 2021 (Codimensional Incremental Potential Contact)"
status = "missing"
evidence = "grep (barrier / IPC) は cloth / rope / deformable に 0 件"
oracle_candidate = ""
limitation = ""

[[item]]
id = "COV-SOFT-068"
axis = "attachment / external force"
item = "pinning cloth vertices to the world"
source = "Houdini Vellum pin; PhysX cloth fixed particles"
status = "implemented+oracle"
evidence = "src/cloth.rs::pin tests/default_configs.rs::cloth_config_default_pinned_curtain_sags_and_stays_bounded (pin した上端が bit 一致で動かない)"
oracle_candidate = ""
limitation = ""

[[item]]
id = "COV-SOFT-069"
axis = "attachment / external force"
item = "cloth attached to moving rigid bodies (pin targets follow the body, two-way)"
source = "PhysX cloth attachment; Houdini Vellum pin to animation"
status = "missing"
evidence = "module doc の機能一覧は「Pin constraints for attaching cloth to bodies」(src/cloth.rs) だが pin は逆質量を 0 にするだけ (src/cloth.rs::pin) 剛体の姿勢に追従させる API は無い (rope は COV-SOFT-030)"
oracle_candidate = "回転する剛体の縁に付けた布の付け根が剛体の点の軌道に一致"
limitation = ""

[[item]]
id = "COV-SOFT-070"
axis = "attachment / external force"
item = "pinning / attaching soft-body vertices (world or rigid body)"
source = "Houdini Vellum pin / attach to geometry; Flex soft body attachment"
status = "missing"
evidence = "DeformableBody に pin の API は無い (呼び手が inv_masses を 0 にする) src/deformable.rs::DeformableBody"
oracle_candidate = "上面を固定した立方体の静的なたわみ"
limitation = ""

[[item]]
id = "COV-SOFT-071"
axis = "attachment / external force"
item = "wind force on cloth"
source = "NVIDIA Flex wind; Houdini Vellum wind"
status = "partial"
evidence = "src/cloth.rs::compute_wind_force 布の wind は 1 本のベクトルを全粒子に同じ力として足す"
oracle_candidate = "向きの異なる面を持つ布で、面ごとに受ける力が法線成分に比例 (COV-SOFT-073 と組)"
limitation = "src/cloth.rs::compute_wind_force 'Simplified: uniform wind force'"

[[item]]
id = "COV-SOFT-072"
axis = "attachment / external force"
item = "per-particle quadratic aerodynamic drag with gusts (wind zone)"
source = "NVIDIA Flex drag; Unity WindZone; Hoerner, Fluid-Dynamic Drag"
status = "partial"
evidence = "src/wind_zone.rs::force_on_particle tests/audit_wind_zone.rs::force_general_3d_matches_half_rho_cd_a_speed_vrel tests/analytic_wind_zone_wiring.rs::force_on_particle_matches_force_on_for_the_equivalent_rigid_body_state Cloth は粒子ごとの外力の入口を持たず (wind は 1 ベクトル、COV-SOFT-071)、呼び手が velocities に足す形"
oracle_candidate = "面の向きを変えた布片で受ける抗力が投影面積に比例"
limitation = "src/wind_zone.rs 'The MVP evaluates the aerodynamic force in the body's centre and ignores surface-orientation dependence'"

[[item]]
id = "COV-SOFT-073"
axis = "attachment / external force"
item = "triangle aerodynamic drag and lift (normal- and area-dependent)"
source = "Keckeisen et al. 2004 (Interactive Cloth Simulation in Virtual Environments, aerodynamics); NVIDIA Flex cloth drag / lift; Houdini Vellum drag"
status = "missing"
evidence = "風の力は点で評価し面の向きを見ない (src/wind_zone.rs)"
oracle_candidate = "風に対して角度 θ の平板布片の揚力と抗力の比が向きの閉形式に一致 (参照値要確認)"
limitation = ""

[[item]]
id = "COV-SOFT-074"
axis = "topology change"
item = "plane cut: classify particles and split the crossing edges"
source = "Molino et al. 2004 (A Virtual Node Algorithm for Changing Mesh Topology During Simulation); Bielser et al. 2004"
status = "implemented+oracle"
evidence = "src/soft_body_cut.rs::cut_deformable tests/analytic_soft_body_cut_wiring.rs::cut_deformable_tetrahedron_hand_counted_split_and_intersections tests/audit_soft_body_cut.rs::intersection_is_distance_weighted_not_midpoint tests/engineering_oracles_misc.rs::soft_body_cut_partition_crossing_count_and_intersections_on_plane"
oracle_candidate = ""
limitation = ""

[[item]]
id = "COV-SOFT-075"
axis = "topology change"
item = "applying a cut to the simulated body (duplicate vertices, rebuild constraints, split elements)"
source = "Molino et al. 2004; Sifakis et al. 2007 (Arbitrary Cutting of Deformable Tetrahedralized Objects)"
status = "missing"
evidence = "cut は分類と交点を返すだけ (src/soft_body_cut.rs::CutResult) Cloth の拘束は private (src/cloth.rs::Cloth) で外から作り直せない 軟体も同じ (src/deformable.rs::DeformableBody)"
oracle_candidate = "切断した布の 2 片が落下して離れ、切断面を跨ぐ拘束が残らない"
limitation = ""

[[item]]
id = "COV-SOFT-076"
axis = "topology change"
item = "cutting along an arbitrary blade path / swept surface"
source = "Bielser et al. 2004 (A State Machine for Real-Time Cutting of Tetrahedral Meshes); Steinemann et al. 2006"
status = "missing"
evidence = "切断は平面のみ src/soft_body_cut.rs::CutPlane"
oracle_candidate = "折れ線の刃で切った交点がすべて刃の掃過面上"
limitation = ""

[[item]]
id = "COV-SOFT-077"
axis = "topology change"
item = "cloth tearing (split where the edge strain exceeds a threshold)"
source = "Metaaphanon et al. 2009 (Tearing Cloth); Houdini Vellum breaking"
status = "missing"
evidence = "引き裂きの経路は無い (grep tear は FE の mesh の文脈のみ) エネルギー解放率など破壊力学の基準は破壊の表"
oracle_candidate = "伸びの閾値を超えた辺だけが切れ、他の辺の長さが保たれる"
limitation = ""

[[item]]
id = "COV-SOFT-078"
axis = "topology change"
item = "adaptive remeshing (refine / coarsen the cloth mesh)"
source = "Narain et al. 2012 (Adaptive Anisotropic Remeshing for Cloth Simulation)"
status = "missing"
evidence = "メッシュは構築時に固定 src/cloth.rs::new_grid"
oracle_candidate = "細分化前後で総質量と面積が保存"
limitation = ""

[[item]]
id = "COV-SOFT-079"
axis = "integration / output"
item = "deformables stepped inside the rigid-body world (one step, shared contacts)"
source = "NVIDIA Flex / PhysX scene; Houdini Vellum + RBD"
status = "missing"
evidence = "solver.rs の module doc は「Unified solver for rigid bodies, cloth, and ropes.」(src/solver.rs) だが solver.rs に Cloth / Rope / DeformableBody の参照は無い 呼び手が別々に step する"
oracle_candidate = "world の step 1 回で布と剛体が同じ Δt で進み、接触の力積が釣り合う"
limitation = ""

[[item]]
id = "COV-SOFT-080"
axis = "integration / output"
item = "vertex normals for rendering"
source = "PhysX / Flex cloth normals"
status = "implemented+oracle"
evidence = "src/cloth.rs::compute_normals src/cloth.rs::test_cloth_normals"
oracle_candidate = ""
limitation = ""

[[item]]
id = "COV-SOFT-081"
axis = "integration / output"
item = "self-intersection count (instrument for the no-pass-through invariant)"
source = "Bridson et al. 2002 §6 (intersection-free state)"
status = "implemented+oracle"
evidence = "src/cloth.rs::remaining_self_contact_crossings tests/analytic_cloth_crossings_wiring.rs::a_vertex_pushed_through_a_distant_triangle_is_counted tests/analytic_cloth_crossings_wiring.rs::an_undisturbed_frame_has_no_crossings"
oracle_candidate = ""
limitation = ""

[[item]]
id = "COV-SOFT-082"
axis = "integration / output"
item = "per-element strain / stress / energy output"
source = "Houdini Vellum stretch / bend attributes; PhysX cloth stretch ratios"
status = "missing"
evidence = "変形体の出力は位置・速度・法線のみ (src/cloth.rs::compute_normals) 辺の伸びや拘束の力を返す API は無い"
oracle_candidate = "一様に引いた布の全辺の伸びが一致"
limitation = ""

[[item]]
id = "COV-SOFT-083"
axis = "benchmark"
item = "hanging cloth pinned along one edge settles at its inextensible length"
source = "Houdini Vellum / Flex cloth demos (hanging curtain)"
status = "implemented+oracle"
evidence = "tests/default_configs.rs::cloth_config_default_pinned_curtain_sags_and_stays_bounded src/cloth.rs::drape_bottom_row_ends_below_pinned_top_and_above_free_fall"
oracle_candidate = ""
limitation = ""

[[item]]
id = "COV-SOFT-084"
axis = "benchmark"
item = "drape test of a circular sample on a disk (drape coefficient)"
source = "ISO 9073-9 / BS 5058 (Cusick drape test)"
status = "missing"
evidence = "円形の布を円盤に載せる scene は無い 円盤は SdfCollider で作れる (src/cloth.rs::step_with_sdf)"
oracle_candidate = "drape 係数を素材値と比較 (参照値要確認)"
limitation = ""

[[item]]
id = "COV-SOFT-085"
axis = "benchmark"
item = "crumpled cloth does not pass through itself"
source = "Bridson et al. 2002 (crumpling scenes)"
status = "implemented+oracle"
evidence = "tests/analytic_self_contact.rs::a_crumpled_cloth_does_not_pass_through_itself tests/analytic_self_contact.rs::self_collision_improves_the_edge_edge_separation_it_constrains"
oracle_candidate = ""
limitation = ""

[[item]]
id = "COV-SOFT-086"
axis = "benchmark"
item = "cantilever rod static deflection against Euler-Bernoulli (PL³/3EI)"
source = "Bergou et al. 2008 §7; Timoshenko, Strength of Materials"
status = "missing"
evidence = "rope に曲げ剛性が無い (COV-SOFT-025)"
oracle_candidate = "片持ちロッドの先端たわみ PL³/3EI、小たわみ域で 1% 以内"
limitation = ""

[[item]]
id = "COV-SOFT-087"
axis = "benchmark"
item = "hanging chain against the catenary"
source = "classical catenary y = a cosh(x/a); Irvine, Cable Structures ch.1"
status = "implemented+oracle"
evidence = "src/rope.rs::Rope (add_pin + step) / tests/analytic_rope_catenary.rs::hanging_rope_settles_to_the_catenary_shape (両端 pin、総長 8 > 端点間距離 6 で静止させ、等弧長に並ぶ節点を a sinh(半径間/a)=半長 の二分法で解いた閉形式に突合、既知の質量離散化欠陥 AUD-A-S3W1-003 は全粒子に一様な定数倍なので catenary の形には影響しないことを確認した上で無視)"
oracle_candidate = ""
limitation = ""

[[item]]
id = "COV-SOFT-088"
axis = "benchmark"
item = "twisted ring buckling (Michell instability)"
source = "Bergou et al. 2008 §7.2; Michell 1889"
status = "missing"
evidence = "ねじれの自由度が無い (COV-SOFT-026)"
oracle_candidate = "閉じたロッドの臨界ねじれ角 2π√3 (参照値要確認)"
limitation = ""

[[item]]
id = "COV-SOFT-089"
axis = "benchmark"
item = "soft cube keeps its volume when dropped on the floor"
source = "NVIDIA Flex / Houdini Vellum soft-body demos"
status = "implemented+oracle"
evidence = "tests/default_configs.rs::deformable_config_default_free_cube_translates_rigidly_and_rests_on_floor (着地後の体積が 5% 以内、shape matching 0.5 が同時に効く)"
oracle_candidate = ""
limitation = ""

[[item]]
id = "COV-SOFT-090"
axis = "benchmark"
item = "effective stiffness against the iteration count (XPBD convergence)"
source = "Macklin et al. 2016 (XPBD) §6"
status = "missing"
evidence = "反復回数と剛性の関係を測る scene は無い (乗数の累積が無い COV-SOFT-038)"
oracle_candidate = "α>0 の rope に重りを吊り、反復 1 / 8 / 64 で静的伸びが同じ"
limitation = ""

[[item]]
id = "COV-SOFT-091"
axis = "solver"
item = "rigid clusters in a particle solver by shape matching (Muller 2005)"
source = "Macklin et al. 2014 (Unified Particle Physics for Real-Time Applications); NVIDIA Flex"
status = "missing"
evidence = "COV-SOFT-045 の子 src/deformable.rs::DeformableBody は別の型と step を持つ 布・rope・軟体の各 solver は既存の行が受け持つ"
oracle_candidate = "変形させた cluster が 1 step で剛体の最適回転に戻る"
limitation = ""

[[item]]
id = "COV-SOFT-092"
axis = "solver"
item = "position-based fluid in the same particle system (PBF, density constraint)"
source = "Macklin et al. 2014 (Unified Particle Physics for Real-Time Applications); NVIDIA Flex"
status = "missing"
evidence = "COV-SOFT-045 の子 粒子流体は別の型 (推測: 布・軟体と同じ粒子系の流体は 0 件)"
oracle_candidate = "静水の粒子の密度が rest density の許容内"
limitation = ""

[[item]]
id = "COV-SOFT-093"
axis = "solver"
item = "contact between particles of different kinds in one solver (cloth, rope, soft, rigid, fluid)"
source = "Macklin et al. 2014 (Unified Particle Physics for Real-Time Applications); NVIDIA Flex"
status = "missing"
evidence = "COV-SOFT-045 の子 src/cloth.rs::Cloth / src/rope.rs::Rope / src/deformable.rs::DeformableBody は互いに接触しない"
oracle_candidate = "布の上に落とした rope が布を貫かない"
limitation = ""

[[item]]
id = "COV-SOFT-094"
axis = "rod / rope / hair"
item = "guide hair strand dynamics"
source = "Selle et al. 2008"
status = "missing"
evidence = "COV-SOFT-029 の子 hair を名乗るのは風の module の doc (src/wind_zone.rs) のみで hair の型は無い"
oracle_candidate = "ガイド 1 本の静的な垂れが rod の閉形式"
limitation = ""

[[item]]
id = "COV-SOFT-095"
axis = "rod / rope / hair"
item = "interpolated hair from guide strands"
source = "Houdini Vellum hair"
status = "missing"
evidence = "COV-SOFT-029 の子 同上"
oracle_candidate = "ガイド 1 本からの補間毛が根元の座標系に追従"
limitation = ""

[[item]]
id = "COV-SOFT-096"
axis = "rod / rope / hair"
item = "hair-hair interaction (volumetric or pairwise)"
source = "Petrovic et al. 2005"
status = "missing"
evidence = "COV-SOFT-029 の子 同上"
oracle_candidate = "毛束の体積が密度の上限を超えない"
limitation = ""