首页 > 其他分享 >Houdini HDK踩坑记录

Houdini HDK踩坑记录

时间:2023-06-12 17:56:55浏览次数:36  
标签:cmake 记录 python Houdini HDK houdini HOUDINI

Houdini HDK踩坑记录

Houdini HDK编译

cmake 构建

根据官方的教程,我们可以使用cmake对HDK项目进行构建,官方文档之中有详细的介绍。官方推荐使用的VS2019,但是目前Houdini19.5是支持VS2022的(可以编译后识别到)。

# Specify the minimum required version of CMake to build the project.
cmake_minimum_required( VERSION 3.6 )
#need to add to find the HoudiniConfig.cmake
list( APPEND CMAKE_PREFIX_PATH  "${HOUDINI_PATH}\\toolkit\\cmake")
project( My_HDK_Project )
# Locate Houdini's libraries and header files.
# Registers an imported library target named 'Houdini'.
find_package( Houdini REQUIRED )
# Add a library with two source files.
set( library_name SOP_Star )
add_library( ${library_name} SHARED
    SOP_Star.C
    SOP_Star.h
)
# Link against the Houdini libraries, and add required include directories and compile definitions.
target_link_libraries( ${library_name} Houdini )
# Configure several common target properties, such as its output directory.(Such as output pah)
houdini_configure_target( ${library_name} )

HOUDINI_PATH改为houdini的所在路径,即可接入houdini hdk

详情可以参考一下博客:https://yaksue.blog.csdn.net/article/details/111277070

xmake 构建

感谢星姐提的issue,这个我们就可以使用下面的代码调用cmake从而将houdini hdk的依赖加入

add_requires("cmake::Houdini", {alias = "houdini", system = true, configs = {search_mode = "config",link_libraries = "Houdini",envs = {CMAKE_PREFIX_PATH = "HOUDINI_PATH\\toolkit\\cmake"}}})

HOUDINI_PATH改为houdini的所在路径,即可接入houdini hdk

但是xmake不能调用cmake函数,所以并不能调用houdini_configure_target这个函数一键配置,但是我们可以手动设置输出目录,根据Houdini的DSO插件的官方文档,我们一般使用用户文档目录下的dso目录C:\Users\Ligo\Documents\houdini19.5\dso

set_targetdir("C:\\Users\\Ligo\\Documents\\houdini19.5\\dso")

DLL依赖

之前一直遇到一个BUG就是Houdini怎么也识别不出编译出来的SOP_xxx.dll,后面发现是dll依赖并没有找到,我们可以在vspowershell中使用如下命令

dumpbin /dependents file_name

找到dll依赖,并把dll依赖放在同一目录下(或者环境变量之中)。如下图:

image-20230612135036496

Houdini Python

Houdini的python路径在HOUDINI_PATH\\pythonxx(Houdini19.5使用的是python3.9)。

Houdini python添加第三方库

  1. 首先下载gei-pip.py,然后放在对应python版本的目录
  2. 在python版本的目录运行pythonxx.exe get-pip.py
  3. 然后就可以在运行命令pythonxx.exe -m pip install xxx

HDK调用python

根据HDK的官方文档PY_Python.h,我们可以使用以下函数在HDK实现C++调用python代码/文件。

// init python interpretion(must be called firstly)
PYsetAutoInitializeFromPython(false);
// according to file_name and args (return a new running thread)
PYrunPythonStatementsFromFileInNewThread(const char *file_name, UT_String &errors)
// same as above,but python_code is the code string
PYrunPythonStatementsInNewThread (const char *python_code, UT_String &errors)

Houdini HDK Debug

根据这个教程,我们可以使用VS对Houdini HDK进行Debug

  • 首先我们使用上述方法编译一个DLL,然后打开Houdini(保证Houdini识别的到dll)

    VS的编译模式要选择RelWithDebInfo模式,首先是因为HDK不支持debug模式(用debug会产生一些debug依赖库xxxxd.dll,但是Houdini的环境之中并没有,从而导致识别不了),然后是因为release模式并没有生成调试信息。

  • VS在代码之中打一个断点,然后调试使用附加到进程并找到Houdini的进程(如果出现识别到python进程,可以将调试类型设置为native)

    image-20230612100106439

  • 一般上述两步即可以进行调试,我们还可以houdini.env文件之中添加环境变量来获得更多的信息

    • HOUDINI_COREDUMP:从而在开启debug时候,如果houdini出现了崩溃可以及时反馈以及调试
    • HOUDINI_DSO_ERROR:打印与DSO相关的错误信息(具体看官方文档)
    #Setting this environment variable to 1 is useful for debugging HDK crashes.
    HOUDINI_COREDUMP=1
    #The existence of the variable in the environment (or setting its value to 1) will cause dynamic linking errors to be output.
    #Setting the value to 2 will cause more verbose errors to be printed.
    #Setting the value to 3 will cause all DSO related messages to be #printed.
    #Setting the value to 4 will cause timing messages to be printed.
    HOUDINI_DSO_ERROR=2 
    

Hoduini UDIM

