JiggleBone基础

本文详细介绍了JiggleBone的概念和在游戏开发中的应用,如衣物飘动和头发自然下垂。JiggleBone分为刚体和柔体两种属性,分别通过is_rigid和is_flexible实现不同效果。通过设置刚度、阻尼、约束等参数,可模拟骨骼的动态行为。此外,has_base_spring属性允许骨骼在X、Y、Z轴上的弹性移动。文章还提供了多个代码示例,帮助读者理解和实践JiggleBone技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

吐槽一句,ldo老同志辛苦建设sfm教程站,但是竟然已然半年多未曾使用过sfmJiggle Bone 的建设部分被荒废了,可恶啊!那么 Jiggle Bone 何时才能真正站起来!

莫急,这就来了。

Jiggle翻译为中文应为“抖动”, Jiggle Bone 理所应当叫做“抖动骨骼”,这个骨骼堪比如今的动态骨骼,会受到模拟重力因素的影响,同时包含骨骼约束,让骨骼可以根据父级的动作做出动态的反应。

使骨骼包含 Jiggle Bone 属性,这个方法广泛用于衣服的飘动、头发的自然下垂等场景,但由于庞杂的代码和参数,指代不清的数字和模糊的范围概念,让初学者望而却步。

在这里插入图片描述

学习视频:B站转载:

一、语句写法

$jigglebone <名称> {
	<属性组> {
		<属性> <值> 
		…
	}
}

其中 <名称> 是关节尖端的名称,要用引号括起来,例如:“jiggle_1”
属性和值之间空一格;
如果值为一个数字,则可选择用引号括起来(但不括起来也可以);
如果值为一个区间,则需要用 [ ] 方括号括起来(也可不用),例如:[45.0 45.0]

目前有四种类型的“属性组”:

is_rigid

is_flexible

has_base_spring

is_boing (仅在起源2013版本中可用)

每个组是可选的,但is_rigidis_flexible不能一起使用。has_base_springis_boing也不能一起使用。

Jiggle Bone 的本质

is_rigid
使骨骼根部可以三向旋转

is_flexible
将骨骼视为可弹性形变的弹簧,使骨骼根部可以三向旋转

has_base_spring
使骨骼根部可三向位移

is_boing
未知(字面意思是弹射)

刚度 - stiffness

通过指定刚度和阻尼值来模拟弹簧。刚度决定了弹簧的刚度。较低的值(例如 10)非常松散和脆弱,而 500 的值非常僵硬和有弹性。合法值范围为 11000

阻尼 - damping

阻尼是一种弹簧摩擦或阻力。值为零意味着弹簧将永远振荡。阻尼为 10 会使弹簧几乎立即停止振动。合法值范围为 0 到 10。

例子1:

$jigglebone "Floppy" {
	is_rigid {
		tip_mass 100
		length 20
		angle_constraint 60 
	}
}

例子2:

$jigglebone "JigglyUpAndDown" {
	is_flexible {
		yaw_stiffness 100
		yaw_damping 3
		length 20
		yaw_constraint 0 0
	}
}

例子3:

$jigglebone "Bouncy" {
	has_base_spring {
		stiffness 100 
		damping 1 
		left_constraint -20 20
		up_constraint -20 20
		forward_constraint -20 20
	}
}

例子4:

$jigglebone "FloppyAndBouncy" {
	is_rigid {
		tip_mass 100
		length 20
		angle_constraint 60 
	}

	has_base_spring {
		stiffness 100 
		damping 1 
		left_constraint -20 20
		up_constraint -20 20
		forward_constraint -20 20
	}
}

例子5:

$jigglebone "Antlion.glasswingR_bone" {
	is_flexible {
		yaw_stiffness 700
		yaw_damping 6
		pitch_stiffness 700
		pitch_damping 8
		tip_mass 5
		length 30
		angle_constraint 37
	}
}

二、属性说明

属性组1:is_rigid

这个参数赋予 Jiggle Bone 以**“刚体”**属性,它会在指定骨骼的末端放置一个模拟质量,此时骨骼的作用就像一根刚硬的棍子。因此 Jiggle Bone 仅产生旋转运动,旋转中心位于 Jiggle Bone 的底部。

属性:

length
“尖端”质量离底座有多远(以英寸为单位)。短的长度会导致剧烈的抖动。更长的长度会导致更微妙的动作。一般值为20

tip_mass
尖端受重力影响的程度。零禁用重力效果,而 1000 将是一个沉重的质量。

提示:length属性的长短决定抖动剧烈程度,可理解为单摆的长度,长度越长,受到移动带来的抖动影响越小;长度约短,受到移动带来的抖动影响越大。这个长度不是指模型骨骼的真实长度,但是骨骼的真实长度依然影响抖动的程度!(即length作为一个量,相乘骨骼真实长度后计算抖动)同时也可以通过改变骨骼根节点的位置来调整抖动的轴线位置。

提示2:tip_mass是指骨骼尖端受到重力的程度,但是这个重力的方向是RootTransform的 -Y 轴方向,如果在做动画时旋转了该模型的RootTransform,很可能会出现该模型受到的重力不再向下的情况,因此做动画时尽量不要旋转模型根节点!如果该属性的值为0,则 Jiggle Bone 骨骼不受到重力效果,而是像一个弹簧一样,会趋向于回到它(相对与父级骨骼)的原本位置。

