「チュートリアル 8: 古い V1 と新しい V2 Python インタフェースを組み合わせる方法」ビデオでは、古いオブジェクト vrNodePtr
と新しいオブジェクト vrdNode
の間の相互運用の例について説明します。
ビデオ キャプション: 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
クラスで定義されている任意の関数を呼び出すことができるようになりました。vrdNode
は vrdTransformNode
から関数を継承するので、そこから任意のトランスフォーム操作を呼び出すこともできます。
API バージョン 1 と 2 の関数は同じスクリプトで使用できますが、パラメータまたは新しい vrdNode
として NodePtr
クラスを使用します。通常は、非常に混乱するのですが、オートデスクのエンジニアが両方の API を変更したため、関数内で両方のタイプのノードを受け入れるようになりました。通常は vrdNode
を想定している関数で NodePtr
を使用しても、その逆でもまったく問題ありません。これにより、ノードが正しいかどうかを心配する必要はなくなります。この例では、新しいノードを作成し、その親ノードを指定できます。両方のタイプのノードをパラメータとして使用しても、エラーが表示されないことが分かります。
もちろん、NodePtr
を vrdNode
に変換しても問題はありません。この操作を行う 2 つの関数が存在することがドキュメントに記載されていますが、覚えやすいわけではありません。新しい vrdNode
から古い NodePtr
に変換する際には、vrdNode
の object ID をパラメータとした toNode
関数を使用します。これにより、vrdNode
が NodePtr
に変換されます。逆の方法は、vrNodeService
クラスから getNodeFromId
関数を呼び出すことによって行われます。これは、パラメータとして NodeId
を使用して行うこともできます。しかし今回は、異なる関数を使用して ID を取得します。この変換が必要な場合は、ドキュメントを参照してください。不明な点があれば必要に応じてドキュメントを参照しながら進めるようにしてください。
API バージョン 2 でも、ソフトウェアの開発に役立つ新しいデータ タイプが導入されました。たとえば、「transform operations」はすべて「QT vector」タイプを使用するようになりました。使い方は難しくありません。ほとんどの場合、新しいベクトル 3D タイプの例のように、別々に使用していた値を新しいデータ タイプに入れるだけです。
カラー タイプには、オブジェクトの作成に役立つ静的関数があり、RGB や HSV などのさまざまなカラー フォーマットも提供します。これらのタイプは既定で VRED ネームスペースに既に追加されているため、読み込む必要はありません。新しいデータ タイプを網羅したチュートリアルが用意されていますので、このトピックについての詳細は、そちらをご覧ください。
現在、スクリプトでは vrNodePointer
と vrdNode
の両方が完全に有効です。どちらか一方を使いたいというユースケースもあるでしょう。これは、単に使用しやすいためです。または、新しい API で vrdNodePointer
のすべての関数を置き換える準備が整っていないためです。
その良い例が、マテリアルを扱う場合です。マテリアルの設定と取得は、vrNodePointer
でのみ行うことができ、vrdNode
では行えません。しかし、今後のリリースでは、vrMaterialService
のような関数が出てくると思います。時間の経過とともに、確実に古い API から新しい API にフォーカスが移っていくため、可能な限り API バージョン 2 を使用する必要があります。
今日の、古い API バージョン 1 と新しい API バージョン 2 についての説明は以上です。これで、2 つの API を組み合わせて効率的で将来の検証を目的としたスクリプトを作成する方法について理解が深まったと思います。ご視聴いただき、ありがとうございました。またお会いしましょう。
「チュートリアル 8: 古い V1 と新しい V2 Python インタフェースを組み合わせる方法」のビデオ用の Python スクリプトの例を示します。
以下のファイルが含まれた ZIP ファイルをダウンロードするには、ここをクリックしてください。
# 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()
# 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")
# 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())