让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.mfbz.cn/a/372042.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第十二讲_JavaScript浏览器对象模型BOM

JavaScript浏览器对象模型BOM 1. 浏览器对象模型介绍2. location2.1 常用的属性2.2 常用的方法 3. navigator3.1 常用的属性 4. history4.1 常用的方法: 5. 本地存储 1. 浏览器对象模型介绍 BOM(Browser Object Model) 是指浏览器对象模型,浏览器对象模…

高通GAIA V3命令参考手册的研读学习(15):自定制命令的详细工作描述

先看第一个命令:GetManuFacturer 这个命令用来得到设备的制造商信息。 耳机发送这个命令,可以进一步地确认,是不是自己公司的设备。 比如,假定A公司做了一个蓝牙耳机,同时开发了一个手机APP用来控制它。 那么这个A…

【高质量精品】2024美赛B题22页word版高质量半成品论文+多版保奖思路+数据+前四问思路代码等(后续会更新)

一定要点击文末的卡片,进入后,获取完整论文!! B 题整体模型构建 1. 潜水器动力系统失效:模型需要考虑潜水器在无推进力情况下的行为。 2. 失去与主船通信:考虑无法从主船接收指令或发送位置信息的情况。…

蓝桥杯Web应用开发-display属性

display 属性 专栏持续更新中 display 属性可以用来设置元素在页面上的排列方式,也可用来隐藏元素。 display 属性值的说明如下表所示。 属性值说明block元素以块级方式展示。inline元素以内联方式展示。inline-block元素以内联块的方式展示。none隐藏元素。 b…

【微机原理与单片机接口技术】MCS-51单片机的引脚功能介绍

前言 MCS-51是指由美国Intel公司生产的一系列单片机的总称。MCS-51系列单片机型号有很多,按功能分位基本型和增强型两大类,分别称为8051系列单片机和8052系列单片机,两者以芯片型号中的末位数字区分,1为基本型,2为增强…

Python算法题集_反转链表

Python算法题集_反转链表 题41:反转链表1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【列表反转】2) 改进版一【直接赋值】3) 改进版二【递归大法】 4. 最优算法 本文为Python算法题集之一的代码示例 题41:反转链表 …

C#监听QQ消息自动回复-QQ自动化

整理 | 小耕家的喵大仙 出品 | CSDN(ID:lichao19897314) Q Q | 978124155 关于项目背景和微信自动化学习介绍 因为前面写了很多关于微信自动化的文章,网上有一位网友说他是做培训行业的,有时候除了微信对接客户还需要…

druid配置wall导致无法批量sql

1、现象 2、原配置 spring:autoconfigure:exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfiguredatasource:druid:stat-view-servlet:enabled: trueloginUsername: ***loginPassword: ***allow:web-stat-filter:enabled: truedynamic:druid: #…

kakfa系统架构

消息队列Kafka系统架构 Q:什么是Kafka? A:Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息引擎、消息队列服务,它可以处理消费者规模的网站中的所有动作流数据。…

【GameFramework框架】三、快速启动

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 【GameFramework框架】系列教程目录: https://blog.csdn.net/q7…

python常用pandas函数nlargest / nsmallest及其手动实现

目录 pandas库 Series和DataFrame nlargest和nsmallest 用法示例 代替方法 手动实现 模拟代码 pandas库 是Python中一个非常强大的数据处理库,提供了高效的数据分析方法和数据结构。它特别适用于处理具有关系型数据或带标签数据的情况,同时在时间…

动态库是怎么被加载的?

目录 1.动态库是如何被加载的? 2.那么虚拟地址和物理地址是如何映射的呢? 3.那么动态库的地址怎么来? 1.动态库是如何被加载的? 下面这个就是正常的进程是如何从磁盘中读取信息编译的: 而动态库就存储在共享区段&am…

Android简单支持项目符号的EditText

一、背景及样式效果 因项目需要,需要文本编辑时,支持项目符号(无序列表)尝试了BulletSpan,但不是很理想,并且考虑到影响老版本回显等因素,最终决定自定义一个BulletEditText。 先看效果&…

新春营销不间断,AI 整活更省心

新年、春节历来都是营销的大热节点,各种好物集、年货节、送礼清单比比皆是。这些新鲜玩法的背后是大量的品牌内容「弹药库」。 然而,品牌想在竞争激烈的新春季刷满存在感,并非易事。一方面,节日期间,消费者对于内容的审…

交叉验证之KFold和StratifiedKFold的使用(附案例实战)

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

云计算、Docker、K8S问题

1 云计算 云计算作为一种新兴技术,已经在现代社会中得到了广泛应用。它以其高效、灵活和可扩展特性,成为了许多企业和组织在数据处理和存储方面的首选方案。 1.1 什么是云计算?它有哪些特点? 云计算是一种通过网络提供计算资源…

项目02《游戏-06-开发》Unity3D

基于 项目02《游戏-05-开发》Unity3D , 接下来做 背包系统的 存储框架 , 首先了解静态数据 与 动态数据,静态代表不变的数据,比如下图武器Icon, 其中,武器的名称,描述&#xff…

全网第一篇把Nacos配置中心客户端讲明白的

入口 我们依旧拿ConfigExample作为入口 public class ConfigExample {public static void main(String[] args) throws NacosException, InterruptedException {String serverAddr "localhost";String dataId "test";String group "DEFAULT_GROU…

搭建frp

1.frp 是什么? frp 是一款高性能的反向代理应用,专注于内网穿透。它支持多种协议,包括 TCP、UDP、HTTP、HTTPS 等,并且具备 P2P 通信功能。使用 frp,您可以安全、便捷地将内网服务暴露到公网,通过拥有公网…

解决nvrtc: error: invalid value for --gpu-architecture (-arch)

问题描述 在使用pytorch3d的时候,可以正常的import,但是在执行错误的使用就会报,nvrtc: error: invalid value for --gpu-architecture (-arch),的错误,图片如下: 我的环境是: 显卡&#xff1…