Тряпичная кукла (ragdoll) — это составная физическая модель персонажа, состоящая из набора твёрдых тел, соединённых ограничениями (joints). В библиотеке Oimo.js такая модель строится на основе:
Ключевая идея — разложение персонажа на сегменты (голова, туловище, плечи, предплечья, бедра, голени), каждый из которых является отдельным динамическим телом. Суставы моделируются шарнирными соединениями с угловыми ограничениями.
Перед построением куклы инициализируется физический мир:
const world = new OIMO.World({
timestep: 1 / 60,
iterations: 8,
broadphase: 2,
worldscale: 1,
random: true,
info: false,
gravity: [0, -9.8, 0]
});
Ключевые параметры:
timestep — шаг симуляции;iterations — количество итераций решателя
ограничений;gravity — вектор гравитации.Для стабильной тряпичной куклы важно увеличить
iterations (например, 8–12), чтобы суставы не
“разваливались” под нагрузкой.
Каждый сегмент реализуется как динамическое тело:
function createBody(size, position) {
return world.add({
type: "box",
size: size,
pos: position,
move: true,
density: 1,
friction: 0.4,
restitution: 0.1
});
}
const torso = createBody([0.5, 1.0, 0.3], [0, 5, 0]);
const head = createBody([0.4, 0.4, 0.4], [0, 6.2, 0]);
const leftUpperArm = createBody([0.3, 0.6, 0.3], [-0.7, 5.5, 0]);
const leftLowerArm = createBody([0.25, 0.6, 0.25], [-0.7, 4.7, 0]);
const rightUpperArm = createBody([0.3, 0.6, 0.3], [0.7, 5.5, 0]);
const rightLowerArm = createBody([0.25, 0.6, 0.25], [0.7, 4.7, 0]);
Для реалистичной физики:
Это регулируется параметром density или напрямую через
mass.
В Oimo.js используются различные типы соединений. Для тряпичной куклы наиболее важны:
world.add({
type: "jointBall",
body1: torso,
body2: leftUpperArm,
pos1: [-0.4, 0.4, 0],
pos2: [0, 0.3, 0],
collision: false
});
Для реалистичности движения добавляются лимиты:
world.add({
type: "jointHinge",
body1: leftUpperArm,
body2: leftLowerArm,
axe1: [1, 0, 0],
axe2: [1, 0, 0],
pos1: [0, -0.3, 0],
pos2: [0, 0.3, 0],
min: -90,
max: 0,
collision: false
});
min и max задают диапазон вращения (в градусах).
Полная тряпичная кукла включает:
Каждый сустав должен иметь:
collision: false);Тряпичная кукла подвержена нестабильности. Основные методы стабилизации:
iterations: 12
body.linearVelocity.limit(10);
body.angularVelocity.limit(10);
body.linearDamping = 0.1;
body.angularDamping = 0.1;
Демпфирование снижает дрожание суставов.
Чаще всего визуализация выполняется через Three.js.
После каждого шага симуляции:
world.step();
mesh.position.copy(body.getPosition());
mesh.quaternion.copy(body.getQuaternion());
Физика полностью управляет положением и ориентацией мешей.
При создании пола:
world.add({
type: "box",
size: [20, 1, 20],
pos: [0, -0.5, 0],
move: false
});
Кукла падает под действием гравитации и взаимодействует с поверхностью.
Для более реалистичного поведения:
friction);restitution);Тряпичная кукла может получать внешние импульсы:
torso.applyImpulse([0, 5, 0], [0, 0, 0]);
Или силы:
torso.applyForce([10, 0, 0], [0, 0, 0]);
Это используется для:
Гибридная схема:
Каждая кость имеет соответствующий RigidBody. После
активации физики кости начинают копировать трансформации тел.
Для правдоподобности:
Пример ограничения бедра:
min: -45,
max: 45
Неверные диапазоны приводят к неестественным позам.
Тряпичная кукла содержит 10–15 тел и 10–14 суставов. При большом количестве персонажей:
iterations;sleep);body.allowSleep = true;
Спящие тела не участвуют в расчётах до получения импульса.
Причина: низкое число итераций или слишком большая масса.
Решается увеличением демпфирования и уменьшением
timestep.
Причина: пересечение коллизионных форм.
Для конечностей лучше использовать капсулы:
type: "capsule"
Это снижает зацепления при падении.
Можно вручную корректировать распределение массы, чтобы кукла падала реалистично.
Использование DistanceJoint для стабилизации плечевого
пояса.
Тряпичная кукла в Oimo.js представляет собой сложную систему взаимосвязанных тел, поведение которой определяется физическим решателем ограничений. Грамотная настройка масс, лимитов вращения и параметров симуляции позволяет добиться устойчивой и реалистичной модели персонажа.