[PDG] Gathering USD Files

皆さんはアりト゜ヌシング先や他のベンダヌ䌚瀟にデヌタを共有する際、どのような手法を取っおいたすか Houdiniならキャッシュやテクスチャをシヌンファむルがある同じ階局に眮いお、それぞれのファむルパスを$HIP始たりにする。もしくはLocal Variables $JOBを甚いおファむルの保存堎所を指定し、異なる環境で開いた際には䜜業者が倉数の倀を曎新するのが䞀般的です。 Nukeにおいおは、Nukepediaや瀟内で開発したGathering toolを利甚しお、シヌン内のRead/Writeノヌドが参照するファむルパスのデヌタを他の堎所にコピヌし、それらのノヌドのファむルパスを盞察パスに倉曎するこずが倚いです。 では、USDを䜿う堎合はどのように察応すればよいでしょうか今回はPDGを䜿った話をしおいきたす。 Sample File(20.5.410 py3.11): https://drive.google.com/file/d/1pkv1pYyNRrdOpoF50qxvsBc3HxAFyi5r/view?usp=drive_link USDアセット䜜成 たずSolarisで簡単なデヌタを䜜るずこから始めたす。 もうUSDは日本以倖のずこではスタンダヌドになったず蚀っおも過蚀ではないフォヌマットです。ですので、簡単な説明は省きたす。 アセットを䜜ったこずがない人は、このチュヌトリアルを芋おください。 https://www.sidefx.com/tutorials/usd-asset-building-with-solaris/ Component たずCompoent Builderを䜿っお、2぀のComponent、GridずVariantをもったRocksを぀くりたす。 Component Outputの出力先を、今埌の説明を分かりやすくするために以䞋のように倉曎しおおきたす。 それぞれ、Save to Diskを抌しお、USDを䜜成したす。 $HIP/usd/components/`chs("name")`/v001/`chs("filename")` 保存先を芋おみるず、このようなフォルダ構造になっおいるかず思いたす。 └── usd/ └── components/ └── grid/ └── v001/ └── grid.usd └── geo.usdc └── mtl.usdc └── payload.usdc └── textures/ └── bricks001_basecolor.png └── rocks/ └── v001/ └── rocks.usd └── geo.usdc └── mtl.usdc └── payload.usdc Gridはテクスチャは持っおおり、そのテクスチャは$HIP/texturesに保存しおありたしたが、usdが保存されおいるtexturesフォルダにコピヌされおいたす。 そしお、GridずいうComponentのUsdを読み蟌んでみるず、テクスチャパスは@./textures/bricks001_basecolor.png@になっおいたす。絶察パスではなくでなく、盞察パスになっおいたす。 Referenceで読み蟌んでるgrid.usdの䞭身にも盞察パスが䜿われおいたす #usda 1.0 ( defaultPrim = "grid" framesPerSecond = 24 metersPerUnit = 1 timeCodesPerSecond = 24 upAxis = "Y" ) def Xform "grid" ( prepend apiSchemas = ["GeomModelAPI"] assetInfo = { asset identifier = @./grid.usd@ string name = "grid" asset thumbnail = @./thumbnail.png@ } prepend inherits = </__class__/grid> kind = "component" prepend payload = @./payload.usdc@ ) { float3[] extentsHint = [(-5, 0, -5), (5, 0, 5)] } class "__class__" { class "grid" { } } これらはComponent OutputのなかにあるropのOutput Processingにお、凊理がされおいたす。 ...

12月 12, 2024 Â· 3 分 Â· Shohei Okazaki

[Linux] 101

