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

news2024/11/28 8:41:53

一 需求

最近接到个需求:在创建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.coloradmin.cn/o/1432746.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大型软件编程实例分享,诊所门诊处方笺管理系统多台电脑同时使用的软件教程

大型软件编程实例分享,诊所门诊处方笺管理系统多台电脑同时使用的软件教程 一、前言 以下教程以 佳易王诊所门诊电子处方管理系统V17.2 为例说明 软件资源可以点击最下方官网卡片了解详情 软件左侧为导航栏 1、系统参数设置:可以设置打印等参数 2、…

zabbix配置监控脚本

zabbix配置监控脚本 1.修改agent配置文件 [rootchang ~]# vim /etc/zabbix/zabbix_agentd.conf 333行 原# UnsafeUserParameters0 修改成 UnsafeUserParameters12.创建脚本与脚本存放目录 [rootchang ~]# mkdir /etc/zabbix/zabbix_scripts [rootchang zabbix_scripts]# vi…

BUUCTF-Real-ThinkPHP]5.0.23-Rce

漏洞介绍 这个版本容易存在我们都喜欢的rce漏洞! 网站为了提高访问效率往往会将用户访问过的页面存入缓存来减少开销。而Thinkphp 在使用缓存的时候是将数据序列化,然后存进一个 php 文件中,这使得命令执行等行为成为可能! ThinkP…

2.0 Hadoop 运行环境

由于 Hadoop 是为集群设计的软件,所以我们在学习它的使用时难免会遇到在多台计算机上配置 Hadoop 的情况,这对于学习者来说会制造诸多障碍,主要有两个: 昂贵的计算机集群。多计算机构成的集群环境需要昂贵的硬件.难以部署和维护。…

物联网与智慧景区的未来:机遇与挑战并存

随着科技的不断发展,物联网技术在智慧景区中的应用越来越广泛,为旅游业带来了巨大的变革。然而,在物联网与智慧景区的未来发展中,机遇与挑战并存。本文将探讨物联网与智慧景区面临的机遇和挑战,并提出应对措施&#xf…

【npm】修改npm全局安装包的位置路径

问题 全局安装的默认安装路径为:C:\Users\admin\AppData\Roaming\npm,缓存路径为:C:\Users\admin\AppData\Roaming\npm_cache(其中admin为自己的用户名)。 由于默认的安装路径在C盘,太浪费C盘内存啦&#…

LeetCode--121

121. 买卖股票的最佳时机 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从…

1.0 Hadoop 教程

Hadoop 是一个开源的分布式计算和存储框架,由 Apache 基金会开发和维护。 Hadoop 为庞大的计算机集群提供可靠的、可伸缩的应用层计算和存储支持,它允许使用简单的编程模型跨计算机群集分布式处理大型数据集,并且支持在单台计算机到几千台计…

智慧港口:山海鲸可视化引领未来

随着疫情的结束,全球贸易迎来新的春天,港口作为物流枢纽的地位日益凸显。然而,传统港口的运营和管理方式已无法满足现代物流的需求。为了提高港口运营效率,降低成本,智慧港口的概念应运而生。作为山海鲸可视化的开发者…

适用于您站点的12个免费模态窗口库和插件

1. jQuery模态 寻找超级干净且易于使用的东西吗?然后jQuery Modal应该是您的首选资源。 这个可访问的插件可与键盘快捷键(ESC关闭)一起使用,甚至支持触摸操作。总库重约1KB,非常小。 更不用说实际的设计足够干净&…

路由引入路由过滤

目录 路由引入 什么是路由引入? 为什么需要路由引入? 路由引入的规划分为两种 路由过滤 路由过滤的工具 前缀列表格式 filter-policy router-policy 路由引入 什么是路由引入? 将一种协议导入到另一种协议或在同种协议的不同进程…

2023年全球软件架构师峰会(ArchSummit上海站):核心内容与学习收获(附大会核心PPT下载)

微服务架构是当今软件架构的主流趋势之一。随着云计算和分布式系统的普及,越来越多的企业开始采用微服务架构来构建他们的应用。微服务架构可以将一个大型的应用拆分成多个小型的服务,每个服务都独立部署、独立运行,并通过轻量级的通信协议进…

Openresty+Lua+Redis实现高性能缓存

一、背景 当我们的程序需要提供较高的并发访问时,往往需要在程序中引入缓存技术,通常都是使用Redis作为缓存,但是要再更进一步提升性能的话,就需要尽可能的减少请求的链路长度,比如可以将访问Redis缓存从Tomcat服务器…

计算机设计大赛 深度学习 植物识别算法系统

文章目录 0 前言2 相关技术2.1 VGG-Net模型2.2 VGG-Net在植物识别的优势(1) 卷积核,池化核大小固定(2) 特征提取更全面(3) 网络训练误差收敛速度较快 3 VGG-Net的搭建3.1 Tornado简介(1) 优势(2) 关键代码 4 Inception V3 神经网络4.1 网络结构 5 开始训练5.1 数据集…

Electron实战(二):将Node.js和UI能力(app/BrowserWindow/dialog)等注入html

文章目录 设置webPreferences参数安装electron/remotemain进程中初始化html中使用dialog踩坑参考文档 上一篇:Electron实战(一):环境搭建/Hello World/打包exe 设置webPreferences参数 为了能够在html/js中访问Node.js提供fs等模块,需要在n…

生物发酵展同期论坛|2024节能环保绿色低碳发展论坛

“十四五”规划中提出,提高工业、能源领城智能化与信息 化融合,明确“低碳经济”新的战略目标,热能产业是能源产 业和民生保障的重要组成部分,也是二氧化碳排放量大的行业 之一,产业高效、清洁、低碳、灵活、智能化水平…

十大排序算法之归并排序

归并排序 归并排序是包含归并思想的排序方法,它是分治法(Divide and Conquer)的一个典型应用。所谓分治,即将问题“分”(Divide)为更小的问题进行递归求解,再将得到的各个递归结果合并在一起&a…

百面嵌入式专栏(面试题)网络编程面试题

沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇我们将介绍网络编程面试题 。 1、什么是IO多路复用 I/O多路复用的本质是使用select,poll或者epoll函数,挂起进程,当一个或者多个I/O事件发生之后,将控制返回给用户进程。以服务器编程为例,传统的多进程(多线程…

C语言函数递归详解

递归是什么&#xff1f; 递归&#xff0c;顾名思义&#xff0c;就是递推和回归。 递归是一种解决问题的方法&#xff0c;在C语言中&#xff0c;递归就是函数自己调用自己。 #include <stdio.h> int main() {printf("hehe\n");main();//main函数中⼜调⽤了main…

【Web】CVE-2021-22448 Log4j RCE漏洞学习

目录 复现流程 漏洞原理 复现流程 启动HTTP->启动LDAP->执行Log4j vps起个http服务,放好Exploit.class这个恶意字节码 LDAPRefServer作为恶意LDAP服务器 import java.net.InetAddress; import java.net.MalformedURLException; import java.net.URL; import javax.ne…