Module skeleton
骨骼模块,包含结点、长度约束和角度约束 运作物理特性
Functions
lerp (a, b, t) | 线性插值 |
link (length_min, length_max, speed, exponential, drag) | 生成一个长度约束的表,可以用来把两个结点连接到一起. |
constraint (fixed, moving, angle_min, angle_max, speed, exponential, drag) | 生成一个角度约束的表,用来限制和某个结点相连的两个其他结点的角度. |
Joint:new (pos) | 创建一个结点 |
Joint:add_neighbor (joint, link) | 添加邻居结点. |
Joint:remove_neighbor (joint) | 移除邻居结点 |
Joint:add_mutual_neighbor (joint, link) | 添加相互的邻居结点 |
Joint:remove_mutual_neighbor (joint) | 移除相互的邻居结点 |
Joint:add_constraint (constraint) | 添加角度约束 |
Joint:remove_constraint (constraint) | 移除角度约束 |
Joint:add_influence (joint, t) | 添加对其他结点的影响. |
Joint:clear_influence () | 清除影响 |
Joint:get_influence (joint) | 获取某邻居对自身的影响 |
Joint:update_pos () | 根据影响更新自己的位置. |
Joint:update_drag () | 根据影响中的拖拽因素更新自己的位置. |
Joint:update_self () | 根据影响更新位置,考虑拖拽,并清除影响 |
Joint:influence_lengths (without, time) | 考虑长度约束条件,对邻居结点施加影响 |
Joint:influence_constraints (without, time) | 考虑角度约束条件,对邻居结点施加影响 |
Joint:influence_all (without, time) | 考虑长度和角度约束条件,对邻居结点施加影响 |
Joint:influence_recursive (without, time) | 递归对邻居节点施加影响. |
Functions
- lerp (a, b, t)
-
线性插值
Parameters:
- a 起始值
- b 终止值
- t 时间/位置,取0时返回a,取1时返回b
- link (length_min, length_max, speed, exponential, drag)
-
生成一个长度约束的表,可以用来把两个结点连接到一起.
使用 fabrik 算法,详见参考:
https://github.com/lincerely/gecko/tree/master
https://sean.cm/a/fabrik-algorithm-2d
Parameters:
- length_min
- length_max
- speed
一端结点移动时,另一端结点最大的移动速度。非
exponential
的情况下,为像素/秒,而exponential
的情况下,为相对值 - exponential 是否让移动速度随距离指数型衰减,效果更有弹力
- drag 0~1 值,一端移动会带动另一端以相同方式移动
Returns:
-
table, 可以用来给 Joint:add_neighbor 使用
- constraint (fixed, moving, angle_min, angle_max, speed, exponential, drag)
-
生成一个角度约束的表,用来限制和某个结点相连的两个其他结点的角度.
使用 fabrik 算法,详见参考:
https://github.com/lincerely/gecko/tree/master
https://sean.cm/a/fabrik-algorithm-2d
Parameters:
- fixed 作为参考的结点,这个约束只会控制以下的 moving 结点
- moving 受控制的结点
- angle_min 角度下限(弧度)
- angle_max 角度上限(弧度)
- speed 速度(类似 link)
- exponential 指数衰减(类似 link)
- drag 拖拽(类似 link)
Returns:
-
table, 可以用来给 Joint:add_constraint 使用
- Joint:new (pos)
-
创建一个结点
Parameters:
- pos 初始位置,默认为 (0, 0)
- Joint:add_neighbor (joint, link)
-
添加邻居结点.
这个只是单向的,一般肯定要添加双向的,请用Joint:add_mutual_neighbor
Parameters:
- joint 邻居结点
- link 长度约束
See also:
- Joint:remove_neighbor (joint)
-
移除邻居结点
Parameters:
- joint 邻居结点
- Joint:add_mutual_neighbor (joint, link)
-
添加相互的邻居结点
Parameters:
- joint 邻居结点
- link 长度约束
See also:
- Joint:remove_mutual_neighbor (joint)
-
移除相互的邻居结点
Parameters:
- joint 邻居结点
- Joint:add_constraint (constraint)
-
添加角度约束
Parameters:
- constraint
See also:
- Joint:remove_constraint (constraint)
-
移除角度约束
Parameters:
- constraint 需要和添加的时候是同一个表
- Joint:add_influence (joint, t)
-
添加对其他结点的影响.
影响可以包含
pos
,drag_translate
,drag_rotate
属性。 每次更新时,首先会计算邻居的影响,再将各影响平均,最后得到最终位置该系列函数较底层,一般不会用到
Parameters:
- joint 需要和添加的时候是同一个表
- t 需要和添加的时候是同一个表
- Joint:clear_influence ()
- 清除影响
- Joint:get_influence (joint)
-
获取某邻居对自身的影响
Parameters:
- joint 邻居
- Joint:update_pos ()
- 根据影响更新自己的位置. 较底层,一般不会用到
- Joint:update_drag ()
- 根据影响中的拖拽因素更新自己的位置. 较底层,一般不会用到
- Joint:update_self ()
- 根据影响更新位置,考虑拖拽,并清除影响
- Joint:influence_lengths (without, time)
-
考虑长度约束条件,对邻居结点施加影响
Parameters:
- without 要忽略的邻居结点
- time 经过的时间长度
- Joint:influence_constraints (without, time)
-
考虑角度约束条件,对邻居结点施加影响
Parameters:
- without 要忽略的邻居结点
- time 经过的时间长度
- Joint:influence_all (without, time)
-
考虑长度和角度约束条件,对邻居结点施加影响
Parameters:
- without 要忽略的邻居结点
- time 经过的时间长度
- Joint:influence_recursive (without, time)
-
递归对邻居节点施加影响.
该函数是主要使用的函数。
例如让头运动带动身体,可以先改变头结点的坐标,然后让头结点递归施加影响,就带动了连接的身体结点。
Parameters:
- without 要忽略的邻居结点
- time 经过的时间长度