btConeTwistConstraint — это тип ограничения, реализующий конусное вращение между двумя телами в физическом движке Ammo.js, основанном на Bullet Physics. Оно позволяет моделировать суставы, такие как плечо или тазобедренный сустав, где одно тело может вращаться относительно другого в пределах определённого конуса и при этом ограничено по скручиванию вокруг собственной оси.
btConeTwistConstraint работает с двумя основными элементами:
Ключевые параметры:
Пример создания конусного ограничения между двумя телами:
let frameA = new Ammo.btTransform();
frameA.setIdentity();
frameA.setOrigin(new Ammo.btVector3(0, 1, 0));
frameA.getBasis().setEulerZYX(0, 0, 0);
let frameB = new Ammo.btTransform();
frameB.setIdentity();
frameB.setOrigin(new Ammo.btVector3(0, -1, 0));
frameB.getBasis().setEulerZYX(0, 0, 0);
let coneTwist = new Ammo.btConeTwistConstraint(bodyA, bodyB, frameA, frameB);
coneTwist.setLimit(Math.PI / 4, Math.PI / 4, Math.PI / 8, 0.8, 0.3, 1.0);
physicsWorld.addConstraint(coneTwist, true);
Ограничение контролирует два типа движения:
Swing ограничивается углами swingSpan1
и swingSpan2. Эти значения формируют эллиптический конус, в
пределах которого возможно движение. Twist
контролируется углом twistSpan, предотвращая чрезмерное
скручивание.
При превышении этих пределов создаются силы, возвращающие тело в
допустимую область. Параметры limitSoftness,
biasFactor и relaxationFactor регулируют
интенсивность и мягкость этой коррекции.
limitSoftness делает движения плавнее, но снижает точность
фиксации.biasFactor и relaxationFactor нужно
увеличивать для предотвращения проскальзывания за пределы конуса.Пример более тонкой настройки:
coneTwist.setLimit(
Math.PI / 3, // swingSpan1
Math.PI / 4, // swingSpan2
Math.PI / 12, // twistSpan
0.9, // limitSoftness
0.5, // biasFactor
0.7 // relaxationFactor
);
btConeTwistConstraint может комбинироваться с другими типами ограничений:
Комбинирование ограничений позволяет создавать сложные системы
скелетной анимации или робототехники. Например, плечевой сустав можно
моделировать как btConeTwistConstraint для swing и twist, а
локтевой сустав — как btHingeConstraint.
swingSpan и twistSpan, чтобы движения
выглядели естественно.limitSoftness и relaxationFactor, чтобы
избежать «жёстких зацепов» и дрожания.btConeTwistConstraint в Ammo.js — это мощный инструмент для создания суставов с конусным ограничением вращения. Он позволяет точно контролировать swing и twist, обеспечивая реалистичную физическую симуляцию человеческих и механических соединений. Правильная настройка осей, pivot и параметров мягкости определяет качество движения и стабильность симуляции.