Houdini
1771
page-template-default,page,page-id-1771,stockholm-core-1.0.6,select-theme-ver-5.1,ajax_updown_fade,page_not_loaded,vertical_menu_enabled,wpb-js-composer js-comp-ver-5.7,vc_responsive
Làm quen với Houdini
Giao diện căn bản

***Bất kể đang ở mode nào:

  • Navigate trong viewport: giống Maya, orbit: Alt + drag chuột trái, zoom: Alt + drag chuột phải, pan: Alt + chuột giữa.
  • Để select: click chuột trái. Thêm vào tập hợp chọn: kèm phím Shift, loại khỏi tập hợp chọn: kèm phím Ctrl. Toggle chọn: kèm Shift + Ctrl.
  • Trong 3D Scene View:
    • để switch qua Perspective: Spacebar + 1, qua Top: Spacebar + 2, qua Front: Spacebar + 3, qua Side: Spacebar + 4.
    • để home selected: Spacebar + G.
    • để toggle qua hiển thị wireframe: phím W.
  • Trong một số Editor, để bật window với các option về phần display: phím D.
  • Timeline:
    • Play/stop: phím .
    • Trở về frame đầu tiên: Ctrl +.

***Trong 3D Scene View, chỉ hiệu lực ngoài mode Select (bấm Esc):

  • Để trở về home C-Plane: phím H.
  • Để frame all: phím A, frame selected: phím F.
  • Để tilt camera: Ctrl + Spacebar + drag chuột trái.
  • Để toggle giữa single/quad viewports: phím B.

***Trong 3D Scene View, chỉ hiệu lực trong mode Select (phím S):

  • Select all: phím A, hoặc Ctrl + A.
  • Select none: phím N.
3D Scene View, thao tác với vật thể
  • Move (T), Rotate (R), Scale (E)

  • Để tạo camera từ góc hiện tại của viewport: Ctrl + click chuột trái lên icon của camera trên shelf. Tương tự với lights.
Network View, thao tác với node

Trong Network View này cần lưu ý là Houdini có Object (Scene) level, và Geometry (SOP) level.

***Bất kể đang ở level nào:

  • Layout all: phím L.
  • Home all: cũng phím H.
  • Overview network: phím O.
  • Hiện shape palette: phím Z.
  • Hiện color palette: phím C.

 

  • Đi vào trong node (jump down): phím I. Đi ra khỏi node (jump up): phím U.
  • Hiện tab parameter của node hiện tại: phím P.

 

  • Tạo subnet: Shift + C.

***Ở Object (Scene) level:

  • Set cho node thành Display (flag bên phải, màu xanh dương): phím R.
  • Set cho node thành Selectable (flag bên trái, màu xanh lá): phím E.

***Ở Geometry (SOP) level:

  • Set cho node thành Display/render (flag thứ 1 từ phải sang, màu xanh dương): phím R.
  • Set cho node thành Template (flag thứ 2 từ phải sang, màu hồng): phím E.
  • Set cho node thành Bypass (flag thứ 1 từ trái sang, màu vàng): phím Q.
Parameters, thao tác với thông số
  • Để trả một thông số về giá trị mặc định: Ctrl + click chuột giữa lên trên ô thông số.
  • Để set key (animation): Alt + click chuột trái lên ô thông số.
  • Chỉnh thông số theo “ladder” (***insert GIF***).
SOPs / OBJ, nền tảng chính yếu của Houdini

SOPs = Surface Operators

  • Assemble: bước cần thiết sau khi phân một vật thể ra nhiều mảnh. Output là tập hợp những mảnh riêng rẽ rời rạc đã được clean. Thường sẽ chọn option Create Packed Geometry.
  • Attribute Transfer
  • Attribute Wrangle (tương đương với Attribute VOP SOP). Các nhánh con của node này là:
    • Point Wrangle (tương đương với Point VOP).
    • Primitive Wrangle (tương đương với Primitive VOP).
    • Vertex Wrangle (tương đương với Vertex VOP).
  • Blast: dùng để delete.
  • Bound: tạo bounding box hoặc bounding sphere, cả hai đều align với trục toạ độ thế giới, cho input geometry.
  • Connectivity: dựa vào các point/primitive có connect với nhau mà tạo một attribute mới với một giá trị unique cho mỗi phần tử.
  • Connect Adjacent Pieces: tạo ra các đường thẳng (line) nối giữa các mảnh, (lạ lùng) các line này được xem là thuộc dạng polygon. Các line này có thể để một Constraint Network dùng làm glue các mảnh nằm gần nhau lại.
  • Divide: dùng để divide/triangulate các polygon. Có option “Compute Dual“. Node này cũng có thể dùng để smooth (bằng cách subdivide) geometry.
  • Exploded View: đẩy các geometry ra khỏi trung tâm, để visualize các mảnh vỡ.
  • Fuse: dùng để merge (nhưng cũng có thể dùng để split (unique)) các point.
  • Group
  • IsoOffset: chuyển input geometry thành dạng implicit surface, rồi cho phép biến implicit surface đó thành Iso Surface, Fog Volume, SDF Volume, hoặc Tetra Mesh, để dùng tiếp theo trong simulation.
  • IsoSurface: cho phép tạo isometric surface từ implicit function.
  • Null
  • Merge:
  • Object Merge:
  • Scatter: nhận vào surface hoặc volume, từ đó tạo point mới, phân bố các point đó random nhưng tương đối đồng đều (trên surface hoặc trong volume nhận từ input). Với volume thì mật độ phân bố sẽ dựa theo field value.
  • Solver SOP
  • Voronoi Fracture: phân mảnh vật thể theo phương pháp Voronoi. Operator này nhận 2 input chính, thứ nhất là cái mesh gốc, và thứ nhì là tập hợp những điểm để làm tâm của các mảnh vỡ Voronoi.
