学习视频链接
关于C4D与Python那些事_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1et411172W/
目录
一、简单用法
二、C4D包
2.1 vector 矢量
2.2 矩阵
2.3 用脚本创建对象
2.4 几何体结构
三、制作效果
3.1 洗牌
3.2 后面的项目单独开文章
一、简单用法
在 C4D 的 扩展 下拉选项中,打开 控制台 和 脚本管理器,在脚本管理器中编写的代码,就可以在控制台中输出信息
python 的基础语法就跳过了,在 py 文件中引入 C4D 包,我们就能对 C4D 进行操作了
二、C4D包
2.1 vector 矢量
1、初始化
2、相加、数乘和数除
3、标准化
4、点乘和叉乘
5、获取向量长度
一个是开方的结果,一个是不开方的结果
标准化~c 等同于 c/c.GetLength()
2.2 矩阵
2.3 用脚本创建对象
1、新建球体
2、给球体加标签
3、修改属性
先把属性拖过来
进行一些修改
其他属性
4、层级关系
变换插入的顺序是 s.InsertUnderLast(pn)
5、建立后修改名字
6、塌陷物体
import c4d
from c4d import utils
def c2o(o):
r = utils.SendModelingCommand(
command = c4d.MCOMMAND_CURRENTSTATETOOBJECT,
list = [o],
mode = c4d.MODELINGCOMMANDMODE_ALL,
doc = doc)
return r[0]
def main():
# 创建空白对象
s = c4d.BaseObject(5160)
s[c4d.PRIM_SPHERE_TYPE] = 4
s2 = c2o(s)
doc.InsertObject(s2)
c4d.EventAdd()
main()
2.4 几何体结构
1、判断几何体结构
也可以换一种写法,get类型,这个也是比较重要的
2、获取几何体包含的所有点
3、获取选择了的点
import c4d
def main():
a = doc.GetActiveObject()
# 判断是否选中的物体
if (a == None):
print("没有选中物体")
return
if (a.GetType() != 5100):
print("选中的是:" + str(a.GetType()) + "不是5100")
return
pl = a.GetAllPoints()
sel = a.GetPointS( )
spl = []
for i, p in enumerate(pl):
if (sel.IsSelected(i) == True):
spl.append(pl[i])
print(spl)
main()
4、生成曲线
import c4d
def main():
# 创建贝塞尔曲线
# 传入参数:两个点、线性插值
s = c4d.SplineObject(2, c4d.SPLINETYPE_LINEAR)
s[c4d.SPLINEOBJECT_TYPE] = 0
s[c4d.SPLINEOBJECT_CLOSED] = False
s[c4d.SPLINEOBJECT_INTERPOLATION] = 0
# 两个点在第0分段里面
s.ResizeObject(2, 1)
# 第0个分段有两个点,不封闭
s.SetSegment(0, 2, False)
pl = [c4d.Vector(0), c4d.Vector(200)]
s.SetAllPoints(pl)
# 生成
s.Message(c4d.MSG_UPDATE)
doc.InsertObject(s)
c4d.EventAdd()
main()
5、模块化代码
import c4d
# 生成曲线
def makeSpline(pl, closed = False):
pc = len(pl)
s = c4d.SplineObject(pc, c4d.SPLINETYPE_LINEAR)
s[c4d.SPLINEOBJECT_TYPE] = 0
s[c4d.SPLINEOBJECT_CLOSED] = closed
s[c4d.SPLINEOBJECT_INTERPOLATION] = 0
s.ResizeObject(pc, 1)
s.SetSegment(0, pc, closed)
s.SetAllPoints(pl)
s.Message(c4d.MSG_UPDATE)
return s
def main():
pl = [c4d.Vector(0), c4d.Vector(100, 0, 0), c4d.Vector(200)]
s = makeSpline(pl)
doc.InsertObject(s)
c4d.EventAdd()
main()
6、创建面片
import c4d
# 生成面
def makePoly(pl, fl):
pc = len(pl) # 点数量
fc = len(fl) # 面数量
a = c4d.PolygonObject(pc, fc)
for i in range(fc): # 遍历所有的面
cf = fl[i] # 取出面
if (len(cf) == 3): # 判断该面是否是三角面
cp = c4d.CPolygon(cf[0], cf[1], cf[2])
else:
cp = c4d.CPolygon(cf[0], cf[1], cf[2], cf[3])
a.SetPolygon(i, cp) # 设置第i号面是cp
a.SetAllPoints(pl)
a.Message(c4d.MSG_UPDATE)
return a
def main():
pl = [c4d.Vector(0), c4d.Vector(100, 0, 100), c4d.Vector(100, 0, -100)]
# a = makePoly(pl, [(0, 1, 2), (1, 2, 3)])
a = makePoly(pl, [(0, 1, 2)])
doc.InsertObject(a)
c4d.EventAdd()
main()
三、制作效果
3.1 洗牌
1、简单效果制作
播放视频,每帧执行一次 mian 函数,外面的是全局变量
现在编写一个每 20 帧改变一下样式的代码
import c4d
import random
rd = random.Random()
# ---- 全局变量 ----
# marr = 0
def main() -> bool:
# ---- 全局变量 ----
global marr
# ---- 代码区 ----
moData = c4d.modules.mograph.GeGetMoData(op)
if moData is None:
return False
# 获取所在帧数 doc.GetFps(): 获取当前工程帧率
cf = doc.GetTime().GetFrame(doc.GetFps())
if cf == 0:
marr = moData.GetArray(c4d.MODATA_MATRIX)
# 打乱顺序
if (cf % 20 == 0):
rd.shuffle(marr)
moData.SetArray(c4d.MODATA_MATRIX, marr, False)
return True
2、代码检错处理
def main() -> bool:
# ---- 全局变量 ----
global marr
# ---- 代码区 ----
moData = c4d.modules.mograph.GeGetMoData(op)
if moData is None:
return False
# 获取所在帧数 doc.GetFps(): 获取当前工程帧率
cf = doc.GetTime().GetFrame(doc.GetFps())
if cf == 0:
marr = moData.GetArray(c4d.MODATA_MATRIX)
# 检错处理
try:
# 打乱顺序
if (cf % 20 == 0):
rd.shuffle(marr)
moData.SetArray(c4d.MODATA_MATRIX, marr, False)
except:
return False
return True
3、每次的种子相同
4、添加动作
添加刚体标签,关闭重力
微调上面数据就行了
实际上,视频中是实现了,我并没有实现,但是我不清楚到底是啥原因,这部分我先跳过