(下面属性is_rigidis_flexible通用)

angle_constraint
指定允许的最大角度偏转,创建一个摇晃骨骼无法穿透的锥形边界。

yaw_constraint (min max)
指定沿局部偏航旋转轴允许的最小和最大角偏转。角度值不应超过 +/- 90 度。

yaw_friction
jiggle Bone 在偏航限制定义的平面上滑动时,非零值会产生摩擦力。摩擦不应超过 20 个单位。

pitch_constraint
指定沿局部俯仰旋转轴允许的最小和最大角偏转。角度值不应超过 +/- 90 度。

pitch_friction
非零值会在微动骨骼相对于由节距限制定义的平面滑动时产生摩擦力。摩擦不应超过 20 个单位。

提示:Yaw即偏航的意思,指骨骼以自身指向的方向为轴,自身滚动。Tip是骨骼尖端的意思。Mass有质量、块的意思。Pitch是俯仰的意思,指骨骼以根节点的xy轴为轴,以根节点为原点转动。

属性组2:is_flexible

这个参数赋予 Jiggle Bone 以**“柔体”**属性,它会在骨骼末端放置一个模拟质量,此时骨骼就像一根有弹性的柔性杆。因此Jiggle Bone 也同上仅产生旋转运动,旋转中心也位于 Jiggle Bone 的底部。

属性:

yaw_stiffness
弹簧在局部偏航旋转轴上的刚度。

yaw_damping
沿局部偏航旋转轴阻尼。最小值:0,最大值:10

pitch_stiffness
弹簧在局部俯仰旋转轴上的刚度。

pitch_damping
沿局部俯仰旋转轴阻尼。最小值:0,最大值:10

along_stiffness
弹簧沿弹簧轴线的刚度。仅当为此骨骼指定了“allow_length_flex”时才使用。

along_damping
沿弹簧轴阻尼。仅当为此骨骼指定了 “allow_length_flex” 时才使用。 min: 0 , max :10

allow_length_flex
通常,微动骨骼保持其长度刚性。指定此项也允许该长度弯曲。

length
“尖端”质量离底座有多远(以英寸为单位)。短的长度会导致剧烈的抖动。更长的长度会导致更微妙的动作。

tip_mass
尖端受重力影响的程度。零禁用重力效果,而 1000 将是一个沉重的质量。

提示1:stiffness是指刚度,由于这个属性组赋予了 Jiggle Bone 柔体属性,那么刚度就是表示柔体属性究竟多柔软的一个量,其中 yaw_stiffness 表示骨骼可以像拧麻花一样拧到什么程度, pitch_stiffness 表示骨骼可以被掰弯成什么程度, along_stiffness 表示骨骼可以被拉长到什么程度。而 damping 是指形变过程中的阻尼,如果阻尼很小,则形变会一瞬间到最大值,如果阻尼较大,形变会有个可见的过程。

提示2:“allow_length_flex”属性并未提到在何处声明,该属性的作用是让骨骼像弹簧一样可以拉伸。**虽然属性未声明,但是不写该声明的情况下,似乎属性仍然生效,由于along系列属性会让骨骼拉伸,不推荐使用!**否则就会出现以下情况。头发抽搐:

(此处上动图1)

(下面属性is_rigidis_flexible通用)

angle_constraint
指定允许的最大角度偏转,创建一个摇晃骨骼无法穿透的锥形边界。

yaw_constraint (min max)
指定沿局部偏航旋转轴允许的最小和最大角偏转。角度值不应超过 +/- 90 度。

yaw_friction
当 jiggle 骨骼在偏航限制定义的平面上滑动时,非零值会产生摩擦力。摩擦不应超过 20 个单位。

pitch_constraint
指定沿局部俯仰旋转轴允许的最小和最大角偏转。角度值不应超过 +/- 90 度。

pitch_friction
非零值会在微动骨骼相对于由节距限制定义的平面滑动时产生摩擦力。摩擦不应超过 20 个单位。

提示:此处属性is_rigidis_flexible通用,实际作用是角度约束。

属性组3:has_base_spring

这个参数让 Jiggle Bone 具有“弹性底座”,则会在骨骼的根部上放置一个模拟质量。这个弹簧只产生平移运动,在 XYZ 方向移动整个 Jiggle Bone (三向移动)。

属性:

stiffness
弹性底座的刚度(有多硬,越硬最大位移距离就越小)。

damping
弹性底座的阻尼。

left_constraint
允许骨骼沿自身 X 轴移动的最大量。

left_friction
当弹性底座在自身 X 轴上移动时,在过程中的摩擦系数。

up_constraint
允许骨骼沿自身 Y 轴移动的最大量。

up_friction
当弹性底座在自身 Y 轴上移动时,在过程中的摩擦系数。

forward_constraint
允许骨骼沿自身 Z 轴移动的最大量。

forward_friction
当弹性底座在自身 Z 轴上移动时,在过程中的摩擦系数。

base_mass
底座弹簧受重力影响的程度。(如果为0则效果为趋向于自动回正位移)

属性组4:is_boing 效果未知。

提示:属性有以下几种。

属性:

impact_speed

impact_angle

damping_rate

Frequency

Amplitude

以上参考Valve开发者论坛

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值