在Blender中使用代码控制人物模型的嘴部动作 - 嘴部张开

flyfish
环境
无需iphone,不限制平台

原始的3D模型

控制之后的样子

3D模型部分

中英文对照


此次使用的是形态键(Shape Keys)控制,
如果遇到Blendshapes,Morphs,Morphtargets,Sliders也都是形态键的意思

eyeBlinkLeft 左眼眨眼
eyeLookDownLeft 左眼目视下方
eyeLookInLeft   左眼注视鼻尖
eyeLookOutLeft  左眼向左看
eyeLookUpLeft   左眼目视上方
eyeSquintLeft   左眼眯眼
eyeWideLeft 左眼睁大
eyeBlinkRight   右眼眨眼
eyeLookDownRight    右眼目视下方
eyeLookInRight  右眼注视鼻尖
eyeLookOutRight 右眼向左看
eyeLookUpRight  右眼目视上方
eyeSquintRight  右眼眯眼
eyeWideRight    右眼睁大
jawForward  努嘴时下巴向前
jawLeft 撇嘴时下巴向左
jawRight    撇嘴时下巴向右
jawOpen 张嘴时下巴向下
mouthClose  闭嘴
mouthFunnel 稍张嘴并双唇张开
mouthPucker 抿嘴
mouthLeft   向左撇嘴
mouthRight  向右撇嘴
mouthSmileLeft  左撇嘴笑
mouthSmileRight 右撇嘴笑
mouthFrownLeft  左嘴唇下压
mouthFrownRight 右嘴唇下压
mouthDimpleLeft 左嘴唇向后
mouthDimpleRight    右嘴唇向后
mouthStretchLeft    左嘴角向左
mouthStretchRight   右嘴角向右
mouthRollLower  下嘴唇卷向里
mouthRollUpper  下嘴唇卷向上
mouthShrugLower 下嘴唇向下
mouthShrugUpper 上嘴唇向上
mouthPressLeft  下嘴唇压向左
mouthPressRight 下嘴唇压向右
mouthLowerDownLeft  下嘴唇压向左下
mouthLowerDownRight 下嘴唇压向右下
mouthUpperUpLeft    上嘴唇压向左上
mouthUpperUpRight   上嘴唇压向右上
browDownLeft    左眉向外
browDownRight   右眉向外
browInnerUp 蹙眉
browOuterUpLeft 左眉向左上
browOuterUpRight    右眉向右上
cheekPuff   脸颊向外
cheekSquintLeft 左脸颊向上并回旋
cheekSquintRight    右脸颊向上并回旋
noseSneerLeft   左蹙鼻子
noseSneerRight  右蹙鼻子
tongueOut   吐舌头

上述名字可以和自己模型中的名字进行对应 例如eyeBlink_L就是EyeBlinkLeft
这里定义左右是对于3D人物模型的左右。例如3D人物模型的eyeBlinkRight,我们看到的实际在左边。
数值说明以张嘴为例,数值是浮点类型值,张嘴程度值的范围为[0,1],0表示没有张嘴,1表示完全张嘴。
代码部分

根据人脸关键点计算嘴部纵横比,将结果赋值给JawOpen
根据已经定义好的jawOpen,代码可以这样控制嘴部

import bpyob=bpy.data.objects['Body']
shape_keys = ob.data.shape_keys.key_blocks
shape_keys['jawOpen'].value = x
shape_keys['jawOpen'].keyframe_insert(data_path='value')

如何通过关键点计算x的值呢
x的数值是浮点类型值,张嘴程度值的范围为[0,1],0表示没有张嘴,1表示完全张嘴
这里需要用到两个shape key,先使用一个jawOpen

大图在这里https://flyfish.blog.csdn.net/article/details/122448347 下载下来看

def mouth_aspect_ratio(image_points):p1 = image_points[78]p2 = image_points[81]p3 = image_points[13]p4 = image_points[311]p5 = image_points[308]p6 = image_points[402]p7 = image_points[14]p8 = image_points[178]mar = np.linalg.norm(p2-p8) + np.linalg.norm(p3-p7) + np.linalg.norm(p4-p6)mar /= (2 * np.linalg.norm(p1-p5) + 1e-6)return mar

嘴部纵横比的值肯定会有大于1的情况,而这里3D模型限制最大值是1。也可以根据3D模型和嘴部纵横比再调整下。
这样将每次检测出的关键点,计算出嘴部纵横比赋值给模型就可以了。

参考网址 动图展示各个Shape Key的样子和3D的样子

https://arkit-face-blendshapes.com/
https://hinzka.hatenablog.com/entry/2021/12/21/222635
https://developer.apple.com/documentation/arkit/arfaceanchor/blendshapelocation

