autojs脚本代码大全_【Blender】【1_物理模拟篇】用Python脚本对 成群方块 进行刚体物理模拟...

v2-d627b15090d6930ecd5f95dfa8dc7fa9_1440w.jpg?source=172ae18b

【效果演示】

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

v2-a11901c7ecca078f72f9189a6b069d48.jpeg
【Blender】Python脚本刚体模拟https://www.zhihu.com/video/1248559084128575488

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

v2-de2056fd433295f896fa18f44a0373b1.jpeg
【Blender】Python脚本刚体模拟https://www.zhihu.com/video/1248340927741325312

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

【前言】

紧接着Blender With Python 上篇

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

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

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

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

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

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

v2-1729f4448b40734509be22aa6df57181_b.jpg

READY AIM FIRE!!!

【导图】

v2-a518cfbefd3cb4b091b0eedbe3271c89_b.jpg

v2-ab63fe22a0dbb8be20ef686565d86912_b.png

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

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

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

v2-4afd7030dc551a96f61e8fa351ae36f4_b.jpg

【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的话,就是让正方体最左下角的点处在世界原点位置。

v2-d3cfa33e9934642ec0c6844fe77c0013_b.jpg
Shift+A Cube

v2-b7290d384c1fc4353aea730c587070b6_b.jpg
-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。

v2-c2cffe17cf470e5a2d954dda43a258ea_b.jpg

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

  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
v2-6744b7b24b0bd57fb6225088d01e9ae6_180x120.jpg

【1.3.2】UE4创建成群Cube方法

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

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

v2-9614f49f2099f6d22458425d35fa0083_b.jpg

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

v2-4a3a5afa0ebca53c252cccee22d59757_b.jpg

v2-ea5a4ea11f25a675b16e40a18c676923_b.jpg

然后右键导出即可。

v2-390a2c79829780573839080fb4c01eda_b.jpg

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

v2-018a22656417f1c966d0b44f8f199066_b.jpg

v2-0f833d294f203eec4d771668a6e5e4ce_b.png

二、给这几百个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(阻碍物体的角速度变化)

v2-2d7776bf3ff4e92f91da262c2a163841_b.jpg
相关物理设置

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

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

v2-0bedbc10ce24309d99e0687d6e711230_b.jpg

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

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

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

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

v2-ddbf91e83f01d0b4fd5021af9396f980_b.jpg

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

v2-f3a20cca767f1dd833bf6d5ab67fb438_b.png

三、给地板添加盒体碰撞

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

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

v2-96a055aa83e3daaa575ea412fd897a75_b.jpg

v2-4ca6f1627dcb4c56df8a21a182d56f1b_b.png

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

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

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

v2-1e3d38eb01cdc81c4d3235adf78fe36e_b.jpg

v2-0374b7a97fbd034f57ff724062d9c9eb_b.png

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

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

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

v2-99c595e9ac99886f6852c3264dff8fd1_b.jpg

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

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

v2-7c498be2739603053a79d5bd5c8ce03f_b.jpg

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

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

v2-6e14b44f78177839ea4c0e3361d6772c_b.png

六、渲染输出相关设置

  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 自由控制)

更多Blender相关快捷键请看我这篇文章:

X Tesla:【Blender】快捷键大全(超级详细,应有尽有,不断更新)​zhuanlan.zhihu.com
v2-f4811e9f56e3f2e43a6dc19ff1d7e1c2_ipico.jpg

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

v2-8e48bb20abd2ba0ae12a4d5ef3ceef4e_b.jpg

9.点击渲染输出Render Animation

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

v2-22017d087359f9a63ccea69708e58328.jpg
【Blender】Python脚本刚体物理https://www.zhihu.com/video/1248558507206836224

v2-25a2be5b19b39bd5c2a36f8a05fbdf86_b.png

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

Alembic File Importer​docs.unrealengine.com
v2-313c2657904ebfb0ffd084cb1a2de844_180x120.jpg

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值