Houdini 20.0 hapi HAPIクックブック

入力メッシュを作成する

On this page

概要

このサンプルのコードでは、Houdiniで入力SOPノードを作成し、そこにメッシュのキューブが格納されるように設定する方法について説明しています。

Note

私どもはPythonリストの代わりにnumpy配列を受け取る_npバージョンの関数をいくつか使用しています。

コードを実行する方法

  1. 以下のコードを新しいファイル(hapi_createmesh.py)にコピーします。

  2. Houdiniのコマンドラインツールがセットアップされたシェルを開きます。

  3. hython hapi_createmesh.pyを実行します。

  4. hapi_createmesh.bgeo.scという出力ファイルが生成されたことを確認します。

サンプルコード

import hapi
import numpy

# インプロセスでHAPIセッションを作成します。
# Houdini SessionSyncなどのリモートセッションが利用可能であれば、そのセッションに接続することも可能です。
# 例:
# session = hapi.createThriftSocketSession("localhost", 9090)
session = hapi.createInProcessSession()

# デフォルトのクックオプションでセッションを初期化します。
options = hapi.CookOptions()
hapi.initialize(session, options)

# テストジオメトリ用に頂点位置を定義します。
vertexPositions = numpy.array([-0.5, -0.5, -0.5,
                0.5, -0.5, -0.5,
                0.5, -0.5,  0.5,
               -0.5, -0.5,  0.5,
               -0.5,  0.5, -0.5,
                0.5,  0.5, -0.5,
                0.5,  0.5,  0.5,
               -0.5,  0.5,  0.5])

# テストジオメトリ用のフェース情報と頂点情報。
vertexIndices = numpy.array([
    1,5,4,0,2,6,5,1,3,7,6,2,0,4,7,3,2,1,0,3,5,6,7,4])
faceCounts = numpy.array([4, 4, 4, 4, 4, 4])
nVerts = len(vertexPositions)//3
nFaces = len(vertexIndices)//4

# ジオメトリの格納先となる入力ノードを構築します。
input_id = hapi.createInputNode(session, "input_node")
geo_info = hapi.getDisplayGeoInfo(session, input_id)

# パート情報を構築し、それをジオメトリ情報に格納します。
# これは、PythonからHAPI構造体へのアクセスがどのように見えるのかを示した例です。
# Pythonには、すべてのフィールドをデフォルトで初期化できるように構造体に対してコンストラクターが用意されています。
# これらのフィールドは、オブジェクトのプロパティとしてアクセスすることができます。
part_info = hapi.PartInfo(
    vertexCount = len(vertexIndices),
    faceCount = nFaces,
    pointCount = nVerts,
    type = hapi.partType.Mesh)

hapi.setPartInfo(session, geo_info.nodeId, 0, part_info)

# Pアトリビュートのアトリビュート情報を定義します。
p_info = hapi.AttributeInfo(
    exists = True,
    owner = hapi.attributeOwner.Point,
    count = nVerts,
    tupleSize = 3,
    storage = hapi.storageType.Float,
    originalOwner = hapi.attributeOwner.Invalid)

# Pアトリビュートをジオメトリに追加することができます。
hapi.addAttribute(session, geo_info.nodeId, 0, "P", p_info)

# さらに、入力配列から抽出したい値の数をHAPIに伝える必要があります。
# HAPIは、その総数以下の分だけ値を使用することができます。
hapi.setAttributeFloatData_np(session, geo_info.nodeId, 0, "P", p_info,
    vertexPositions, 0, nVerts)

# ジオメトリ自体にフェース情報と頂点情報を設定します。
hapi.setFaceCounts_np(session, geo_info.nodeId, 0, faceCounts, 0,
    len(faceCounts))
hapi.setVertexList_np(session, geo_info.nodeId, 0, vertexIndices, 0,
    len(vertexIndices))

# すべてのジオメトリ変更がHoudiniに反映されるようにそれらの変更を確定します。
hapi.commitGeo(session, geo_info.nodeId)

# ジオメトリをディスクに保存するようにノードに要求することができます。
hapi.saveGeoToFile(session, geo_info.nodeId, "hapi_createmesh.bgeo.sc")

HAPIクックブック