在Blender中使用代码控制人物模型的嘴部动作 - 嘴部张开相关推荐

  1. 在Blender中使用代码控制人物模型的眼部动作 - 睁眼与闭眼

    在Blender中使用代码控制人物模型的眼部动作 - 睁眼与闭眼 flyfish 眼睛eyeBlink_R闭眼的数值分别是0.0.5.1.而眼睛的纵横比与之相反,眼睛的纵横比越大,眼睛睁的越大. 眼睛 ...

  2. 在Blender中使用代码控制人物模型的头部姿态 - 代码实践mediapipe版本

    在Blender中使用代码控制人物模型的头部姿态 - 代码实践mediapipe版本 flyfish MediaPipe的FaceMesh能够检测468个人脸关键点,这里使用此组件驱动头部动作.本文最 ...

  3. Blender图解教程:Lowpoly人物模型

    Blender图解教程:Lowpoly人物模型

  4. unity 关闭自己脚本_unity中使用代码控制脚本的开启和关闭 enabled

    学习中遇到了使用enabled 来控制脚本的开关,中间遇到了一些问题,记录一下,以便遇到类似问题的新手同学少走弯路. 在想使用代码控制脚本的开启和关闭的时候,网上搜索到的解决方案是这样的: GameO ...

  5. unity中通过代码控制游戏中画质

    最近在开发项目的时候突然想到可以添加一个调整画质的按钮或者DropDown或者Slider的UI来控制游戏中的画质 因为我之前写过一篇关于DropDown的使用方法的博客 DropDown的使用方法地 ...

  6. C#中通过代码控制IIS服务重启

    C#中控制IIS服务停止 ServiceController sc = new ServiceController("iisadmin"); if(sc.Status=Servic ...

  7. Blender建模练习:初次人物模型多边形建模(1)

    你好!欢迎来到Vicky的空间 本文基于Blender2.82 图片:第一次建模,虽然有点丑,但对于从来没有接触过这方面的我来说,还是看的过去的了. 居中的图片: 这个手指很有特点,每一根都不一样. ...

  8. unity中触屏控制人物移动

    例如在飞机大战中,让战机随手指移动而移动 public class Hero : MonoBehaviour {private bool isMouseDown = false;private Vec ...

  9. ubuntu20.04_ROS中运行gazebo控制机器人模型报错

    1.无法启动类型为[controller_ manager/spawner]的节点:controller_ manager ERROR: cannot launch node of type [con ...

最新文章

  1. Android开发艺术探索》读书笔记 (8) 第8章 理解Window和WindowManager
  2. Sublime Text Version 3.0,Build3143注册码
  3. C语言 socket shutdown()函数(将与 sockfd 关联的套接字上的全双工连接全部或部分关闭)
  4. 为什么发了个博客分分钟被各种网站花式转载=。=而不通知我
  5. springboot问题Description Resource Path Location Type Java compiler level does not match the version o
  6. 两个map中的数据,按照相同键,将所对应的值相加方法
  7. 学模拟电路的神器everycircuit
  8. toj 4606 Homework Checker
  9. Java知多少(24)包装类、拆箱和装箱详解
  10. 寻找最小的k个数(四种方法)
  11. Netty实现群聊系统
  12. 硬盘格式化数据恢复的软件推荐
  13. matlab里面sin函数是角度,matlab-如何用matlab编写sin函数要求定义一 – 手机爱问
  14. 实战大项目:模拟登录丁香园,并抓取论坛页面所有的人员基本信息与回复帖子内容----爬取第二步
  15. 英文网站推广推荐一些很好的SEO优化工具
  16. 正整数n分解成若干个个不同的自然数之和,使得乘积最大
  17. 谈判技巧---From一亩三分地帖子
  18. 全网最全Python金融大数据挖掘与分析,基础篇(附源代码,pycharm专业版无限期申请)
  19. 融合实体描述与路径信息的知识图谱表示学习模型
  20. 展锐5G芯片强势崛起,为千行百业实现智慧化转型

热门文章

  1. multi task训练torch_Pytorch多机多卡分布式训练
  2. docker compose搭建NACOS集群
  3. Java-双亲委派机制
  4. 重写python requests库实现自动拼接url
  5. 用二维码制作软件批量生成数据不定固定尺寸的二维码
  6. 轻量级java snmp设备网管软件开发技术
  7. 安卓 jni 开发错误 UnsatisfiedLinkError: Native method not found
  8. Java中file.delete()删除文件失败
  9. pytorch-forecasting
  10. class 5 搭建个人 Leanote 云笔记本