Thao tác với Volume

Volume trong Houdini bao gồm:

  • Standard Houdini volumes, có 3 loại con:
    • Scalar field (density), ví dụ như smoke.
    • Signed distance field (SDF), ví dụ như chất lỏng.
    • Vector field, ví dụ như gas.
  • OpenVDB volumes.

 

  • Volume Blur
  • Volume Bound
  • Volume Mix
  • Volume Resize
  • Volume Visualization: có thể dùng để visualize multi-volume.
  • Volume Wrangle (tương đương với Volume VOP).
DOPs

DOPs = Dynamics Operators

RBD - Rigid Body Dynamics
Giới thiệu

Rigid-body dynamics (RBD) mô tả chuyển động của các vật thể dưới tác động của ngoại lực, nhưng với giả sử là các vật thể đều “cứng” (rigid), nghĩa là không đàn hồi, không thay đổi hình thù trong suốt quá trình tương tác và chuyển động. Đây là một nhánh được đơn giản hoá của hệ cơ học trong vật lý: giảm bớt độ phức tạp của hệ thống về thành chỉ còn xét translation và rotation của chất điểm quy chiếu.

Trong RBD của Houdini thì solver engine phổ biến nhất có tên là Bullet.

  • Sau khi pack geometry thì trước tiên phải tạo dopnet, có thể trong context “obj”, hoặc trong “obj>geo”.
  • Vào trong dopnet vừa tạo, add “rbdpackedobject“, nhập SOP Path (point về geometry bên ngoài dopnet). Trong tab Bullet Data, có thể switch giữa các loại geometry representation: convex hull, box, sphere, v.v.
  • Tạo “rigidbodysolver“, lưu ý là node này khác với “rbdsolver“.
  • Tạo “gravity“.
  • Tạo “groundplane“.
  • Tạo “merge“, connect “groundplane” và “gravity” vào “merge“.
  • Connect “merge” vào “output“.
Mảnh vỡ theo thuật toán Voronoi

Sơ đồ Voronoi trong toán học có rất nhiều ứng dụng, nhưng riêng ứng dụng mà ta quan tâm trong Rigid-body dynamics, là ứng dụng để tạo mảnh vỡ.

Trong Houdini thì tạo mảnh vỡ theo thuật toán Voronoi có ưu điểm xử lý rất nhanh cùng với Bullet solver, và nhược điểm là các mảnh vỡ nhìn bị đơn giản (đều là convex).

***Một cách để cải thiện độ nghèo nàn hình khối (do sự convexity hoàn toàn) của các mảnh vỡ Voronoi, là bật option Cluster lên. Option Cluster này sẽ gộp một số mảnh gần nhau thành một. Tuy nhiên, ngay cả với option Cluster dành cho các mảnh vỡ Voronoi, thì Bullet Solver sẽ vẫn tạo convex hull quanh những mảnh mới, khiến các mảnh này vẫn có thể “cắn nhau” khi va chạm (là một thuộc tính thường ta muốn tránh trong RBD). Chính vì vậy mà ta mới cần đến Constraint Network.

Constraint Network DOP
  • Constraint Network DOP dùng để ràng các mảnh RBD lại với nhau, thông qua polygon network. Thường là cần SOP Path.
Constraint Relationship
  • Glue Constraint Relationship DOP. Cần nhập Data Name cho chính xác. Hiện tại chỉ hiệu lực với Buller Solver. Nếu Strength = -1 thì liên kết đó sẽ không bao giờ vỡ.
POPs

POPs = Particle Operators

  • popforce:
    • noise
  • popvop
  • popwrangle
Digital Assets

HDA (Houdini Digital Asset) trước kia còn gọi là OTL (Operator Type Library).