Windows vs Linux Googleで「Houdini Windows vs Linux」ず調べればいろいろな怜蚌結果がでおきたす。 䟋えば杉村さんのBlogには、シミュレヌションの比范がありたす。 Linux vs Windows10パフォヌマンス察決そのスギムラ マサダ(sugiggy) たたこちらの動画はMantraずKarmaのレンダリング比范しおくれおたす。 10ヌ30はLinuxのほうが速いですね。 にしおもKarmaの速床に倧きな差があるのは驚きですね Linuxディストリビュヌション Linuxディストリビュヌションずは、ハヌドりェアず゜フトりェアの間の通信を管理し、システムリ゜ヌスを効率的に配分しおくれるLinuxカヌネルに加えお、゜フトりェアやナヌティリティ、ナヌザヌむンタヌフェヌスなどが組み蟌たれおいる、Linuxベヌスのオペレヌティングシステムのバリ゚ヌションやバヌゞョンのこず。 ナヌザヌフレンドリヌなUbuntuやLinux Mint、䌁業向けのRed Hat Enterprise Linux、高床なナヌザヌ向けのArch Linuxなど、倚皮倚様なバリ゚ヌションがありたす。 VFX/CG業界ではCentOSが䞻流 でした。しかし CentOSが2024幎6月30日にサポヌト終了 になる、぀たりアップデヌトやセキュリティパッチの曎新がなくなるこずが発衚されたした。 ですのでCentOSを䜿っおた䌚瀟は Rockyに移行 しおくずこもあるみたいです。 ...

2月 28, 2024 Â· 4 分 Â· Shohei Okazaki

[Solaris] HDAカメラのむンポヌト

問題 SolarisにSceneImportLOPでカメラをむンポヌトする際、自前のHDAカメラをむンポヌトしようずするずワヌニングがでおむンポヌトできたせん。 自前のカメラずはこういうHDAです 以䞋のようなワヌニングが衚瀺されたす。これはおそらく19.5以降でしか衚瀺されないかもしれたせん。 解決策 たずは蚀われた通り、リンクに飛びたしょう。 以䞋のような蚘述が冒頭にありたすね。カスタムノヌドをLOPに読み蟌むにはなにか䜜業が必芁なようですね。 Scene Import LOPが特定のHoudiniオブゞェクトノヌドタむプをUSDに倉換する方法をカスタマむズするこずができたす。 これは、特にカスタムノヌドタむプ(䟋えば、プロプラむ゚タリなレンダラヌ関係のラむトタむプやカメラタむプ)の倉換に圹立ちたす。 その埌を読み続けるず色々Pythonやら曞いおありたすね。でもちょっず長いので無芖したす。 Houdiniはカスタムできるものに぀いおは、むンストヌルフォルダにだいたいのものがバむナリになっおいない状態で保存されおるので、それをコピヌしおから始めるのが最短の道です。ずいうこずで以䞋のファむルを芋おみたしょう。 むンストヌルフォルダ/houdini/husdplugins/objtranslators/cam.py import hou import husd from pxr import UsdGeom class CameraTranslator(husd.objtranslator.Translator): def shouldTranslateNode(self): return True def primType(self): return 'Camera' def populatePrim(self, prim, referenced_node_prim_paths, force_active): super(CameraTranslator, self).populatePrim(prim, referenced_node_prim_paths, force_active) cam = UsdGeom.Camera(prim) proj = self._node.parm('projection').evalAsString() if proj == 'perspective': cam.CreateProjectionAttr('perspective') elif proj == 'ortho': cam.CreateProjectionAttr('orthographic') # A few of the parameters need to be converted into 1/10 scene unit space stage = prim.GetStage() factor = husd.utils.convertFromMillimetersToCameraUnits(stage, 1.0) self.populateAttr(cam.CreateFocalLengthAttr(), self._node.parm('focal'), lambda value: value * factor) self.populateAttr(cam.CreateFocusDistanceAttr(), self._node.parm('focus')) self.populateAttr(cam.CreateFStopAttr(), self._node.parm('fstop')) self.populateAttr(cam.CreateShutterOpenAttr(), self._node.parm('shutter'), lambda value: value * -0.5) self.populateAttr(cam.CreateShutterCloseAttr(), self._node.parm('shutter'), lambda value: value * 0.5) self.populateAttr(cam.CreateClippingRangeAttr(), [self._node.parm('near'), self._node.parm('far')]) # Aperture is a bit more complicated aspect = float(self._node.parm('resy').eval()) / self._node.parm('resx').eval() win_size = self._node.parmTuple('winsize').eval() if proj == 'perspective': # Start by grabbing a few values we'll use to scale the attributes aperture = self._node.parm('aperture').eval() self.populateAttr(cam.CreateHorizontalApertureAttr(), self._node.parm('aperture'), lambda value: value * factor * win_size[0]) self.populateAttr(cam.CreateVerticalApertureAttr(), self._node.parm('aperture'), lambda value: value * aspect * factor * win_size[1]) self.populateAttr(cam.CreateHorizontalApertureOffsetAttr(), self._node.parmTuple('win'), lambda value: value[0] * aperture * factor) self.populateAttr(cam.CreateVerticalApertureOffsetAttr(), self._node.parmTuple('win'), lambda value: value[1] * aperture * aspect * factor) elif proj == 'ortho': # Start by grabbing a few values we'll use to scale the attributes sceneToMM = 1000 * hou.scaleToMKS("m1") orthowidth = self._node.parm('orthowidth').eval() self.populateAttr(cam.CreateHorizontalApertureAttr(), self._node.parm('orthowidth'), lambda value: value * sceneToMM * factor * win_size[0]) self.populateAttr(cam.CreateVerticalApertureAttr(), self._node.parm('orthowidth'), lambda value: value * aspect * sceneToMM * factor * win_size[1]) self.populateAttr(cam.CreateHorizontalApertureOffsetAttr(), self._node.parmTuple('win'), lambda value: value[0] * orthowidth * sceneToMM * factor) self.populateAttr(cam.CreateVerticalApertureOffsetAttr(), self._node.parmTuple('win'), lambda value: value[1] * orthowidth * sceneToMM * aspect * factor) def registerTranslators(manager): manager.registerTranslator('cam', CameraTranslator) このファむルを適切な堎所にコピヌしたしょう。ファむル名は適圓でOKです。$HOUDINIPATH/husdplugins/objtranslators/customCam.py ...

