Final IK(3)——VRIK使用方法和一些小技巧

目录

一、背景

二、实现过程

1.环境

2.基操

1.给模型添加VRIK组件

 2.指定输入Transform(头、左手、右手)

二、发现问题

三、参数功能

1.分块

2.Solver

1.几个全局解算参数

2.Spine——脊柱变量,包括 头、盆骨、胸、脊柱点、根旋转

四、解决问题


 

 

一、背景

  1. 需求:接收VR端输入   头(最好是眼睛的位置)、两个手(wrist)、有需要可以再多加两个跟踪器在脚上,我这里没有。
  2. 输出:反解算出来的其他姿态。
  3. 难点:人物模型身高和现实真人身高不匹配导致相机位置异常、相机位置和头部位置的偏差。

二、实现过程

1.环境

unity2019.4.28+steam vr 2.7.3+unity商店的Kazuko人物模型

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbG92ZV9jX3M=,size_7,color_FFFFFF,t_70,g_se,x_16

2.基操

1.给模型添加VRIK组件

一般会添加后自动解析好骨骼。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbG92ZV9jX3M=,size_20,color_FFFFFF,t_70,g_se,x_16

打开References检查一下,可以看到自动引用好了。 不放心就点开检查一下。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbG92ZV9jX3M=,size_20,color_FFFFFF,t_70,g_se,x_16

 2.指定输入Transform(头、左手、右手)

①从steamvr插件里拖出[Camera Rig]预制体。

②复制一下 头、左右手的位置,只需要位置即可,下面的网格mesh要删掉。

③将复制出来的子物体拖放到 [Camera Rig]下对应的位置作为子物体。作为子物体是为了后面运行的时候能够调节跟踪点和模型的相对位置,就是这个微调很麻烦。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbG92ZV9jX3M=,size_12,color_FFFFFF,t_70,g_se,x_16

④将复制下来的副本的position清0。保留旋转。

坐标清零是为了对齐跟踪手柄和摄像机的原点,保持旋转接合原模型。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbG92ZV9jX3M=,size_20,color_FFFFFF,t_70,g_se,x_16

⑤将这几个位置作为输入,进而可以控制vr模型。

90dd600f702e41debcf2b5c7fecfe116.png

18ec06d8e2564fcbab3148613a126d13.pnge780a88a02244242bb98432a5a8d353a.png3c22083e004d4e1c8e8010e7bf7bd873.png

⑥运行即可看到效果,肯定很不理想。

二、发现问题

以上是传统的基操,但是会存在以下几个问题:

1.摄像机位置不对,具体表现为被脸或者头发挡住,因为摄像机和输入的头部位置重合,从脸内往脸外看,根本看不见外面。一般就会利用作为子物体的头部位置进行偏移校准。先运行,手动调位置,再复制,停止运行,再粘贴值。

2bb6f6a6c465444593f25f6a98b5cc7e.png

但是可能还是不能很好解决问题。

因为还有问题是,如果真人的身高比模型的高,那么摄像机位置会移出去而不是固定在模型眼睛上,所以需要后面的其他设置。

2.摄像机在一定高度移动时不会移动模型(相机游走于眼睛外),超过范围后,模型才跟着动。

3.手柄位置不对。这里可以偏移两个手的追踪位置。同上。

三、参数功能

弄明白参数效果是很重要的,不然不知道出问题去哪里调节,一顿操作猛如虎,一看战绩0-5.

1.分块

这个组件有三块。

Fix Transforms—— 默认一般都勾选的,能提升解析性能。如果为真,将在每次更新中将求解器使用的所有变换修复为其初始状态。这可以以很小的性能成本防止未动画骨骼和Animator culling的潜在问题。

References——对原模型主要关节的引用,骨骼映射。如果不是人形角色,则右键单击组件标题并选择手动填写的“自动检测引用”。胸部、颈部、肩部和脚趾骨是可选的。

VRIK 还支持无腿和无臂角色。如果您不想使用腿/手臂,将所有腿/手臂参考留空。·

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbG92ZV9jX3M=,size_11,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbG92ZV9jX3M=,size_20,color_FFFFFF,t_70,g_se,x_16

 

Solver——解算器,输入跟踪的头和双手。对原模型关节进行驱动。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbG92ZV9jX3M=,size_20,color_FFFFFF,t_70,g_se,x_16

 

 

2.Solver