UDIM(U-Dimension):它允许纹理贴图被被分割成多个独立的贴图,每个图块都有自己的编号。优势在于可以将一个大的纹理贴图分割成多个小的图块,这样可以更好地管理和组织纹理贴图,并且可以每个图块都可以独立加载和渲染。

一般用数字表示,在Houdini上使用1001,1002。UV坐标就不会被限定到[0,1]区间之间,我们可以使用更为广阔的坐标区间,容易下图中左下角从(0,0)开始。

image-20230612151821622

在Houdini使用UDIM:

  • 在Mat视图上创建principledshader节点,在Texture那一栏中勾选Use Texture,Texture输入纹理所在的路径,加上<UDIM>标记(文件名也带有1001,1002等)

  • 在geo视图上创建material节点,然后material中引用创建的principledshader,最后如下图

    image-20230612152516326

    image-20230612152529743

    image-20230612152740027

标签:cmake,记录,python,Houdini,HDK,houdini,HOUDINI
From: https://www.cnblogs.com/Ligo-Z/p/17475723.html

相关文章

  • boot+mp搭建版本踩坑记录
    最近项目搭建中遇到的一些问题,涉及到mp版本swagger集成等文章目录前言一、引入mp启动报错1相关配置2报错如下3解决方案二、引入swagger1引入的pom2报错如下:3解决方案三.项目启动自动打开swagger页面总结前言由于使用高版本springboot导致集成遇到的一些问题一、引......
  • Swin UNETR 训练记录
    SwinUNETR训练记录记录一下跑通的第二个模型吧~~~这次的模型是SwinUNETR(SwinUNEtTRansformers),是由NIVIDIA研究人员在计算机视觉和模式识别会议(CVPR)上发表的。SwinUNETR采用了MONAI,一种开源的PyTorch框架,由学术界和行业领袖构建的免费、社区支持的计划,旨在将医......
  • linux不记录历史命令
    history命令是被保存在内存中的,当退出或者登录shell时,会自动保存或读取。在内存中,历史命令仅能够存储1000条历史命令,该数量是由环境变量HISTSIZE进行控制。默认是不显示命令的执行时间,命令的执行时间,history已经记录,只是没有显示。#不记录命令exportHISTSIZE=0#恢复命......
  • 【React工作记录一百】前端小知识点扫盲笔记记录5
    前言我是歌谣放弃很容易但是坚持一定很酷微信公众号关注前端小歌谣带你进入前端巅峰交流群今天继续对前端知识的小结事件委托<!DOCTYPEhtml><htmllang="en"> <head> <metacharset="UTF-8"/> <metahttp-equiv="X-UA-Compatible"content="IE=edge"/&g......
  • 【React工作记录一百零一】再次接触老朋友react+ant design table合并单元格
    前言大家好我是歌谣今天继续开发一个需求就是我们的大屏需求今天让我们一步步解决所遇到的问题第一个功能如何渲染参照官网案例constdataSource=[{key:'1',name:'胡彦斌',age:32,address:'西湖区湖底公园1号',},{key:'2',nam......
  • 【React工作记录九十九】ant design mobile实现tab滚动效果和闪屏小记
    前言大家好我是歌谣今天继续给大家带来前端工作中遇到的实际性问题如何实现一个tab效果以及闪屏问题效果演示(tab滚动效果)案例遇到问题先去查api查百度一开始我以为是安卓的功能直接api打开<DemoBlocktitle='超长自动滚动'padding='0'><TabsdefaultActiveKey=......
  • Windows驱动开发学习记录-ObjectType Hook之ObjectType结构相关分析
    1、目的  在一般情况下,对于系统的常规操作如创建进程、创建互斥体、创建文件等可以进行SSDTHook进行拦截,但在x64位系统下,有PG的保护,常规的SSDTHook会导致蓝屏。但基于ObjectType的一些Hook也可以做到相应的功能且不会导致系统BSOD。 2、相关结构分析2.1XP上的相关结构......
  • react antd 表头分组渲染的问题记录
    importReact,{useEffect}from'react'import{observer}from'mobx-react'import{get}from'lodash'import{Modal}from'antd'importSelfTablefrom'@/view/common/self_table/self-table'impo......
  • DevOps落地实践点滴和踩坑记录-(2) -聊聊企业内部DevOps平台建设
    很久没有写文章记录了,上一篇文章像流水账一样,把所见所闻一个个记录下来。这次专门聊聊DevOps平台的建设吧,有些新的体会和思考,希望给正在做这个事情的同学们一些启发吧。DevOps落地实践点滴和踩坑记录-(1)企业落地DevOps该买商用还是自己研发呢?很多团队刚开始都会问这个问题,我的回......
  • 用日志记录Linux用户执行的每一条命令(history)
    工作中,需要把用户执行的每一个命令都记录下来,并发送到日志服务器的需求,为此我做了一个简单的解决方案。这个方案会在每个用户退出登录时把用户所执行的每一个命令都发送给日志守护进程rsyslogd,你也可通过配置“/etc/rsyslog.conf”进一步将日志发送给日志服务器第一种方法第二种......