【效果演示】

渲染版(整整从下午四点半渲到早上五点半,500帧共渲染了13个小时,渲染了500张图片,然后再导回Blender剪辑,添加配乐文字啥的,整合成视频导出非常迅速,总共一分钟不到)

python AUTOJS脚本 autojs和python_python counter


录制版(录制只需40多秒)


python AUTOJS脚本 autojs和python_主动轮廓模型 python_02


----------------------------------------------------------------------------

【前言】

紧接着Blender With Python 上篇

X Tesla:【Blender】【0_基础篇】如何用Python脚本编写自己的插件zhuanlan.zhihu.com

前几天弄那个Niagara文字骨骼模型的时候,真是能急死人,方案简洁下来就是:

  1. 能够按照文字外轮廓(或者自己手写的字迹)产生骨骼
  2. 骨骼的名字能够从头到尾依次排好序(总分结构Hierarchy)

思路就这么简单,但是操作起来可真的是有些小无聊(纯属苦力活,跟蒙皮一样),如果能够写一个插件该多好啊,可是奈何插件这块还没咋学精。

对于独立游戏开发者,或者是大型游戏的开发工作室,插件肯定是必不可少的,它能够大大简化工作流程,减少返工次数,提升工作效率,缩短开发周期。

所以,呵,Blender,看我不把你欺负得哭不出来,你给老子等着!我这辈子就瞄准你了,剩下的就只有


READY AIM FIRE!!!

【导图】


python AUTOJS脚本 autojs和python_python counter_03


python AUTOJS脚本 autojs和python_autojs脚本代码大全_04


一、用Python脚本代替ArrayModifier创建成百个Cube

【1.1】预备知识点:模型Size

首先,我们知道在初建模型的时候,这个Cube的Size即是它的长宽高,都分别为2m(下方代码处得2就是这个2)


python AUTOJS脚本 autojs和python_autojs脚本代码大全_05


【1.2】填写代码

相关常用的语法可以看上一篇Python With Blender基础篇。


import bpy

number=10
counter_x=0
for x in range(0,number):
    counter_x+=2
    counter_y=0
    for y in range(0,number):
        counter_y+=2
        counter_z=0
        for z in range(0,number):
            counter_z+=2
            bpy.ops.mesh.primitive_cube_add(size=2, location=(counter_x-1, counter_y-1, counter_z-1))


  • for n in range(0,10),不包括10,索引共10个(也可以理解为右边开区间的数即为索引个数,跟UE4的不一样,UE要这样For Loop的话,就是11个,包含0)
  • number为xyz 各轴复制方块的数量
  • counter_x/y/z为 各小方块的位置
  • cube_add语句(不要打字)——新创建一个Cube,然后复制控制台的日志信息,我们不需要进入editmode,所以果断地删掉它(即 enter_editmode=False)。

为什么Add Cube的位置变量要减1?(可以忽略,因为对接下来跟地板碰撞没有影响)

  • 下面的counter_x/y/z 都 -1的目的是让Cube的枢轴点偏移,此时枢轴点处在正方体体心的位置,for loop之后第一个点就是(2,2,2),都减1的话,就是让正方体最左下角的点处在世界原点位置。


python AUTOJS脚本 autojs和python_autojs脚本代码大全_06

Shift+A Cube

python AUTOJS脚本 autojs和python_js模拟shift tab_07

-1偏移枢轴点

代码写好后,可以直接封装成一个插件,以后再需要这个功能的时候,直接用鼠标点一下button,跟创建表格一样键入Row Column,就是一秒钟的事儿,而不至于说再要手动添加Array Modifier了。

【1.3】对比其他成群Cube的创建方法

【1.3.1】传统的Array Modifier创建成群Cube方法

您瞅瞅,要用Array Modifier是如下图,而且是必须应用Modifier之后,才可以进入Edit Mode编辑单个的面。