1.几个全局解算参数。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbG92ZV9jX3M=,size_20,color_FFFFFF,t_70,g_se,x_16

  • IK Position Weight:求解器的权重,可以解释为多大程度按照求解器得出的结果进行驱动。
  • LOD:

        0,全质量求解

        1:肩部求解,拉伸植物脚(plantFeet)禁用,脊柱解决质量降低。这提供了大约 30% 的性能增益。

        2:剔除,但如果启用了运动,则会更新根位置和旋转。

  • plantFeet - 如果为 true,即使头部目标遥不可及,也会保持脚趾着地,因此如果头部目标太高而模型无法到达,这可能会导致相机退出头部。启用此功能会增加求解器的成本,因为必须多次求解腿。

Spine——脊柱变量,包括 头、盆骨、胸、脊柱点、根旋转:

Head:

aa8b602802294bdeb4825288e40374bd.png

引用:VRIK.solver.spine.headTarget……

headTarget-头部目标。这不应该是相机变换本身,而是作为其父级的子游戏对象(说白了就是相机为父,头骨为子),因此您可以调整其位置/旋转以匹配头骨的方向。然后将副本分配给此插槽。

positionWeight - 头部目标的位置权重。如果您已将 headTarget 设为空,则头部仍将被拉到 headTarget 的最后一个位置,直到您将此值设置为 0。

rotationWeight - 头部目标的旋转权重。

headClampWeight - 夹紧头部旋转。值 0.5 允许头部相对于 headTarget 旋转 90 度。值 0 允许 180 度,值 1 表示头部旋转将锁定到Target。

minHeadHeight - 头部距离角色根部的最小高度。(根在地板,相当于弯腰极限)

useAnimatedHeadHeightWeight - 在头部目标高度接近头部骨骼高度时,从动画继承垂直头部摆动运动,允许第三人网络化身的更自然的运动动画。

useAnimatedHeadHeightRange - 如果 abs(head target height - head bone height) < 这个值,将使用 head bone height 作为 head target Y。(如果想让相机贴着动而不是超过范围才跟着动,就设置为0)

useAnimatedHeadHeightBlend - 上面“useAnimatedHeadHeightRange”效果的衰减范围。如果头部目标高度与头部骨骼高度的距离大于 useAnimatedHeadHeightRange + animatedHeadHeightBlend,那么头部将再次垂直锁定到头部目标。(很绕,默认吧)

Pelvis——盆骨

c18241551c834b5aaf417c2d5d017428.png

pelvisTarget- 骨盆目标(可选),适用于坐着的装备,或者如果您的背包或腰带上有额外的跟踪器。设置的最佳实践是复制虚拟形象的骨盆骨骼并将其作为父项到骨盆跟踪器。然后将副本分配给此插槽。

pelvisPositionWeight - 骨盆目标的位置权重。请注意,如果您已将 pelvisTarget 设为空,骨盆仍将被拉到 pelvisTarget 的最后一个位置,直到您将此值设置为 0。

pelvisRotationWeight - 骨盆目标的旋转权重。同上head。

maintainPelvisPosition - 骨盆将保持其动画位置多少?

Chest

b3f3d789ea4943c0bf65fc7e64f062d4.png

chestGoal- 如果 chestGoalWeight 大于 0,胸部将转向这个 Transform。

chestGoalWeight - 将胸部转向 chestGoal 的权重。

 chestClampWeight - 夹紧胸部旋转。值 0.5 允许胸部相对于头部旋转 90 度。值 0 允许 180 度,值 1 表示胸部将相对于头部锁定。

 rotateChestByHands - 基于手部位置应用于胸部的旋转量。

Spine

5b0bfccbef6742c0887dc5efa3a9f75f.png

bodyPosStiffness - 确定身体跟随头部位置的程度。

bodyRotStiffness - 确定身体跟随头部旋转的程度。

neckStiffness - 确定胸部旋转到头部旋转的程度。

moveBodyBackWhenCrouching - 当玩家蹲下时,身体沿 -character.forward 轴水平移动该值。

Root Rotation

a849d22d758744d08e2593e20b888655.png

maxRootAngle - 如果头部目标转过这个角度,将自动旋转角色的根。

rootHeadingOffset - 根航向的角度偏移。调整此值以围绕垂直轴相对于 HMD 转动根。对于有时希望头像以倾斜姿势站立的格斗或射击游戏很有用。

Left Arm 手臂变量

8a0764971562420a9abe3f2c25d35315.png

bendGoal - 弯曲目标。如果 'Bend Goal Weight' > 0,肘部将朝着这个变换弯曲。

shoulderRotationMode - 肩骨旋转的不同技术。

