6
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

osd_limit VEX Function(Houdini 20.5 NEW)に触れてみた

Last updated at Posted at 2025-12-15

この記事はHoudini Apprentice アドベントカレンダー2025 16日目の記事です。

はじめに

アドカレの締め切りを意識すると、年の瀬を感じる体になってしまいました。
今年はHoudini21のリリースがホットな話題だったと思います。
Houdini HIVE TOKYOに参加して刺激を受けたので、H21 H20.5で新実装されたVEX関数をお題にしてみます。
(注:H21ではなく事実上H20.5でした)

この記事で紹介する内容

Houdini21から追加された osd_limitsurface 関数の紹介と、使用例を作ります。

作業環境

Houdini indie 21.0.559 Py3.11

参考記事

公式ドキュメント
https://www.sidefx.com/ja/docs/houdini/vex/functions/osd_limitsurface.html
Houdini HIVE TOKYO 2025
https://youtu.be/102sG5cjDiA?si=tvJD1mlSQRxCYiWn

osd_limit functionとは

ドキュメントを読んでみる

何はなくとも公式ドキュメントを読みます。

osd_limitsurfaceは、サブディビジョンサーフェスとして指定されたジオメトリ内のPointアトリビュートを評価します。

な・る・ほ・ど
わからん…

int  osd_limitsurface(<geometry>geometry, string attrib_name, int patch_id, float u, float v, <type>&result)
int  osd_limitsurface(<geometry>geometry, string attrib_name, int patch_id, float u, float v, float &result[])

引数がUV座標になっている点が目に留まります。
patch_id, u, v は、primのuvではなく、OSD patch 上の (u,v) なので注意。

続いて記述例もみていきます。

// Examples
// サブディビジョンメッシュの境界サーフェス上にポイントクラウドを生成します。
int npatches = osd_patchcount(file);
for (int patch = 0; patch < npatches; patch++)
{
    for (int v = 0; v < 100; v++)
    {
        vector P;
        if (osd_limitsurface(file, "P", patch, nrandom(), nrandom(), P))
        {
            int ptid = addpoint(geohandle, P);
        }
    }
}

内容の把握

では早速サンプルを試してみましょう。

正四面体を作ります。
image.png
サブディビジョンをかけた結果です。
image.png
osd_limitsurfaceを使用した結果です。
image.png
サブディビジョン後の面にポイントが配置され、

サブディビジョンサーフェスとして指定されたジオメトリ内のPointアトリビュートを評価 

した結果が取得できました。

つまり、対象メッシュのOpen SubDivisionの「無限分割後(限界境界面)と同じ位置・法線・距離(交差)」の情報を取得(評価)できるという関数です。
同様の処理は世界中の現場で使われていると思うのですが、恥ずかしながら知らなかったです。

利点

メッシュ解像度や分割回数の概念がなくなり、位置・法線・傾斜などの判定(評価)に使えます。

RayやHeightField変換の結果はメッシュ解像度に依存し、場合によっては局所的な段差などのノイズが発生しますが、osd_limitsurfaceを用いることで正確な結果を高速に得ることができます。

使い方

実際にHoudiniでみていきます。

まず入力メッシュをWrangle(Run over point)につなぎ、公式ドキュメントのサンプルを参考に入力します。
image.png
これでlimit surfaceにポイントを作成できました。
image.png
サンプルコードは入力ジオメトリを維持しているため、結果から除外します。
image.png
(このあたりの処理はお好みで)
image.png
ポイントだけになりました。
image.png

使用例

簡単に思いつくものをあげてみます。

粗い地形への配置物

大規模な地形メッシュは粗いことがあります。
そのままポイントをメッシュの上に散布すると、
image.png
レンダリング時にサブディビジョン後の結果から浮いてしまいます。
image.png
limit surfaceを用いることでサブディビジョン後の限界境界面に配置できます。
image.png

Ray使用時のコリジョン境界の精度を向上させたりもできそうです。
分割数を上げたい場面でかなり汎用的に役立つと思います。

おわりに

今回のネタは参考記事にあるHoudini HIVEで聴講したYunus Balcioglu氏のおかげでした。
過去の受講時は手書き実装で理解が不十分だったものを学びなおす機会になりました。

毎年アドカレのおかげで確実に新しい学習ができてありがたいです!
(これぞアドカレ効果!)

最後までお読みいただきありがとうございました。
来年もよいHoudini lifeを!

6
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?