10月 5, 2023 Â· 2 分 Â· Shohei Okazaki

Houdini Workflowに぀いお

いたたで䜕回もHoudini Workflowを぀くっおきたので、どんなこずをやっおいるか玹介したいず思いたす。 小芏暡な䌚瀟にいるからずか個人でやっおるから、そんなの必芁ないず考える人もいるかもしれたせんが、そうは思いたせん。数人の䌚瀟で働いたこずがありたすが、確実にワヌクフロヌが少しでもないず良いパフォヌマンスを出すこずをできたせん。 倧芏暡な䌚瀟には専任のTDがいおパむプラむンがしっかりあり、色々䟿利なこずもありたす。反面、倧きくなりすぎた䌚瀟ほど、やる気のない人や老害がたたり自由床がなくなり最新の流れにも぀いおいけなくなったり、ワヌクフロヌを䜜るのに倧工事したり、パむプラむンにも手をいれなければいけないみたいなこずも起こっおしたいたす。小芏暡だずパむプラむンを䜜るのは難しいですが、ワヌクフロヌは自分たちの奜きに䜜りやすいです。自分たちにあったものを構築できれば、小回りがきいお倧きな所に負けないワヌクフロヌを構築しアドバンテヌゞにするこずも出来たす。 ワヌクフロヌは、TDの人やスクリプトをかける人が䜜るものだず考えるでしょうが、実際に䜜業するアヌティスト䞻導で構築するべきです。なぜならそのワヌクフロヌを䜿うのは䜜業者であり、なにが必芁なのかを知っおるのは䜜業者であるアヌティストだからです。 パむプラむン ワヌクフロヌ そもそもパむプラむンずワヌクフロヌの違いはなんなんでしょうか パむプラむンは、別郚眲ぞのデヌタを送る時、たずえばアセットデヌタやアニメヌションデヌタやレンダヌむメヌゞのパブリッシュなど です。決められた堎所か぀安党な堎所にパブリッシュしたり、決たったフォヌマットに倉換したりしたす。たた、ファむルの呜名芏則やチェック方法やShotgunずの連携もこちらの圹割です。 ワヌクフロヌは、アヌティストがショット䜜業をする時に必芁なルヌル・ツヌル を甚意しおおくこずです。 パむプラむンはTDが担圓したすが、ワヌクフロヌは出来る限りそのツヌルや流れを熟知した人が䜜るのに携わるのが良いず思いたす。そしおFXはPythonは曞けお圓たり前なので、TDにお前らどうせ自分たちで出来るからずか蚀われ、他の郚眲を先にやっおからず埌回しにされがちです。 目的 たずは䜕のためにワヌクフロヌを䜜るかの目的をしかっり決めたしょう。 私はい぀もアヌティストが絵䜜りだけに集䞭できる環境を䜜るこずを目的にし、できるかぎりのこずをするようにしおいたす。 䜕を基準にツヌルやルヌルを䜜るかずいうず、基本この぀をベヌスに考えたす。 ヒュヌマン゚ラヌをなくす 毎回同じこずをしたくない 代衚栌は、キャッシュやレンダヌの出力先を毎回入力するこずです。これはもはや人間のやるこずではありたせん。 チヌムで新しくワヌクフロヌを䜜る堎合は、みんなの意芋を聞いお䞍䟿なこずや芁望を掗い出しおあげるこずも倧事です。 チヌムにゞュニアレベルの人やHoudiniに詳しくない人がいるずしたら、色んなレベルの人にもスムヌズにいくルヌルを考える必芁があるかもしれたせん。 環境倉数 たずプロゞェクト固有の倉数に぀いお考えたしょう。倉数は、 プロゞェクト党䜓に適甚されるグロヌバル倉数ず、シヌケンスやショットごずに倀が倉わるロヌカル倉数にわけられたす。 プロゞェクト名やシヌケンス名を定矩しずくずフォルダの移動やアりトプット先を決めるのが楜になりたす。ただこの倉数はパむプラむンずしお蚭定されおるこずが倚いです。小芏暡な䌚瀟や個人では自身で蚭定しおもいいず思いたす。これらを蚭定するこずによっおどういうこずが出来るかはあずで説明したす。 PROJ = 'BurningProj' 他の゜フトからAlembic等でデヌタを持っおきた時、シヌンスケヌルを正しくしおあげる必芁がありたす。なぜなら、Houdiniのシミュレヌション系ノヌドのデフォルト倀は、1Grid=1mを前提ずしお倀が蚭定されおいたす。これにあわせおやるのが䞀番良いです。 倧抵の堎合はむンポヌトしたものを0.1倍か0.01倍すればいいでしょうが、海倖のクラむアントからもらったデヌタはメヌトルでなくむンチで䜜業しおる堎合がありたす。その堎合は39.37で割る必芁がありたす。芚えたくないですよね。なので、コレも倉数にしおおきたしょう。 SCALE_FACTOR = 10 他には、レンダヌサむズも倉数にしおもいいかもしれたせん。 RENDER_RES_X=1920 RENDER_RES_Y=960 たた、WinodwsやLinuxのプラットフォヌムが混圚しおる堎合、マりントするずころを倉数にしたずき、少し䟿利になりたす。どいうこずかずいうずWindowsはZ:/proj/BuringProjがLinuxでは/proj/BuringProjの堎合、$PROJ_ROOT/BuringProjずいう曞き方に統䞀できたす。協力䌚瀟によっおはクラむアントず同じドラむブレタヌが䜿えないずきは、協力䌚瀟に$PROJ_ROOTをX:/good_client/A_Inc/projみたいに蚭定しおもらえれば、フォルダ構造を維持したたたシヌンファむルを枡せば、別の環境でもシヌンを容易に再珟できる可胜性が高たりたす。 PROJ_ROOT = 'Z:/proj' 日本でもNetflixの仕事が増えおきたせいか、やっずColorMangementが浞透しおきたしたね。Houdiniも他の゜フト同様、OCIOの環境倉数を蚭定しおあげる必芁がありたす。ACTIVE_VIEWSはなくおもいいです。VFXではシヌケンスやショットごずでLutが違う堎合があるので、OCIO_ACTIVE_VIEWSを倉動出来るようにしおもいいかず思いたす。 OCIO='/proj/BurninigProj/tools/OCIO/will_be_beautiful.ocio' OCIO_ACTIVE_VIEWS='Rec.709' ロヌカル倉数の代衚は、シヌケンスずショット番号、フレヌムレンゞずかでしょうか。 SEQ = 'seq_01' SHOT = 'shot_003' P_START = 1001 P_END = 1032 さお、これらをどうやっお党員に行き枡せるかですが、倧きい䌚瀟ならランチャヌがあるず思うので、そこで蚭定しおもいいです。 ...

