当前位置: 首页 > article >正文

让cgteamwork自动为Houdini载入相机,角色道具的abc文件

一 需求

最近接到个需求:在创建EFX文件时,自动加载动画出的缓存abc文件+相机, 不用手动一个个的载入,还容易出错
ABC文件自动导入到Houndini里

ABC文件自动导入到Houndini里

二 过程/效果

在CGTeamwork里打开对应的镜头,下面的文件列表显示相机和角色文件, 之前特效师手动一个个的参考到houdini文件上去的, 很费劲还容易漏掉,自动化工具需要自动把它们加载到houdin上去。

  1. 配置houdini启动器,在参数栏上写入houdini_open_start.py路径, win路径填houdini安装路径,其他的视情况填CGT启动器参数配置
CGT启动器参数配置
  1. 点击cgteamwork镜头任务右上角的houdini关联, 自动打开houdini软件
    CGTeamwork调用houdini
CGTeamwork调用houdini
  1. houndin相机自动载入起始帧,统一的命名。 资产abc自动放到一个组内
    abc文件载入到houdini
abc文件载入到houdini
![相机文件载入到houdini](https://img-blog.csdnimg.cn/direct/ecd864f922824f7792ac0a08fa517433.png#pic_center)
相机文件载入到houdini
![特效示意载入到houdini](https://img-blog.csdnimg.cn/direct/b58d095bf7b5478c8f24125a24730804.png#pic_center)
特效示意载入到houdini
  1. 自定义一个统一的输出节点, 以免输出路径不统一
    自动创建个输出路径
自动创建个输出路径

三 代码

原理:cgteamwork先调用start, 找到当前的镜头号,给到plugin, plugin算到路径下的abc列表,把列表文件赋给 /obj
houdini_open_start.py

import os,glob
import sys
import houdini_plugin
G_NukePlugin_Path = os.path.dirname( sys.argv[0] )
sys.path.append( G_NukePlugin_Path )
try:
    from PySide2.QtCore   import *
except:
    from PySide.QtCore   import *    
os.environ['QTWEBENGINEPROCESS_PATH'] = ''
appPath = QCoreApplication.applicationFilePath()
sys.path.append(r'C:/CgTeamWork_v7/bin/base')
import cgtw2
t_tw = cgtw2.tw()

def mina():       
    db    = sys.argv[1]
    module        = sys.argv[2]
    taskname      = sys.argv[3]
    taskid        = sys.argv[4]
    taskid        = taskid.split(":")[1]

    module="shot"
    field_sign_list=t_tw.task.fields(db,module)[:50]
    filter_list=[]
    id_list=[taskid]
    tasks = t_tw.task.get(db, module, id_list, field_sign_list, limit='5000', order_sign_list=[])
    if tasks:
        task = tasks[0]
        # print(122323,task)
        houdini_plugin.create_alembic_node(task["eps.entity"], task['shot.entity'])#source_name

        
mina()

houdini_plugin.py

import os,glob
import sys
import hou

def create_alembic_node(ep, shot):
    alembic_dir = "S:/Projects/NL/QHMX/{}/Shot/{}/Animation/approve/cache/".format(ep, shot)
    if not os.path.exists(alembic_dir):
        return
    folder = glob.glob(alembic_dir+r"alembic/*.abc")
    geoNode = hou.node("/obj/").createNode("geo", "abc")
    geoNode.setColor(hou.Color(1,0,0))
    geoNode.setPosition([3,0])
    # geoNode.setDisplayFlag(False)
    # geoNode.setSelectableInViewport(False)

    scaleNode = hou.node("obj").createNode("null", "Scale")
    scaleNode.setColor(hou.Color(1,0,0))
    scaleNode.setPosition([0,2])

    for file in folder:
        file = file.replace("\\","/")
        filename = os.path.basename(file).replace(".abc","")
        if filename!="light":
            abcNode = geoNode.createNode("alembic", filename)
            abcNode.parm("fileName").set(file)  
            abcNode.moveToGoodPosition()
            # abcNode.layoutChildren()
        else:
            lightNode = hou.node("/obj/").createNode("geo", "light")
            lightNode.setColor(hou.Color(1,0,0))
            lightNode.setPosition([1,0])
            abcNode = lightNode.createNode("alembic", filename)
            abcNode.parm("fileName").set(file)  
            abcNode.moveToGoodPosition()
            lightNode.setFirstInput(scaleNode)  
      
    geoNode.setFirstInput(scaleNode)   

    folder = glob.glob(alembic_dir+r"camera/*.abc")
    file = folder[0].replace("\\","/")
    filename = os.path.basename(file).replace(".abc","")
    node = hou.node('obj')
    camnode = node.createNode('alembicarchive',filename)
    camnode.setColor(hou.Color(1,0,0))
    camnode.parm('fileName').set(file)
    camnode.setPosition([-3,0])
    camnode.setFirstInput(scaleNode)
    camnode.parm('buildHierarchy').pressButton()

    parent = camnode.parent()
    box = parent.createNetworkBox()
    box.addItem(camnode)
    box.addItem(geoNode)
    box.addItem(scaleNode)
    node = hou.node('/obj/NL_{ep}_{shot}_Cam/NL_{ep}_{shot}_Cam/NL_{ep}_{shot}_CamShape'.format(ep=ep, shot=shot))
    node.parm("resx").set(1920)
    node.parm("resy").set(1080)

    
    fileNode = hou.node('/obj/').createNode('geo', 'filecache')
    fileNode.moveToGoodPosition()
    fileNode.setColor(hou.Color(0,0,1))
    # fileNode.setPosition([0,3])
    filecache = fileNode.createNode('filecache', 'filecache1')
    filecache.parm('filemethod').set(1)
    path = 'S:/Cache/NL/QHMX/{}/{}/`opname("..")`/$OS/$OS.$F4.bgeo.sc'.format(ep, shot)
    filecache.parm('file').set(path)
    box.addItem(fileNode)


四 最终效果

在这里插入图片描述
大大降低手工操作,完成!

link q :  316853809

http://www.kler.cn/news/233234.html

相关文章:

  • docker下,容器无法启动,要删除里面的文件
  • vue3 elementplus DateTimePicker 日期时间设置默认时间为当天
  • 跟着cherno手搓游戏引擎【22】CameraController、Resize
  • WordPress突然后台无法管理问题
  • GPT-3 训练自己的数据教程详解
  • 常用数字处理格式校验
  • 【C++跬步积累】—— 构造函数+析构函数
  • ARM交叉编译搭建SSH
  • 【网络攻防】网络攻防综合题-期末重点
  • Select 选择器 el-option 回显错误 value
  • 《Django+React前后端分离项目开发实战:爱计划》 03 理解项目结构
  • 第64讲个人中心用户操作菜单实现
  • Linux开发:PAM2 配置文件
  • 基础算法-高精度加法
  • 【jQuery——详细讲解】
  • linux系统Tomcat目录介绍
  • 深入理解java之多线程(一)
  • RocketMQ(二):领域模型(生产者、消费者)
  • Mac电脑如何通过终端隐藏应用程序?
  • 鸿蒙 WiFi 连接 流程
  • AI大模型开发架构设计(9)——AI 编程架构刨析和业务应用实战案例
  • 【Java万花筒】实时洞察与智能分析:构建成熟的Java应用程序监控与日志处理方案
  • 深度学习的进展及其在各领域的应用
  • C++的多态(Polymorphism)
  • 电商小程序02数据源设计
  • 在Visual Studio中引用和链接OpenSceneGraph (OSG) 库
  • Blazor Wasm 身份验证和授权之 OpenID 与 OAuth2
  • springboot169基于vue的工厂车间管理系统的设计
  • 【OpenCV入门讲解——超详细】
  • 【Spring】Bean 的生命周期