注意哦:这样ArrayModifier生成的是一个整体(类似前些天我们做的魔方一样,所有的面都是连在一起的,不是像上方我们用脚本生成的10*10个Cube,它则是 1个大Cube。


python AUTOJS脚本 autojs和python_js模拟shift tab_08


如果需要转化成单个区块的话,就跟我们的这个方块动画差不多了呢。

  1. Tab 进入Edit Mode 键入 P Seperate By Loose Parts(这样就会分割成10*10的小方块了)
  2. 然后Tab 回到 Object Mode ,上方 Object Set Origin->Origin To Geometry即可,所有小方块的枢轴点就都在它自身的体心了呢

X Tesla:【Blender】方块波浪动画音乐效果zhuanlan.zhihu.com

python AUTOJS脚本 autojs和python_python counter_09


【1.3.2】UE4创建成群Cube方法

可以很准确地告诉大家,想直接在UE4当中用Construction Script建模,绝对能让你的项目卡爆!!!(不推荐使用,还是在外面DCC软件当中做好之后再导入进来吧,别图省事,图个新鲜还行,省事就算了,软件各有所长。如果你图新鲜的话,记得更改的时候把Construction Script的线给断掉,然后更改完再重新连接上)

为了制造区别,我把宽度改成了110。要不然就是一坨Cube。


python AUTOJS脚本 autojs和python_python AUTOJS脚本_10


然后将创建好的Cube Merge Actors,混合起来以建立一个Static Mesh


python AUTOJS脚本 autojs和python_js模拟shift tab_11


python AUTOJS脚本 autojs和python_js模拟shift tab_12


然后右键导出即可。


python AUTOJS脚本 autojs和python_python AUTOJS脚本_13


或者是右键直接Convert To Static Mesh,两种方法都可以(主要是处理之后看你枢轴点是不是在模型中心)


python AUTOJS脚本 autojs和python_js模拟shift tab_14


python AUTOJS脚本 autojs和python_主动轮廓模型 python_15


二、给这几百个Cube方块添加物理属性

【2.1】增加生成Cube方块的高度

可以增高高度如下:(z轴number增加一些)


import


【2.2】设置单个方块RigidBody刚体属性

  1. Info栏 A ,X删除全部日志(后面Copy Paste)
  2. 创建一个新的小方块
  3. 进入物理模拟,选择刚体Rigid Body。
  • Type为主动碰撞
  • 设置重力为20kg
  • 设置碰撞检测形状为Box(对应Cube)
  • Friction阻力,设置为最大1
  • 不需要Collision Margin,碰撞盒体检测就够了,设置为0
  • 线性阻尼为0.35(阻碍物体的线性速度变化)
  • 角度阻尼为0.6(阻碍物体的角速度变化)


python AUTOJS脚本 autojs和python_主动轮廓模型 python_16

相关物理设置

【2.3】复制刚才设置刚体属性的行为记录(输出日志处)

找到我们的输出日志(记录了我们刚才的相关操作),然后鼠标框选复制粘贴到代码处


python AUTOJS脚本 autojs和python_主动轮廓模型 python_17


【2.4】缩进并设置位置变量

复制进来是这样子,我们在上篇中说过,Python语言的语句执行命令是根据缩进来判断执行的,所以这些个语句必须放在for loop当中。

在Text Editor当中鼠标框选下面的部分

  • Tab Indent 向右缩进 三次(Shift+Tab 向左缩进)


python AUTOJS脚本 autojs和python_js模拟shift tab_18


然后将location vector的三个float设置为跟之前的一样,并保存(另:【2.3】中不需要框选复制 add Cube的语句,省的这里又再搞一下)


python AUTOJS脚本 autojs和python_python AUTOJS脚本_19


三、给地板添加盒体碰撞

创建一个Plane以检测盒体的碰撞

  1. 创建Plane,放大Scale
  2. 创建刚体
  3. 碰撞检测为被动
  4. 碰撞盒体根据Mesh形状来创建
  5. 边界为0
  6. 可以将Plane向下挪动一点(这里是-35)


python AUTOJS脚本 autojs和python_主动轮廓模型 python_20


python AUTOJS脚本 autojs和python_主动轮廓模型 python_21


四、跑脚本并设置刚体动画烘焙相关参数

跑完脚本后,记得M将脚本生成的Cube放在同一个类别下。

  • 设置Steps Per Second(值越大,效果越好,设置为500即可)
  • 设置烘焙范围(start=1,End=500)
  • 然后将Timeline的End Frame 也设置为500(跟烘焙范围对应起来)


python AUTOJS脚本 autojs和python_主动轮廓模型 python_22


python AUTOJS脚本 autojs和python_python counter_23


五、给所有的Cube设置一个随机颜色值

  1. 选中单个Cube新建材质
  2. 进入Shading 工作空间创建Color Ramp 随机颜色值(跟Blender那个方块音乐动画差不多,左右红,HSV/HLSL,Far模式即可)

相关解释如下图(已经在方块音乐动画中写过一遍了)


python AUTOJS脚本 autojs和python_autojs脚本代码大全_24


这里的Python方块案例相关设置如下图:

  • Add 偏移位置产生颜色渐变
  • Multipy设置各颜色区间间距(设置成0.02效果不错)


python AUTOJS脚本 autojs和python_主动轮廓模型 python_25


3.选中全部方块,Ctrl+L link materials 链接材质

4.然后进入Material Preview Mode点击Play播放预览


python AUTOJS脚本 autojs和python_python AUTOJS脚本_26


六、渲染输出相关设置

  1. 添加太阳光,设置光照强度为7,旋转角度以让Cube产生阴影(看起来更加真实一点)
  2. 切换渲染引擎为Cycles
  3. 设置Render Sampling渲染质量(针对每个像素)为 300
  4. 如用GPU渲染的话,可以将Tiles X/Y提升一点

5.Z 切换为Rendered渲染模式

6.进入世界设置(设置背景颜色(Surface Color)为白色,默认为Blender页面的灰色)

7.添加相机(0切换相机镜头,Shift+~ FPS 自由控制)


8.设置输出路径为一个单独的文件夹,类型为PNG或者是MP4格式,反正可以将图片序列和视频进行相关转化的。(PS、Python脚本、甚至直接再导入到Blender剪辑加配乐都可以,我这块用的是Blender,操作非常简单,导出速度也非常快)


python AUTOJS脚本 autojs和python_js模拟shift tab_27


9.点击渲染输出Render Animation

第一次尝试在Blender当中渲染输出一个正经视频,感觉计算机图形学好神奇啊,以后还是往原理的方向走。


python AUTOJS脚本 autojs和python_autojs脚本代码大全_28

【Blender】Python脚本刚体物理https://www.zhihu.com/video/1248558507206836224

python AUTOJS脚本 autojs和python_python counter_29


七、将物理模拟动画导出并导入进UE4当中去

Alembic File Importerdocs.unrealengine.com

python AUTOJS脚本 autojs和python_python counter_30


ABC格式文件:Alembic并不储存复杂的依赖图,而是把依赖图的计算结果“烘培”成最终的模型,通常是顶点位置信息。也就是我们一般在DCC软件当中用物理模拟出来的顶点几何动画。

关于将ABC格式动画导入到UE4当中,我试过了n遍,也查了大家的解决办法,无外乎其下:

  • 导出时勾选Selected Objects
  • 导出Alembic
  • 拖拽/点击Import
  • 清空Saved文件缓存

但是结果还是不成功,大家有导入成功的可以在文末留言。