学习视频链接

关于C4D与Python那些事_哔哩哔哩_bilibili

c4dpython 文档 c4d中的python_全局变量

https://www.bilibili.com/video/BV1et411172W/

目录

一、简单用法

二、C4D包

2.1 vector 矢量

2.2 矩阵

2.3 用脚本创建对象

2.4 几何体结构

三、制作效果

3.1 洗牌

3.2 后面的项目单独开文章


一、简单用法

在 C4D 的 扩展 下拉选项中,打开 控制台脚本管理器,在脚本管理器中编写的代码,就可以在控制台中输出信息

python 的基础语法就跳过了,在 py 文件中引入 C4D 包,我们就能对 C4D 进行操作了

c4dpython 文档 c4d中的python_python_02

二、C4D包

2.1 vector 矢量

1、初始化

c4dpython 文档 c4d中的python_全局变量_03

2、相加、数乘和数除

c4dpython 文档 c4d中的python_sed_04

3、标准化

c4dpython 文档 c4d中的python_python_05

4、点乘和叉乘

c4dpython 文档 c4d中的python_开发语言_06

5、获取向量长度

c4dpython 文档 c4d中的python_c4dpython 文档_07

 一个是开方的结果,一个是不开方的结果

标准化~c 等同于 c/c.GetLength()

2.2 矩阵

c4dpython 文档 c4d中的python_python_08

2.3 用脚本创建对象

1、新建球体 

c4dpython 文档 c4d中的python_开发语言_09

2、给球体加标签

c4dpython 文档 c4d中的python_开发语言_10

3、修改属性

先把属性拖过来

c4dpython 文档 c4d中的python_sed_11

进行一些修改 

c4dpython 文档 c4d中的python_sed_12

 其他属性

c4dpython 文档 c4d中的python_python_13

c4dpython 文档 c4d中的python_c4dpython 文档_14

 

c4dpython 文档 c4d中的python_python_15

4、层级关系

c4dpython 文档 c4d中的python_c4dpython 文档_16

变换插入的顺序是 s.InsertUnderLast(pn) 

5、建立后修改名字

c4dpython 文档 c4d中的python_python_17

6、塌陷物体

c4dpython 文档 c4d中的python_c4dpython 文档_18

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、判断几何体结构

c4dpython 文档 c4d中的python_sed_19

也可以换一种写法,get类型,这个也是比较重要

c4dpython 文档 c4d中的python_全局变量_20

2、获取几何体包含的所有点

c4dpython 文档 c4d中的python_全局变量_21

3、获取选择了的点

c4dpython 文档 c4d中的python_开发语言_22

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、生成曲线 

c4dpython 文档 c4d中的python_全局变量_23

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、模块化代码

c4dpython 文档 c4d中的python_c4dpython 文档_24

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、创建面片

c4dpython 文档 c4d中的python_python_25

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、简单效果制作

c4dpython 文档 c4d中的python_python_26

c4dpython 文档 c4d中的python_sed_27

c4dpython 文档 c4d中的python_c4dpython 文档_28

c4dpython 文档 c4d中的python_python_29

 

c4dpython 文档 c4d中的python_sed_30

播放视频,每帧执行一次 mian 函数,外面的是全局变量

c4dpython 文档 c4d中的python_开发语言_31

 现在编写一个每 20 帧改变一下样式的代码

c4dpython 文档 c4d中的python_全局变量_32

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、每次的种子相同

c4dpython 文档 c4d中的python_python_33

c4dpython 文档 c4d中的python_sed_34

c4dpython 文档 c4d中的python_开发语言_35

c4dpython 文档 c4d中的python_开发语言_36

4、添加动作

添加刚体标签,关闭重力

c4dpython 文档 c4d中的python_全局变量_37

 

c4dpython 文档 c4d中的python_python_38

微调上面数据就行了 

c4dpython 文档 c4d中的python_全局变量_39

 实际上,视频中是实现了,我并没有实现,但是我不清楚到底是啥原因,这部分我先跳过