Houdini Python开发实战 课程笔记

2023-05-16

P2 + P3 + P4 + P5 - 基础:

1. Houdini中使用Python的地方

2. Textport:可使用cd、ls等路径操作的命令(命令前加%,可在python中使用)

3. Source Editor

在Source Editor中定义函数

在其他地方调用


hou.session.getChildren(hou.node("/"))  

4. Python Shell 

示例

p2


obj = hou.node("/obj")  

obj.createNode("geo")

hou.cd("/obj/geo")

# 返回当前路径
hou.pwd()

file1 = hou.node("./file1")
file1.destory()


hou.pwd().createNode("shpere")
shpere = hou.node("shpere1")
hou.pwd().createNode("box1")
box = hou.node("box")
hou.pwd().createNode("merge")
merge = hou.node("merge1")

# 将box和shpere联合起来
merge.setFirstInput(sphere, 0)
merge.setNextInput(box)

p3


# 返回merge联合的节点
merge.inputs()

# 将merge联合的box去除
merge.setInput(1,None)

# 返回父节点及子节点
merge.parent()
obj.children()

# 返回子节点元组的函数
def getChildren(node):
    childList = []
    for n in node.children():
         childList.append(n)
    return childList
# 调用函数
getChildren("/obj/geo1")
getChildren("/")

# 返回场景中所有节点的元组的函数
def getChildren(node):
    childList = []
    for n in node.children():
         childList.append(n)
         if n.children():
             childList += getChildren(n)
    return childList
   

p4


# 操作节点的参数

# 获得参数
parm = hou.parm("./shpere1/radx")
# 取参数值
parm.eval()
# 修改值
parm.set(5.0)

parmtuple = hou.parmTuple("./shpere1/rad")
parmtuple.eval()
parmtuple.set((5.0, 5.0, 5.0))  

 p5 

可通过将界面元素(节点、参数、工具)拖进Python Shell获得其代码定义


# 取得节点的name
hou.pwd().name()

# 取得帮助
help(hou.pwd())  

Python文档:Houdini - Help

  


# 将多个节点布局好
hou.pwd().layoutChildren()

sphere.setParms({"radx": 3.0 , "tx": 2.0})  

 

P6 - 创建工具栏工具: 

1.  New Shelf

  Name - 小写 加 下划线

  Label - 首字母大写

2. New Tool

  

  Options中指定Name和Label

  Script中写代码


# 点击工具得到对话框
hou.ui.displayMessage("Hello Houdini !")


# box_tool 创建一个box节点
geoNet = hou.ui.paneTabOfType(hou.paneTabType.NetworkEditor)

position = geoNet.selectPosition()

box = geoNet.pwd().createNode("box")

box.setPosition(position)  

 

P7 + P8 - 创建螺旋线工具:

1. 工具栏 kwargs参数(世界列表)

  包含:按键信息、pane信息、View信息

2. 自定义工具-螺旋线


from math import sin, cos

geoNet = hou.ui.paneTabOfType(hou.paneTabType.NetworkEditor)

spiral = geoNet.pwd().createNode("curve")

coordsParm = spiral.parm("coords")

inputParms = readMultiInput(message = "Enter parameters:" , input_labels = ["height", "lRadius", "uRadius", "frequency"], initial_contents = ["20", "10", "5", "3"])

height = float(inputParms[1][0])
lRadius = float(inputParms[1][1])
uRadius = float(inputParms[1][2])
frequency = float(inputParms[1][3])

coordsStr = ""

radius = lRadius
step = (lRadius - uRadius) / (height * frequency)

for i in range(int(height * frequency)):
    px = str(radius * sin(i))
    py = str(i / frequency)
    pz = str(radius * cos(i))
    
    coordsStr += px + ", " + py + ", " + pz + " " 

    radius -= step

coordsParm.set(coordsStr)  

 

P9 - P15 -  创建sop节点:

 

创建 “Add Color SOP” 节点

1. New Operator Type 

2. 代码


import hou
import random

node = hou.pwd()
geo = node.geometry()