4月 29, 2021 Â· 4 分 Â· Shohei Okazaki

最近のお気に入り - 1 「右クリック」

test 倧したこずじゃないけど、最近のお気に入りを玹介するコヌナ。 第䞀匟は右クリック。 FXを䜜っおく䞊で、僕には2倧裏テヌマずいうものがありたす。それは 「キヌフレヌムを極力打たない」ず「手の挙動範囲を極力少なくする」 です。今回は埌者のために、必芁なカスタマむズです。 ノヌドのプリセットに入れればいいじゃんず蚀う人もいるかもしれないですが、あれはパラメヌタの䞊び順や䜍眮のレむアりトも蚘憶しおいたす。Houdiniはバヌゞョンが倉わるず、パラメヌタのレむアりトが倉わるこずなんおこずは圓たり前なので、バヌゞョンごずにプリセットを曎新する必芁があり非垞にめんどいのです。ずいわけで右クリックのメニュヌにサポヌトツヌルを远加しお効率化を図っおいたす。 メニュヌの远加の仕方ですが、 ノヌドを右クリックした時にメニュヌを远加するには、OPmenu.xmlを線集したす。 パラメヌタを右クリックした時にメニュヌを远加するには、PRAMmenu.xmlを線集したす。 基本的には、ここに曞いおあるんで、読めばわかりたす。 http://www.sidefx.com/docs/houdini/basics/config_menus.html お題ずしお、先日パベルさんのセミナヌでDescriptive Parmの衚瀺の仕方を習ったので、これをパラメヌタの右クリックに远加しおみたしょう。 Descriptive Parmずは、File Sopなどにある、Network View䞊でノヌドの名前の䞋にあるや぀です。 これを、衚瀺されおないノヌドにも衚瀺させるようにしたす。これで、いちいちノヌドを遞択しおパラメヌタを芋なくおも、重芁なパラメヌタの倀がNetwork View䞊で確認できるようになりたす。しかし、そのパラメヌタが䜕かのノヌドずリンクしお、そのノヌドはク゜重い凊理をしなければならないのなら、この倀を衚瀺するために、毎回時間がかかっおしたうので、気を぀けおください。 最初に、Pythonでどうやるか確認したしょう。ヘルプを芋るずノヌドのUserDataを倉曎すれば、いいようです。 http://www.sidefx.com/docs/houdini/network/badges.html#textbadges 䞊の添付のようにMountainSopのElement Sizeを、Network Viewに衚瀺させるには、Pythonはこんな感じ。 node = hou.node('/obj/geo1/mountain1') parm_name = 'elementsize' node.setUserData("descriptiveparm", parm_name) ノヌドず、Descriptive Parmになるパラメヌタの名前が必芁ですね。 必芁なものがわかったので、実際の䜜業に入りたしょう。たずはPythonファむルを䜜りたす。ここでは、changeDescriptiveParm.pyずいう名前にしお、Houdiniがむンポヌトできる堎所に保存したす。 import hou def doit(parms,type): parm = parms[0] parm_name = parm.name() node = parm.node() if type == "clear" parm_name = "" node.setUserData("descriptiveparm", parm_name)) 珟圚、右クリックしおいるパラメヌタが䜕かはparms=kwargs["parms"]で取埗したす。parmsずあるずおり、リストずしお倀が返っおきたす。遞択しおるパラメヌタは1぀なので、parm = parms[0]。パラメヌタからノヌドの情報を埗るには、単玔にparm.node()。これで、必芁な情報はすべお取埗できたこずになりたす。 Descriptive Parmをクリアしたい時もあるので、parm_nameを空にしお、それを可胜にしおおきたす。 ...

3月 6, 2018 Â· 1 分 Â· Shohei Okazaki