チュートリアル 8: 古い V1 と新しい V2 Python インタフェースを組み合わせる方法

チュートリアル 8: 古い V1 と新しい V2 Python インタフェースを組み合わせる方法」ビデオでは、古いオブジェクト vrNodePtr と新しいオブジェクト vrdNode の間の相互運用の例について説明します。

サンプル スクリプトをダウンロードする

サンプル スクリプトに移動する

チュートリアルの PDF をダウンロードする

ビデオ キャプション: VRED Pro の新しい Python チュートリアルへようこそ。Christopher といいます。今日は、Python API バージョン 1 とバージョン 2 のさまざまなデータ タイプと関数を組み合わせる方法について説明します。

API バージョン 2 リリースでは、VRED でデータを操作する方法にいくつかの大きな変更が加えられました。モジュールを使用する代わりに、関数がいわゆるサービスに統合されるようになりました。たとえば、vrCameraService または vrNodeService には、以前に vrCamera および vrNodePtr で使用できたメソッドがすべて含まれるようになりました。これらのサービスは、API バージョン 1 のほとんどの関数を置き換えますが、すべてではありません。API バージョン 1 でのみ使用できる関数がいくつかあります。また、API バージョン 1 と互換性のあるデータを期待するインターフェースを持つ、古い API を使用するプラグインやスクリプトがあるかもしれません。そのため、古いスクリプトやプラグインと開発中の新しいスクリプトがうまく動作するように、両方の API の関数やデータ タイプを組み合わせなければならない場合があります。

まず、最も大きな違いから始めましょう。ノードの処理についてです。バージョン 1 では、いわゆるノード ポインタを使用して、トランスフォーム ノード、グループ ノード、ジオメトリ ノードなどのノードと対話しました。vrScenegraph モジュール findNodes の関数を使用してシーン内のノードを検索でき、この関数は vrNodePointer を返します。このノード ポインタを使用して、ドキュメントに示されている vrNodePointer クラスの一部である任意の関数を呼び出すことができます。たとえば、すべてのトランスフォーム操作、マテリアルの設定または取得、シーングラフへの子の追加などです。

API バージョン 2 の導入に伴い、オートデスクは、古い vrNodePointer をある程度拡張することを目的とした、いわゆる vrdNodeType と、それを操作するのに役立つ vrNodeService クラスを導入しました。vrNodeService から呼び出されると、findNode 操作は vrdNode を返し、vrNodeService.findNode を使用して呼び出すことができます。この方法なら、スクリプト内のこれらの類似する関数を混同することはありません。サービスによって返される vrdNode を使用して、vrdNode クラスで定義されている任意の関数を呼び出すことができるようになりました。vrdNodevrdTransformNode から関数を継承するので、そこから任意のトランスフォーム操作を呼び出すこともできます。

API バージョン 1 と 2 の関数は同じスクリプトで使用できますが、パラメータまたは新しい vrdNode として NodePtr クラスを使用します。通常は、非常に混乱するのですが、オートデスクのエンジニアが両方の API を変更したため、関数内で両方のタイプのノードを受け入れるようになりました。通常は vrdNode を想定している関数で NodePtr を使用しても、その逆でもまったく問題ありません。これにより、ノードが正しいかどうかを心配する必要はなくなります。この例では、新しいノードを作成し、その親ノードを指定できます。両方のタイプのノードをパラメータとして使用しても、エラーが表示されないことが分かります。

もちろん、NodePtrvrdNode に変換しても問題はありません。この操作を行う 2 つの関数が存在することがドキュメントに記載されていますが、覚えやすいわけではありません。新しい vrdNode から古い NodePtr に変換する際には、vrdNode の object ID をパラメータとした toNode 関数を使用します。これにより、vrdNodeNodePtr に変換されます。逆の方法は、vrNodeService クラスから getNodeFromId 関数を呼び出すことによって行われます。これは、パラメータとして NodeId を使用して行うこともできます。しかし今回は、異なる関数を使用して ID を取得します。この変換が必要な場合は、ドキュメントを参照してください。不明な点があれば必要に応じてドキュメントを参照しながら進めるようにしてください。