# 给定种子 保证每次运行otl得到的结果相同
random.seed(123)

colorAttrib = geo.addAttrib(hou.attribTypr.Point, "Cd", (1.0, 1.0, 1.0))

color = hou.Color()

pointsNum = len(geo.points())

for point in geo.points():
    pos = point.position()

    px = pos[0]
    py = pos[1] + random.random() * random.choice([-1,1])
    pz = pos[2]
    
    point.setPosition((px, py, pz))

    value = float(point.number()) / pointsNum
    color.setHSV((value * 255, 1.0, 1.0))
    point.setAttribValue(colorAttrib, color.rgb())

创建 “Color Falloff SOP” 节点

1. 添加节点,并为节点添加两个参数

2. Color Falloff 效果 - 代码


import hou
import random

node = hou.pwd()
geo = node.geometry()

# 给定种子 保证每次运行otl得到的结果相同
random.seed(123)

colorAttrib = geo.addAttrib(hou.attribTypr.Point, "Cd", (1.0, 1.0, 1.0))

color = hou.Color()

position = hou.Vector3(node.parmTuple("position").eval())
falloff = max( node.parm("falloff").eval(), 0.0001)

for point in geo.points():
    pos = point.position()

    px = pos[0]
    py = pos[1] # + random.random() * random.choice([-1,1])
    pz = pos[2]
    
    point.setPosition((px, py, pz))

    distance = (pos - position)

    value = min(distance / falloff , 1.0)
    color.setHSV((value * 255, 1.0, 1.0))
    point.setAttribValue(colorAttrib, color.rgb())  

3. Color Wave 效果 - 代码


import hou
import random

node = hou.pwd()
geo = node.geometry()

# 给定种子 保证每次运行otl得到的结果相同
random.seed(123)

colorAttrib = geo.addAttrib(hou.attribTypr.Point, "Cd", (1.0, 1.0, 1.0))

color = hou.Color()

position = hou.Vector3(node.parmTuple("position").eval())
falloff = max( node.parm("falloff").eval(), 0.0001)
frequency = max( node.parm("frequency").eval(), 0.0001)
height =  node.parm("height").eval()

for point in geo.points():
    pos = point.position()

    distance = (pos - position)

    value = abs(sin( min(distance / falloff , 1.0) ) * frequency)
    color.setHSV((value * 255, 1.0, 1.0))
    point.setAttribValue(colorAttrib, color.rgb())

    px = pos[0]
    py = pos[1]  + height * color.rgb()[1]
    pz = pos[2]
    
    point.setPosition((px, py, pz))  

P13 动画

4. Color Falloff基础上  添加 法线  - 代码


#primitive type : mesh || NURBS

import hou
import random

node = hou.pwd()
geo = node.geometry()

# 给定种子 保证每次运行otl得到的结果相同
random.seed(123)

colorAttrib = geo.addAttrib(hou.attribTypr.Point, "Cd", (1.0, 1.0, 1.0))

color = hou.Color()

position = hou.Vector3(node.parmTuple("position").eval())
falloff = max( node.parm("falloff").eval(), 0.0001)
u_div = hou.evalParm("u_div")
v_div = hou.evalParm("v_div")
threshHold = hou.evalParm("threshHold")
height = hou.evalParm("height")

surface = geo.iterPrims()[0]

for point in geo.iterPoints():
    pos = point.position()

    px = pos[0]
    py = pos[1]
    pz = pos[2]
    
    point.setPosition((px, py, pz))

    distance = (pos - position)

    value = min(distance / falloff , 1.0)
    color.setHSV((value * 255, 1.0, 1.0))
    point.setAttribValue(colorAttrib, color.rgb())