shoulderRotationWeight - 肩部旋转的权重

shoulderTwistWeight - 当手臂抬起时向后扭转肩膀的权重。

bendGoalWeight - 如果大于 0,则将肘部朝向“弯曲目标”变换弯曲。

swivelOffset - 肘部弯曲方向的角度偏移。

wristToPalmAxis - 从手腕指向手掌的手骨局部轴。用于定义手骨方向。如果您从另一个具有不同骨骼方向的化身复制了 VRIK 组件,请右键单击 VRIK 标题并从上下文菜单中选择“猜测手部方向”。

palmToThumbAxis - 从手掌指向拇指的手骨局部轴。用于定义手部骨骼方向如果您从另一个具有不同骨骼方向的化身复制了 VRIK 组件,请右键单击 VRIK 标题并从上下文菜单中选择“猜测手部方向”。

Stretching 拉伸部分

armLengthMlp - 使用它来使手臂更短/更长。通过手和前臂局部位置的位移来工作。

stretchCurve - 通过相对于手臂长度的目标距离评估手臂的拉伸。时间 1 处的值表示到目标的距离等于臂长的点处的拉伸量。时间 2 处的值表示到目标的距离为臂长两倍处的拉伸量。值表示拉伸量。线性拉伸将通过上升 45 度的线性曲线来实现。通过将最后一个键向上和向右移动相同的量来增加拉伸范围。曲线平滑有助于减少肘部折断(在目标距离达到手臂长度之前稍微伸展手臂)。要获得该曲线的最佳最佳值,请转到“VRIK (Basic)”演示场景并从 Pilot 角色复制拉伸曲线。

Leg也是一样

c5e92d9eba5a434b951461be8fb56409.png

Locomotion

引用:VRIK.solver.locomotion.mode……

Procedural模式:

11fb65a4995e42c4a49a8e7663b5a82f.png

 footDistance - 尝试保持双腿之间的距离。

stepThreshold - 仅当步数目标位置至少离当前足迹这么远或脚不再到达当前足迹或足迹角度超过“角度阈值”时才迈出一步。

angleThreshold - 仅当步距目标位置至少距离当前足迹的“步距阈值”或脚不再到达当前足迹或足迹角度超过此值时才迈出一步。

comAngleMlp - 将质心的角度相乘 - 压力矢量的中心。如果失去平衡,较大的值会使角色更快地迈出一步。

maxVelocity - 用于预测的头部/手部目标速度的最大值。

velocityFactor - 头/手目标速度预测量。

maxLegStretch - 一条腿在被迫走到另一个位置之前可以伸展多少?1 表示完全拉伸。

rootSpeed - 将角色的根部拉向脚步的水平中点的速度。

stepSpeed - 将一只脚移动到下一个位置的速度。

stepHeight - 归一化步长(0 - 1)的脚的高度。

heelHeight - 归一化步长 (0 - 1) 后跟的高度偏移。

relaxLegTwistMinAngle - 如果理想的旋转超过此角度,则在腿不踩踏时旋转脚以放松腿的扭转旋转。

relaxLegTwistSpeed - 腿部不踩踏时脚的旋转速度,以放松腿部的扭转旋转。

stepInterpolation - 步的插值模式。

offset - 近似质心的偏移量。

Animated模式

471746b530554b1092c58ad6cc804d31.png

weight - 用于混入/混出程序或动画运动。

Move Threshold - moveThreshold - 开始移动(到 HMD 的水平距离 + HMD 速度)阈值。

minAnimationSpeed - 最小运动动画速度。

maxAnimationSpeed - 最大运动动画速度。

animationSmoothTime - Vector3.SmoothDamping 'VRIK_Horizo​​ntal' 和 'VRIK_Vertical' 参数的平滑时间。较大的值使动画更流畅,但响应性较差。

standOffset - X 和 Z 站立偏离 HMD 的水平位置。

.rootLerpSpeedWhileMoving - 移动时以该速度将根移向 HMD 的水平位置。

rootLerpSpeedWhileStopping - 在从运动状态过渡到空闲状态时,以这个速度向 HMD 的水平位置移动根。

.rootLerpSpeedWhileTurning - 在原地转动时以这个速度将根移向 HMD 的水平位置。

maxRootOffset - 从根到 HMD 的最大水平距离。

maxRootAngleMoving - 移动时从头部向前的最大根角 (ik.solver.spine.maxRootAngle)。

