@@ -344,301 +344,11 @@ class "NewtonVbdSceneAPI" (
344344 doc = "Provides Newton's VBD (Vertex Block Descent) solver configuration."
345345)
346346{
347- uniform float newton:vbd:frictionEpsilon = 0.01 (
348- doc = """Threshold to smooth small relative velocities in friction computation.
349-
350- Applied to both particle and rigid body contacts. Larger values smooth friction over a
351- wider range of small relative velocities.
352-
353- Range: [0, inf)
354- Units: distance / seconds"""
355- limits = {
356- dictionary hard = {
357- float minimum = 0
358- }
359- }
360- )
361-
362- uniform bool newton:vbd:particle:selfContactEnabled = false (
363- doc = """Whether to enable self-contact detection for particles.
364-
365- The other `newton:vbd:particle:` self-contact attributes are only consulted when this is true."""
366- )
367-
368- uniform float newton:vbd:particle:selfContactRadius = 0.2 (
369- doc = """Distance at which vertex-triangle and edge-edge pairs begin to interact.
370-
371- Only consulted when `newton:vbd:particle:selfContactEnabled` is true.
372-
373- Range: [0, inf)
374- Units: distance"""
375- limits = {
376- dictionary hard = {
377- float minimum = 0
378- }
379- }
380- )
381-
382- uniform float newton:vbd:particle:selfContactMargin = 0.2 (
383- doc = """Distance at which vertex-triangle and edge-edge pairs are considered for contact generation.
384-
385- Should be larger than `newton:vbd:particle:selfContactRadius` to avoid missing contacts.
386- Only consulted when `newton:vbd:particle:selfContactEnabled` is true.
387-
388- Range: [0, inf)
389- Units: distance"""
390- limits = {
391- dictionary hard = {
392- float minimum = 0
393- }
394- }
395- )
396-
397- uniform float newton:vbd:particle:conservativeBoundRelaxation = 0.85 (
398- doc = """Relaxation factor for conservative penetration-free projection.
399-
400- Lower values improve stability but slow convergence.
401-
402- Range: [0, 1]
403- Units: dimensionless"""
404- limits = {
405- dictionary hard = {
406- float minimum = 0
407- float maximum = 1
408- }
409- }
410- )
411-
412- uniform int newton:vbd:particle:collisionDetectionInterval = 0 (
413- doc = """Frequency of particle self-contact detection.
414-
415- A value less than 0 runs detection once before initialization. A value of 0 runs it twice:
416- once before and once after initialization. A value n >= 1 runs it before every n iterations.
417- Only consulted when `newton:vbd:particle:selfContactEnabled` is true.
418-
419- Range: [-1, inf)
420- Units: dimensionless"""
421- )
422-
423- uniform float newton:vbd:particle:edgeParallelEpsilon = 1e-5 (
424- doc = """Threshold to detect near-parallel edges in edge-edge collision handling.
425-
426- Only consulted when `newton:vbd:particle:selfContactEnabled` is true.
427-
428- Range: [0, inf)
429- Units: dimensionless"""
430- limits = {
431- dictionary hard = {
432- float minimum = 0
433- }
434- }
435- )
436-
437- uniform int newton:vbd:particle:topologicalContactFilterThreshold = 2 (
438- doc = """Maximum topological distance, in rings, under which candidate self-contacts are discarded.
439-
440- Higher values tolerate contacts between more closely connected mesh elements. Values larger
441- than 3 significantly increase computation time. Only consulted when
442- `newton:vbd:particle:selfContactEnabled` is true.
443-
444- Range: [0, inf)
445- Units: dimensionless"""
446- limits = {
447- dictionary hard = {
448- int minimum = 0
449- }
450- }
451- )
452-
453- uniform float newton:vbd:particle:restShapeContactExclusionRadius = 0.0 (
454- doc = """Rest separation below which topologically close candidate contacts are ignored.
455-
456- Evaluated in the rest configuration. Only consulted when
457- `newton:vbd:particle:selfContactEnabled` is true.
458-
459- Range: [0, inf)
460- Units: distance"""
461- limits = {
462- dictionary hard = {
463- float minimum = 0
464- }
465- }
466- )
467-
468- uniform float newton:vbd:rigid:avbdAlpha = 0.95 (
469- doc = """C0 stabilization strength for AVBD constraints (C_stab = C - alpha * C0).
470-
471- Used as the default for joints and body-body contacts unless overridden by
472- `newton:vbd:rigid:avbdJointAlpha` or `newton:vbd:rigid:avbdContactAlpha`.
473-
474- Range: [0, 1]
475- Units: dimensionless"""
476- limits = {
477- dictionary hard = {
478- float minimum = 0
479- float maximum = 1
480- }
481- }
482- )
483-
484- uniform float newton:vbd:rigid:avbdJointAlpha = -inf (
485- doc = """Joint-specific override for the AVBD C0 stabilization strength.
486-
487- If set to -inf, `newton:vbd:rigid:avbdAlpha` is used instead.
488-
489- Range: [0, 1]
490- Units: dimensionless"""
491- limits = {
492- dictionary soft = {
493- float minimum = 0
494- float maximum = 1
495- }
496- }
497- )
498-
499- uniform float newton:vbd:rigid:avbdContactAlpha = -inf (
500- doc = """Body-body contact override for the AVBD C0 stabilization strength.
501-
502- If set to -inf, `newton:vbd:rigid:avbdAlpha` is used instead.
503-
504- Range: [0, 1]
505- Units: dimensionless"""
506- limits = {
507- dictionary soft = {
508- float minimum = 0
509- float maximum = 1
510- }
511- }
512- )
513-
514- uniform float newton:vbd:rigid:avbdBeta = 0.0 (
515- doc = """Penalty stiffness ramp rate for AVBD constraints.
516-
517- Each iteration the penalty stiffness is incremented by this rate times the constraint
518- violation, then clamped to its stiffness ceiling (k = min(k_max, k + beta * |C|)). A value
519- of 0 disables ramping (fixed penalty stiffness). This single value feeds both the linear and
520- angular ramps, which have different units (force / (distance * distance) and
521- torque / (radian * radian)), so it carries no single physical unit. Use
522- `newton:vbd:rigid:avbdLinearBeta` and `newton:vbd:rigid:avbdAngularBeta` for unit-correct
523- tuning.
524-
525- Range: [0, inf)
526- Units: mixed (feeds both linear and angular ramps)"""
527- limits = {
528- dictionary hard = {
529- float minimum = 0
530- }
531- }
532- )
533-
534- uniform float newton:vbd:rigid:avbdLinearBeta = -inf (
535- doc = """Linear override for the AVBD penalty ramp rate.
536-
537- The linear penalty stiffness is incremented each iteration by this rate times the linear
538- constraint violation. If set to -inf, `newton:vbd:rigid:avbdBeta` is used instead.
539-
540- Range: [0, inf)
541- Units: force / (distance * distance)"""
542- limits = {
543- dictionary soft = {
544- float minimum = 0
545- }
546- }
547- )
548-
549- uniform float newton:vbd:rigid:avbdAngularBeta = -inf (
550- doc = """Angular override for the AVBD penalty ramp rate.
551-
552- The angular penalty stiffness is incremented each iteration by this rate times the angular
553- constraint violation. If set to -inf, `newton:vbd:rigid:avbdBeta` is used instead.
554-
555- Range: [0, inf)
556- Units: torque / (radian * radian)"""
557- limits = {
558- dictionary soft = {
559- float minimum = 0
560- }
561- }
562- )
563-
564- uniform float newton:vbd:rigid:avbdGamma = 0.999 (
565- doc = """Per-step decay factor for penalty stiffness and persisted hard-mode lambda.
566-
567- Lower values decay faster, improving stability at the cost of slower convergence.
568-
569- Range: [0, 1]
570- Units: dimensionless"""
571- limits = {
572- dictionary hard = {
573- float minimum = 0
574- float maximum = 1
575- }
576- }
577- )
578-
579347 uniform bool newton:vbd:rigid:contactHistory = false (
580348 doc = """Whether to persist body-body contact state across steps for warm-starting."""
581349 )
582350
583- uniform float newton:vbd:rigid:contactStickMotionEps = 1e-4 (
584- doc = """Tangential contact residual threshold for marking body-body contacts as sticking.
585-
586- A value of 0 disables sticky flags while preserving penalty warm-starting.
587-
588- Range: [0, inf)
589- Units: distance"""
590- limits = {
591- dictionary hard = {
592- float minimum = 0
593- }
594- }
595- )
596-
597- uniform float newton:vbd:rigid:contactStickFreezeTranslationEps = 1e-4 (
598- doc = """World-space translation threshold for the deadzone snap on sticking contacts.
599-
600- A value of 0 disables translation snapping.
601-
602- Range: [0, inf)
603- Units: distance"""
604- limits = {
605- dictionary hard = {
606- float minimum = 0
607- }
608- }
609- )
610-
611- uniform float newton:vbd:rigid:contactStickFreezeAngularEps = 1e-4 (
612- doc = """Angular threshold for the deadzone snap on sticking contacts.
613-
614- A value of 0 disables angular snapping.
615-
616- Range: [0, inf)
617- Units: radians"""
618- limits = {
619- dictionary hard = {
620- float minimum = 0
621- }
622- }
623- )
624-
625- uniform float newton:vbd:rigid:contactKStart = 100.0 (
626- doc = """Body-body and body-particle contact penalty seed for AVBD ramping.
627-
628- Inert unless the linear beta (`newton:vbd:rigid:avbdLinearBeta`, or the
629- `newton:vbd:rigid:avbdBeta` fallback) is greater than zero; otherwise the penalty stiffness
630- is fixed at the contact stiffness.
631-
632- Range: [0, inf)
633- Units: force / distance"""
634- limits = {
635- dictionary hard = {
636- float minimum = 0
637- }
638- }
639- )
640-
641- uniform float newton:vbd:rigid:jointLinearKe = 100000.0 (
351+ uniform float newton:vbd:rigid:jointLinearStiffness = 100000.0 (
642352 doc = """Penalty stiffness ceiling for structural linear joint constraints.
643353
644354 Range: [0, inf)
@@ -650,7 +360,7 @@ class "NewtonVbdSceneAPI" (
650360 }
651361 )
652362
653- uniform float newton:vbd:rigid:jointAngularKe = 100000.0 (
363+ uniform float newton:vbd:rigid:jointAngularStiffness = 100000.0 (
654364 doc = """Penalty stiffness ceiling for structural angular joint constraints.
655365
656366 Range: [0, inf)
@@ -662,57 +372,23 @@ class "NewtonVbdSceneAPI" (
662372 }
663373 )
664374
665- uniform float newton:vbd:rigid:jointLinearKStart = 100.0 (
666- doc = """Linear joint penalty seed for AVBD ramping.
667-
668- Inert unless the linear beta is greater than zero; otherwise the penalty stiffness is fixed
669- at `newton:vbd:rigid:jointLinearKe`.
375+ uniform float newton:vbd:rigid:jointLinearDamping = 0.0 (
376+ doc = """Absolute damping coefficient for linear joint constraints.
670377
671378 Range: [0, inf)
672- Units: force / distance"""
673- limits = {
674- dictionary hard = {
675- float minimum = 0
676- }
677- }
678- )
679-
680- uniform float newton:vbd:rigid:jointAngularKStart = 10.0 (
681- doc = """Angular joint penalty seed for AVBD ramping.
682-
683- Inert unless the angular beta is greater than zero; otherwise the penalty stiffness is fixed
684- at `newton:vbd:rigid:jointAngularKe`.
685-
686- Range: [0, inf)
687- Units: torque / radian"""
688- limits = {
689- dictionary hard = {
690- float minimum = 0
691- }
692- }
693- )
694-
695- uniform float newton:vbd:rigid:jointLinearKd = 0.0 (
696- doc = """Stiffness-proportional Rayleigh damping coefficient for linear joint constraints.
697-
698- Scales the linear penalty stiffness to form the damping term, so it has units of time.
699-
700- Range: [0, inf)
701- Units: seconds"""
379+ Units: force * time / distance"""
702380 limits = {
703381 dictionary hard = {
704382 float minimum = 0
705383 }
706384 }
707385 )
708386
709- uniform float newton:vbd:rigid:jointAngularKd = 0.0 (
710- doc = """Stiffness-proportional Rayleigh damping coefficient for angular joint constraints.
711-
712- Scales the angular penalty stiffness to form the damping term, so it has units of time.
387+ uniform float newton:vbd:rigid:jointAngularDamping = 0.0 (
388+ doc = """Absolute damping coefficient for angular joint constraints.
713389
714390 Range: [0, inf)
715- Units: seconds """
391+ Units: torque * time / radian """
716392 limits = {
717393 dictionary hard = {
718394 float minimum = 0
0 commit comments