for uNum in xrange(u_div + 1):
    u = float(uNum) / u_div
    for vNum in xrange(v_div + 1):
        v = float(vNum) / v_div
        uvColor = surface.attribValueAt("Cd", u, v)
        pos0 = surface.positionAt(u, v)

        pos1 = pos0 + surface.normalAt(u, v) * height

        ploy = geo.createPolygon()
        poly.setIsClosed(false)

        if uvColor[2] > threshHold:    # 只给绿色的地方添加法线(0.9)

            for p in [pos0, pos10:
                point = geo.createPoint()
                point.setPosition(p)
                point.setAttribValue(colorAttrib, uvColor)
                poly.addVertex(point)

5. 将4完成的sop连接到 Add Color sop下

部分变量重复

修改4的代码为


#primitive type : mesh || NURBS

import hou
import random

node = hou.pwd()
geo = node.geometry()

# 给定种子 保证每次运行otl得到的结果相同
random.seed(123)

colorAttrib = geo.findPointAttrib("Cd")


position = hou.Vector3(node.parmTuple("position").eval())
falloff = max( node.parm("falloff").eval(), 0.0001)
u_div = hou.evalParm("u_div")
v_div = hou.evalParm("v_div")
threshHold = hou.evalParm("threshHold")
height = hou.evalParm("height")

surface = geo.iterPrims()[0]



for uNum in xrange(u_div + 1):
    u = float(uNum) / u_div
    for vNum in xrange(v_div + 1):
        v = float(vNum) / v_div
        uvColor = surface.attribValueAt("Cd", u, v)
        pos0 = surface.positionAt(u, v)

        pos1 = pos0 + surface.normalAt(u, v) * height

        ploy = geo.createPolygon()
        poly.setIsClosed(false)

        if uvColor[2] > threshHold:    # 只给绿色的地方添加法线(0.9)

            for p in [pos0, pos10:
                point = geo.createPoint()
                point.setPosition(p)
                point.setAttribValue(colorAttrib, uvColor)
                poly.addVertex(point)  

再增加一个sop 来控制法线的粗细(width)

PS:

  查看渲染过程中的点的信息  Details View(P12 19min)

  可在Parameters中限制参数的取值范围 (P11 3min)

 

 

 P16 - P19 -  表达式:

 

 

 

 

 

教程地址:https://www.bilibili.com/video/av33143116/?p=1

PS:程序员看这个教程代码的讲解过程,真的要急死。。。

转载于:https://www.cnblogs.com/farewell-farewell/p/11608056.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Houdini Python开发实战 课程笔记 的相关文章

随机推荐

  • intel和AMD CPU性能对比(2016年CPU天梯图)组装电脑必读!

    http www 365pcbuy com article 411 html 特别提示 xff1a 此文已经于2016年10月12日更新 xff01 内容变动较大 xff0c 请细细品鉴 xff01 如何为客户推荐高性价比机型是我站的重要工
  • SDN控制器-POX学习(一)

    本文实验环境 1 VirtualBox 2 SDN Hub tutorial VM 64bit 学习目标 1 熟悉SDN Hub tutorial 2 学习POX提供的样例代码 tutorial l2 hub py SDN Hub tuto
  • android 编译突然出错,错误原因 Could not resolve com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+....

    错误追根是因为微信支付依赖的错误 解决办法 xff1a 微信支付依赖版本 43 号改为微信支付依赖最新版本 在这里https bintray com wechat sdk team maven可以查看到wechat sdk的最新版本号 xf
  • 浏览器相关知识

    1 认识浏览器 浏览器是把在互联网上找到的文本文档翻译成网页 xff0c 网页包括图形 音频 视频和文本等 2 浏览器的主要功能 展示网页资源 xff0c 即请求服务器并将请求的结果显示在浏览器窗口中 资源的格式一般是HTML xff0c
  • linux vnc的默认端口修改

    linux vnc的默认端口修改 2014 02 08 20 01 28 分类 xff1a LINUX vnc的默认端口是5901 xff0c 这个说法是不对的 vnc并不是只有一个端口 以前另一个文章介绍了nvcserver的配置用户的过
  • redis配置

    1 Redis 3 2x配置文件详解 2 3 4 默认redis不是以后台进程的方式启动 xff0c 如果需要在后台运行 xff0c 需要将这个值设置成yes 5 以后台方式启动的时候 xff0c redis会写入默认的进程文件 var r
  • Cosmos OpenSSD架构分析--FSC

    接口速度 xff1a type bw read75 s1s 75 s 8k 1s 61 104m swrite 1300 s 1s 1300 s 8k 1s 61 6m serase3 8ms 1s 3 8ms 8k 256 1s 61 5
  • 单片机的栈

    导读 xff1a 在C语言的世界里 xff0c 栈的地位非常举足轻重 xff0c 许多错误都可能和栈设置有关 xff0c 那么该如何确定栈的大小 xff1f 今天分享一点栈知识 xff0c 帮助你确定栈的大小 xff0c 参考链接请点击下方
  • GPS数据接收 串口调试感受

    注册这个账户也有一段日子了 xff0c 不知不觉已经研2了 xff0c 时间过的好快 xff0c 研3的学长已经答辩完 xff0c 马上要离开学校去工作了 xff0c 在南京 xff0c 一份不错的工作 这学期已经过去一个月了 xff0c
  • 使用VNC访问Windows桌面

    1 背景介绍 两台电脑 xff0c 一个笔记本 xff0c 一个台式机 笔记本上装的是Windows 10 通过上网小助手上网 xff08 P S 上网小助手 Stupid Policy xff09 台式机上装的是Ubuntu 14 04L
  • Maven 与 IntelliJ IDEA 的完美结合<转>

    转载地址 xff1a http www open open com lib view open1388650391891 html 你是否正在学习Maven xff1f 是否因为Maven难用而又不得不用而苦恼 xff1f 是否对Eclip
  • Cannot install ubuntu or other linux flavours on citrix Xen server

    Citrix Xen sucks When u try to install linux stuff on its Xen servers u will get an error complaining errors like below
  • web网站css,js更新后客户浏览器缓存问题,需要刷新才能正常展示的解决办法

    问题描述 最近将公司官网样式进行了调整 xff0c 部署到服务器后访问发现页面展示不正常 xff0c 但是刷新之后就会展示正常 问题分析 研究之后发现可能的原因有 css文件过大 xff0c 加载缓慢本地缓存问题 xff0c 虽然服务器修改
  • 目标检测篇-FPN论文精读

    1 FPN网络结构 基于feature pyrimid来检测不同scale的object xff0c 共有4种思路 a 使用图像金字塔构建特征金字塔 在每个图像尺度上独立计算的 b 只使用单一尺度的特征 c 重用由卷积神经网络计算的金字塔特
  • VNC的安装和常用命令

    主要参考文章 xff1a http www cnblogs com coderzh archive 2008 07 16 1243990 html http os 51cto com art 201005 201136 all htm ht
  • Deepin debian安装Libreoffice

    Libreoffice LibreOffice 是一款功能强大的办公软件 xff0c 默认使用开放文档格式 OpenDocument Format ODF 并支持 docx xlsx pptx 等其他格式 它包含了 Writer Calc
  • 小波变换——哈尔小波,Haar

    哈尔小波转换是于1909年由Alfr d Haar所提出 xff0c 是小波变换 xff08 Wavelet transform xff09 中最简单的一种变换 xff0c 也是最早提出的小波变换 Alfr d Haar xff0c 188
  • 一个字节多少位

    前几天笔试发现这个问题有点模糊 xff0c 囧 xff0c 记录一下 xff1a 1字节 xff08 byte xff09 61 8位 xff08 bit xff09 在16位的系统中 xff08 比如8086微机 xff09 1字 xff
  • java 基础排序(冒泡、插入、选择、快速)算法回顾

    java 基础排序 xff08 冒泡 插入 选择 快速 xff09 算法回顾 冒泡排序 code private static void bubbleSort int array int temp for int i 61 0 i lt a
  • Houdini Python开发实战 课程笔记

    P2 43 P3 43 P4 43 P5 基础 xff1a 1 Houdini中使用Python的地方 2 Textport xff1a 可使用cd ls等路径操作的命令 xff08 命令前加 xff0c 可在python中使用 xff09