maxRootAngleStanding - 站立时从头部向前的最大根角 (ik.solver.spine.maxRootAngle.

四、解决问题

主要是解决相机问题。

plantFeet 的勾去掉,使得模型能够跟随头,离地。

对于比较矮的模型,需要拉长腿,能够着地。这个要看模型调节。

002b1375cb784b6889db67916266af81.png

相机要求贴近眼睛位置,所以要

20cc6ee80cad4284b39004e33cad6c0e.png

 

 五、总结

参数非常之多,而且细微的参数意思还特别难理解,需要常运行的时候调试才知道。

 

  • 18
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Unity FinalIK是一款用于实现逆向运动学(IK)效果的插件,它能够在Unity中轻松地添加并控制角色的动作,提高角色动画的真实性和流畅度。该插件的最新版本为Unity FinalIK 1.9。 Unity FinalIK提供了多种IK效果,包括全身IK、手臂IK、脚部IK等,可以适应不同类型的角色和动画需求。它还包含了自定义曲线调节、IK重定向、斜面匹配和射线遮挡等功能,可以增强动画的逼真性和自然感。 最新版本的Unity FinalIK 1.9相对于前几个版本做了一些优化和改进。首先,它提供了更高的稳定性和性能,减少了在运行时的运算负荷,使得动画播放更加流畅。其次,该版本加入了新的功能,如动态脚部IK、角色肢体和头部的延迟匹配等,使得角色动画更加真实和自然。 此外,Unity FinalIK 1.9还在输入端口方面进行了改进,增强了用户的控制和定制性。它提供了更多的参数、参数调整选项和回调函数,使得用户能够更加方便地自定义自己的动画效果。 综上所述,Unity FinalIK是一款功能强大的插件,可以帮助开发者快速实现逼真的角色动画效果。最新版本的Unity FinalIK 1.9在稳定性、性能和功能方面都有所提升,为开发者提供了更多控制和定制的可能性。 ### 回答2: Unity FinalIKUnity引擎中的一个强大的求解动画逆向运动学(IK)解决方案。它可以帮助开发者实现更真实的角色动画效果。最新版本的Unity FinalIK提供了更多的功能和改进,让开发者能够更方便地创建高质量的动画。 首先,最新版本的Unity FinalIK增加了更多的IK解算器,例如链式IK和FABRIK。开发者现在可以使用不同类型的IK解算器来实现复杂的角色运动,从而获得更加真实和流畅的动画效果。 其次,Unity FinalIK的最新版本提供了更多的约束和控制选项,例如旋转约束和转向解算器,使得开发者可以更精细地控制角色的姿势和动作。这些约束和控制选项可以帮助开发者解决一些常见的动画问题,例如避免“颤抖”和“拉伸”等现象。 此外,最新版本的Unity FinalIK还改进了算法和性能,提高了IK解算的效率和稳定性。这意味着开发者可以更快地生成和更新IK效果,而不会降低游戏的性能或产生不稳定的效果。 总而言之,最新版本的Unity FinalIK为开发者提供了更多的功能和改进,可以帮助他们创建更真实、流畅和高质量的角色动画效果。无论是制作游戏还是虚拟现实应用,Unity FinalIK都是一个强大的工具,可以提升用户体验,并帮助开发者实现他们的创意。 ### 回答3: Unity Final IKUnity的一个插件,用于实现逆运动学(IK)动画效果。最新版本是Unity Final IK 2.0。 Unity Final IK具有强大的功能,可以实现高质量和逼真的人物动画效果。它提供了多个IK解算器,包括全身IK、手臂IK、脚部IK、头部IK等。使用这些解算器,开发者可以轻松地控制角色的动作和姿势。此外,Unity Final IK还提供了多种限制器和约束,如角度限制器、位置约束器和旋转约束器,以帮助开发者更加精确地控制IK的运动范围。 其中的全身IK解算器可以让开发者实现复杂的角色运动,例如行走、跑步、跳跃等。而手臂IK和脚部IK解算器可以用于控制手臂和脚部的动作,使得角色可以进行各种动作,如抓取物体、行走和攀爬等。头部IK可以用于角色的头部跟随,使得角色的头部可以准确地面向指定的目标或朝向。 Unity Final IK还提供了许多其他功能,如目标传送、注视控制和位移控制等。这些功能都可以很方便地通过插件的编辑器来进行调整和控制。 总之,Unity Final IK是一个功能强大的逆运动学动画插件,它可以帮助开发者实现高质量和逼真的人物动画效果。通过使用其多种IK解算器和约束器,开发者可以轻松地控制角色的动作和姿势,使得游戏的角色表现更加自然和生动。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值