API バージョン 2 でも、ソフトウェアの開発に役立つ新しいデータ タイプが導入されました。たとえば、「transform operations」はすべて「QT vector」タイプを使用するようになりました。使い方は難しくありません。ほとんどの場合、新しいベクトル 3D タイプの例のように、別々に使用していた値を新しいデータ タイプに入れるだけです。

カラー タイプには、オブジェクトの作成に役立つ静的関数があり、RGB や HSV などのさまざまなカラー フォーマットも提供します。これらのタイプは既定で VRED ネームスペースに既に追加されているため、読み込む必要はありません。新しいデータ タイプを網羅したチュートリアルが用意されていますので、このトピックについての詳細は、そちらをご覧ください。

現在、スクリプトでは vrNodePointervrdNode の両方が完全に有効です。どちらか一方を使いたいというユースケースもあるでしょう。これは、単に使用しやすいためです。または、新しい API で vrdNodePointer のすべての関数を置き換える準備が整っていないためです。

その良い例が、マテリアルを扱う場合です。マテリアルの設定と取得は、vrNodePointer でのみ行うことができ、vrdNode では行えません。しかし、今後のリリースでは、vrMaterialService のような関数が出てくると思います。時間の経過とともに、確実に古い API から新しい API にフォーカスが移っていくため、可能な限り API バージョン 2 を使用する必要があります。

今日の、古い API バージョン 1 と新しい API バージョン 2 についての説明は以上です。これで、2 つの API を組み合わせて効率的で将来の検証を目的としたスクリプトを作成する方法について理解が深まったと思います。ご視聴いただき、ありがとうございました。またお会いしましょう。


Python サンプル コード

チュートリアル 8: 古い V1 と新しい V2 Python インタフェースを組み合わせる方法」のビデオ用の Python スクリプトの例を示します。

ヒント:

以下のファイルが含まれた ZIP ファイルをダウンロードするには、ここをクリックしてください。

deprecated_examples.py

# Deprecated API v1 functions

# vrCamera
addViewPoint("New Viewpoint")

vrCameraService.createViewpoint('New Viewpoint')

# vrOSGWidget
createBackplate('filePath')
setBackplate('filePath')
deleteBackplate()

vrSceneplateService.createNode()  # TODO Parameter prüfen

# vrRenerSettings
setRaytracingAAThreshold()

difference_nodes_v1_v2.py

# Node pointers with API v1

# Find node "EXT" with API v1
extNodePtr = findNode("EXT")

# set translation
extNodePtr.setTranslation(0,0,38)

# get translation
translation = extNodePtr.getTranslation()
print("Translation:", translation)

# set name
extNodePtr.setName("Another EXT")



# Node pointers with API v2

# Find node "EXT" with API v2
ext`VrdNode` = `vrNodeService.findNode`("EXT")

# set translation
translationVector = QVector3D(0,0,38)
ext`VrdNode`.setTranslation(translationVector)

# get translation
translation = ext`VrdNode`.getTranslation()
print("Translation:", translation)

# set name
ext`VrdNode`.setName("Another EXT")

node_examples.py

# Example 1.0
# Finding Nodes

# Finding nodes with API v1 and v2
study_NodePtr = findNode('Study_Transform')
study_`vrdNode` = `vrNodeService.findNode`('Study_Transform')

# Example 2.0
# Using API v1 functions with `vrdNode`s
createNode("Group", "Interieur_nodePtr", study_NodePtr)
print("Created new group with nodePtr")

createNode("Group", "Interieur_`vrdNode`", study_`vrdNode`)
print("Created new group with `vrdNode`")

updateScenegraph(True)


# Using API v2 functions with `vrNodePtr`s
interieur_NodePtr = findNode('Interieur_nodePtr')

childIndex = study_`vrdNode`.getChildIndex(interieur_NodePtr)

print("Interieur Node is at index:", childIndex)


# Example 3.0
# Convert from nodePtr to `vrdNode`
targetNodePtr = findNode("Target")
targetNode = `vrNodeService`.`getNodeFromId`(targetNodePtr.getID())

# Convert from `vrdNode` to nodePtr
targetNodePtr = toNode(targetNode.getObjectId())