ROPs / OUT

ROPs = Render Operators

CHOPs / Motion FX

CHOPs = Channel Operators

VEX, một ngôn ngữ lập trình trong Houdini

VEX = Vector EXpressions.

VOPs (VEX Operators)

VOP là dạng visual programming của VEX.

  • add và multiply
  • bind và bindexport
  • clamp
  • compare
  • constant
  • maximum
  • ramp parameter
  • turbnoise

Một số luật tréo ngoeo trong VEX

_Hằng số: trong VEX không dùng const, thay vào đó có thể dùng macro: #define PI 3.1415926, lưu ý không được có dấu chấm phẩy kết hàng.

_Arguments của hàm: dùng dấu chấm phẩy giữa các arguments khi định nghĩa, nhưng dùng dấu phẩy khi gọi hàm.

_Hàm foreach: tương tự như arguments của hàm, dùng dấu chấm phẩy để iterate: foreach (int num; array) {}, và lưu ý là không có keyword in như trong các ngôn ngữ lập trình khác.

Các hàm thông dụng trong VEX:

addpoint
int addpoint(int geohandle, vector pos)

Để chỉ định pos thì có thể dùng hàm set(vector).

***Tương tự ta có addvertexaddprim:

int addvertex(int geohandle, int prim_num, int point_num)

int addprim(int geohandle, string type)

geoself
int geoself()
Dùng để return handle về geometry hiện tại.

intersect
int intersect(int input, vector orig, vector dir, vector &p, float &u, float &v)

neighbourcount

addvertexneightbours

normalize

pcimport
int pcimport(int handle, string channel_name, <type>&value)

Dùng để import data từ point cloud, nhét data đó vào value đưa ra. Hàm này chỉ có giá trị khi nằm trong vòng lặp cùng với hàm pciterate hoặc pcunshaded.

pciterate
int pciterate(int handle)

Dùng để iterate qua toàn bộ các point tìm thấy được sau khi chạy hàm pcopen. “Handle” được return từ hàm pcopen. Trong quá trình iterate, hàm pciterate sẽ return 1 chừng nào vẫn còn point trong tập hợp, và return 0 khi hết point, nên có thể dùng làm điều kiện dừng cho vòng lặp while.

pcopen
int pcopen(int opinput, string Pchannel, vector P, float radius, int maxpoints)

Hàm này dùng để mở một point cloud, và cho phép access đến những point nằm trong đó. Sau khi mở point cloud thì có thể iterate qua từng point trong tập hợp, dùng hàm pciterate hoặc pcunshaded.

point
<type> point(<geometry>geometry, string attribute_name, int pointnumber)

Đọc giá trị của một attribute của point của một geometry.

***Tương tự ta có vertex, prim, detail.

prim_normal
vector prim_normal(<geometry>geometry, int prim_number, float u, float v)

primintrinsic
<type> primintrinsic(<geometry>geometry, string intrinsic_name, int prim_num)

Các giá trị intrinsic thì tương tự với attribute, nhưng khác ở chỗ là được Houdini compute chỉ khi nào cần, thay vì được lưu trữ.

set

Có rất nhiều dạng, cơ bản là tuỳ theo arguments mà tạo ra một value mới, ví dụ như từ 3 số cấu thành để tạo ra một vector.

volumesample
float volumesample(<geometry>geometry, string volumename, vector pos)

volumegradient
vector volumegradient(<geometry>geometry, string volumename, vector pos)

  • @P, @N, @ptnum, @Cd
  • Một số ghi nhớ:
    • khi lấy thông tin từ ch(“abc”), nếu abc là vector, thì cần dùng chv(“abc”); nếu abc là integer, thì cần dùng chi(“abc”).

***Reserved keywords trong VEX

COPs / IMG

COPs = Compositing Operators

Expression functions

opinputpath(name, index)dùng để return full path của node được connect vào input.

Ví dụ: thay vì point về node cụ thể trong SOP Path thì có thể nhập `opinputpath('.',0)`hay `opinputpath('..',1)`

Các thuật ngữ
  • Centroid: trọng tâm của một vật có mật độ cấu tạo đồng đều.
  • Dual graph.
  • FLIP: Fluid Implicit Particle.
  • Half edges.
  • Implicit surface: là những bề mặt trong không gian Euclid mà có phương trình là F(x, y, z) = 0. Sở dĩ gọi là “implicit” là vì phương trình này không chủ đích để giải ra x, y, hay z, mà để chỉ tập hợp những bộ (x, y, z) là nghiệm của hàm F.
  • PDB (tên gọi khác của Grains Solver): Position Based Dynamics.
  • Voxel: tương đương với pixel, nhưng trong không gian 3 chiều.
Extras
  • Chuyển VEX code ra external so với Houdini, và compile (dùng Shell và vcc).