datetime:2025/12/28 12:25
author:nzb
该项目来源于mujoco_learning
composite 复合体 (3.2.7及以前版本)
复合体可以仿真,body集合,软体,布料,鱼网等。本质上是一堆微小几何体组合形成的新型结构。
prefix="name"
和name相同也就是names,prefix表示整个复合体的命名索引,具体复合体中的body名称为name+B+(坐标),比如坐标为(1,2)那body的name就是nameB1_2)
type=[particle,grid,cable(代替后两个),rope(弃用),loop(弃用),cloth(弃用,使用 grid代替布料),box,cylinder,ellipsoid]
particle粒子集合
grid网格 1 D或者 2 D,也代替布料,绳子
box立方体集合,可以做成软体立方体。
count=" 0 0 0 "
复合体的排列数量和方式,分别对应三个方向上的数量)
spacing=""
复合体排列中,两个小 body之间距离
offset=" 000 "
相当于整个复合体的空间坐标
joint=[main,twist,stretch,particle]
复合体活动类型
pin-coord=""
复合体固定位置
演示:
1. 粒子集合
<composite type="particle" prefix="bullet" count="5 5 10" spacing="0.01" offset="1 1 2">
<geom type="sphere" size="0.0084" material="green_grapes" mass="0.0032" />
<joint kind="particle" type="free" />
</composite>
这里是创建了一个 5 5 10 的小弹丸集合,命名为 bullet,joint添加 particle是给粒
子用的,free就是代表可以自由碰撞。
2. 绳
<composite type="grid" prefix="C" count="10 1 1" spacing="0.1" offset="1 1 2">
<geom type="sphere" size="0.0084" material="green_grapes" mass="0.0032" />
<joint kind="twist" type="free" />
</composite>
这里可以使用 grid,这是给 1 D和 2 D集合体使用的,可以仿真一节一节类似线的集合。
注意这里 1 D的仿真的 count。joint的 twist是给这类复合体使用的,也可以不加入
joint。
3. 悬挂鱼网
<composite type="grid" prefix="C" count="10 10 1" spacing="0.1" offset="1 1 2">
<geom type="sphere" size="0.0084" material="green_grapes" />
<pin coord="0 0"/>
<pin coord="0 9"/>
<joint kind="twist" type="free" />
</composite>
这里我们还是使用 grid,创造了一个 10 * 10 的网,网格间距为 0. 1 ,通过 pin的作用是
固定网面上的( 0 , 0 )和( 0 , 9 )点让网悬挂起来。
4. 布料
<composite type="grid" count="5 5 1" spacing="0.6" offset="0 0 3">
<skin texcoord="true" material="plane" inflate="0.01" subgrid="3" />
<pin coord="0 0" />
<pin coord="4 0" />
<geom size="0.1" />
<joint kind="main" damping="5" />
</composite>
这里仍然使用的是 grid,但是加入了 skin,这可以使整个网的表面联合起来,形成布料
的效果,这里的 count和 spacing会影响布的“密度”,密度越大越不容易活动。
skin中texcoord是影响纹理可视化的,inflate类似厚度,负值可以直接穿过布料。正
值表示布料比较厚,对于碰撞影响较大。subgrid越高渲染等级越高,建议不要大于 3 。
flex(新版3.3.0及以后)
name=""
复合体固定位置
dim=""
维度,可以写1,2,3。在 1D 中,元素是胶囊,在 2D 中,元素是 具有半径的三角形,在 3D 中,元素是具有(可选)半径的四面体。
radius=""
所有 flex 元素的半径。它在 3D 中可以为零,但在 1D 和 2D 中必须为正。半径会影响两者 碰撞检测和渲染。在 1D 和 2D 中,需要使单元具有体积。
body="string"
定点元素名
material=""
材质
rgba=""
颜色
flex/edge
边缘弯曲的阻尼和刚度
stiffness="0"
damping="0"
flex/elasticity
有限元参数
young="0"
杨式模量
poisson="0"
柏松比
damping="0"
该量缩放由 Young 模量定义的刚度,以生成阻尼矩阵。
thickness="-1"
壳厚,长度单位;仅适用于二手 2D 弯曲。用于缩放拉伸刚度。 此厚度可以设置为等于半径的 2 倍,以匹配几何体, 但会单独显示,因为半径可能受到与碰撞检测相关的注意事项的限制。
elastic2d="[none, bend, stretch, both]"
该参数在3.3.3及以后版本使用,对 2D 弯曲的被动力的弹性贡献。“none”: 无, “bend”: 仅弯曲, “stretch”: 仅拉伸, “both”: 弯曲和拉伸。
flex/contact
internal="false"
启用或禁用内部碰撞
selfcollide="auto" [none, narrow, bvh, sap, auto]
启用或禁用内部碰撞
flexcomp
name=""
生成命名
dim=""
维度,可以写1,2,3。在 1D 中,元素是胶囊,在 2D 中,元素是 具有半径的三角形,在 3D 中,元素是具有(可选)半径的四面体。
dof="full" [full, radial, trilinear]
弯曲自由度 (dof) 的参数化。
type="grid" [grid, box, cylinder, ellipsoid, disc, circle, mesh, gmsh, direct]
有限元子对象类型
count=""
每个维度中自动生成的点的数量。this 和 next 属性仅适用于类型网格, box、cylinder、ellipsoid。
spacing=""
每个维度中自动生成的点之间的间距。间距应足够大 与半径相比,以避免永久接触。
mass=""
总质量,每个自动生成的实体的质量等于该值除以点数。
inertiabox=""
每个点的旋转惯性,此处为对角线。
file=""
从中加载曲面(三角形)或体积(四面体)网格的文件的名称。可以是stl,obj,gmsh格式
rigid="false"
如果为 true,则所有点都对应于父形体中的顶点,并且不会创建新形体。这是 等效于固定所有点。请注意,如果所有点都确实被固定,模型编译器将检测到 Flex 是刚性的(在碰撞检测中表现为非凸面网格)。
pos=""
位置
quat,axisangle, xyaxes, zaxis, euler=""
旋转
scale=""
点坐标缩放,宏观就是尺寸缩放
flexcomp/edge
边缘弯曲的阻尼和刚度
stiffness="0"
damping="0"
equality="false" [true, false]
约束边缘
flexcomp/pin
固定body/grid
id=""
位置
range="int(2 * n)"
位置
grid="int(dim * n)"
位置
gridrange="int(2 dim n)"
位置