チュートリアル 3: VRED Core の設定なしで使用できる機能を使用する方法

チュートリアル 3: VRED Core の設定なしで使用できる機能を使用する方法について説明します。

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

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

ビデオのキャプション: VRED Core のチュートリアル シリーズのビデオへようこそ。Christopher といいます。本日は、ストリーミングやバッチ レンダリング、データの準備など、VRED Core の主な機能の使用方法を紹介します。簡単に言えば、VRED Core は、VRED Pro と同じレイトレーシング エンジンとツールを使用するため、VRED Pro のほとんどの機能を提供します。違いは、シーン内のデータを操作するためのグラフィカル ユーザ インタフェースがないことだけです。これは、一方のエンドでデータを入力し、もう一方のエンドでプロセス データを出力する自動化タスクに最適です。

このビデオでは、VRED Core を使用して目的を達成する方法と、その機能の利用方法について説明します。

VRED Core 自体にはグラフィカル ユーザ インタフェースはありませんが、プレゼンテーションやデザイン レビューに役立つストリーミング アプリが付属しています。ブラウザを使用して、同じデバイスからアクセスしたり、複数の異なるデバイスからネットワーク経由で同時にアクセスしたりできます。つまり、複数のユーザが、タブレットやスマートフォン、PC などを使用して VRED Core の同じインスタンスに接続できます。

ストリーミング アプリを使用すると、シーン内を自由に移動したり、ビューポイント間を移動したりできます。これは、VRED Pro でマウスを使用してナビゲートする場合と同様に機能します。また、シーン内で既に定義されているバリアント セットを選択したり、アニメーションを再生したり、マテリアルを変更したり、ジオメトリを切り替えたりすることができるメニューもあります。

設定メニューを使用して、フレームレート、解像度、およびアンチエイリアシングやレイトレーシングなどのレンダリング設定を調整できます。

ストリーミング アプリには Python ターミナルも用意されており、単純な Python コマンドや、より複雑なスクリプトを実行して、他の方法でシーンを操作することができます。ストリーミング アプリを開くと、立方体が含まれた新しいシーンをロードする小さなスクリプトが既に用意されています。

ストリーミング アプリを使用するには、VRED Core の基本設定で Web インタフェースを有効にする必要があります。ここでは、ポート番号、許可されるホストを定義し、認証システムを設定することもできます。初めてストリーミングをテストする場合は、既定の設定で問題ありません。セットアップが完了したら、VRED Core がバックグラウンドで実行されている間に、ブラウザに localhost: および選択したポート番号を入力してストリーミング アプリにアクセスできます。

シーンを操作するユーザ インタフェースがないため、ほとんどの場合、Python スクリプトを使用してシーンを操作します。基本的に、Python スクリプトを使用するとシーンのあらゆる側面を変更および操作できます。Python スクリプトについては一連のシリーズがあり、VRED Pro で使用可能なすべての Python インタフェースについて説明しています。このチュートリアルでは詳しく説明しませんが、ここで説明する概念ごとに、Python スクリプティング チュートリアルに詳細な説明が記載されています。

Python の概念とユース ケースのほとんどは VRED Core で使用できます。これは、内部のエンジンが基本的に同じで、同じ Python API を提供するためです。

VRED Core で使用できる Python インタフェースを簡単に確認してみましょう。最初に、-pre-post の Python コマンド ライン パラメータについて説明します。これらは、コマンド ラインから VRED Core を起動するときに使用でき、シーンがロードされる前または直後に Python を実行できます。単純な印刷コマンドを使用してテストすると、コマンド ライン ウィンドウでスクリプトがどのように実行されるかを確認できます。

レンダリングやデータ変換など、ほとんどの自動化タスクでは、-pre または -post Python を使用してタスクを開始します。また、ポスト ケースでは、-post Python はシーンのロードが完了した後に実行されるため、正しいパラメータです。

これらのパラメータはどちらも、セミコロンで区切ることによって複数の Python コマンドを呼び出すことができます。これは最大で 3 つまたは 4 つの Python コマンドに最適ですが、この方法を使用してより長いスクリプトを実行すると、問題が発生する場合があります。Python はコードに論理構造を提供するために空白に大きく依存しているため、この方法は実際には不可能です。しかし、オートデスクのエンジニアは、この問題を解決する便利な方法を提供しました。長い Python スクリプトを base64 文字列にエンコードすることで、パラメータとして渡すことができるようになります。この方法では、任意の長い Python スクリプトを実行できます。

ここでは、オンライン サービスを使用して、VRED の起動時に実行される単純な Python スクリプトを取得します。スクリプトを 1 行ずつ追加することはできません。Python が空白の構造に大きく依存していて、セミコロン方式ではこれを再作成できないためです。

ここではこのテクニックは省略しますが、次のビデオで使用し、より複雑なスクリプトを使用して VRED パイプラインをさらにカスタマイズする方法について説明します。

もちろん、シーンに Python スクリプトを追加する方法は他にもあります。たとえば、VRED の VPB ファイルに埋め込まれているスクリプトがあるとします。VRED Pro では、これらはシーンのスクリプト エディタに表示されます。シーンの基本設定に応じて、スクリプトが自動的に実行されます。たとえば、3D 環境でインタラクティブ ボタンを使用して仮想ルームを実装すると、VR のユーザはマテリアルを変更したり、ターンテーブルなどのツールをアクティブにしたりできます。このようなスクリプトは、この特定のシーンでのみ使用できます。そのため、この方法は、シーンに固有の機能がある場合に便利です。

個人の意見ですが、自動レンダリングまたはデータ準備を実装する場合、最初にレンダリングするすべてのファイルにスクリプトをコピーする必要があるため、これは良い解決策ではありません。ほとんどの場合、これはあまり効率的ではありません。

頻繁に使用するタスクで同じコードを何度も繰り返す必要がある場合は、Python モジュールを使用します。Python モジュールには、同じ機能または概念に属するクラス、関数、変数が含まれています。たとえば、レンダリング モジュールには、特定のレンダリング設定を行ったり、バリアント セットまたは他のデータ ソースを使用してレンダリングを自動化する関数を含めることができます。

このようなモジュールで定義されているすべての関数とクラスは、Python ターミナルやストリーミング アプリなどの Python インタフェースで使用できます。または、-pre または -post Python コマンド ライン パラメータで呼び出すことができます。

VRED Core にモジュールを追加するには、VRED Core のモジュール ディレクトリにモジュール ファイルをコピーします。このディレクトリは VRED Core のインストール ディレクトリにあります。

この例では、モジュール内でウォーターマーク関数を呼び出して、簡単なウォーターマークを追加します。-post Python を使用した簡単な Python 呼び出しにより、このウォーターマークをストリーミング セッションまたはレンダリングに追加できます。モジュール名のスペースの関数を使用する前に、その関数を読み込む必要があることがわかります。

VRED Core と Python スクリプトを使用して実現できる簡単なサンプルをいくつか示します。VRED Core はデータ変換を自動で実行する優れたツールです。つまり、ある形式のファイルをロードし、別の形式でファイルを書き出します。特定のファイル形式のファイルをロードし、別の名前で保存するだけなので、これは非常に簡単です。手間のかかる作業はすべて VRED Core によって処理されます。

ファイルを保存したら、VRED の終了コマンドを使用してソフトウェアを閉じ、終了します。

このビデオで先ほど説明した -post Python コマンドを使用する場合、このタスクでは 3 つの個別の Python コマンドのみが必要になります。

ここではすべての Python コマンドが 1 行ずつ表示されるため、見やすくなります。また、ファイル パスが正しく認識されるように、引用符をバックスラッシュでエスケープする必要があります。

シーンのレンダリングは多少複雑で、実行するにはさらにいくつかの Python コマンドが必要です。ここでも、-post Python コマンドを使用してレンダリング プロセスを開始します。実際には、シーンをレンダリングする方法は 2 つあります。まず、ファイル名と解像度のみをパラメータとして必要とする createSnapshot 関数を使用する方法です。これにより、特定のレンダリング設定を使用したり、バリアント セットまたは他のデータ ソースを使用した自動レンダリングを行えます。

モデリング手法としては、「VR レンダリング設定」モジュールの機能を使用してシーンをレンダリングします。ただし、ここではレンダリングの解像度とファイル名を設定する必要があるため、さらに多くのコマンドを実行する必要があります。しかし、この方法で、理論的には任意のレンダリング設定を必要に応じて変更することができます。

ただし、レンダリングの基本設定で定義できるレンダリング プリセットを使用する方が効率的です。レンダリング プリセットは applyPreset 関数を使用してロードすることができ、レンダリングのファイル名を設定するだけで済みます。

データの準備に VRED Core を使用する場合は、内部関数を使用してジオメトリとトランスフォームを最適化できます。残念ながら、これは少し高度な方法であり、実現するにはさらに多くの Python コードが必要になるため、このビデオで説明した base64 エンコーディングを使用する必要があります。そのため、次のビデオではデータの準備と最適化について説明し、VRED パイプラインを自動化してカスタマイズする方法をいくつか紹介します。また、先ほど説明したデータ変換レンダリング サンプルを完全に自動化するスクリプトも作成しますので、ご期待ください。

今日の説明はこれで終わりです。VRED Core の主な機能に関するビデオをご覧いただきました。ご視聴いただき、ありがとうございました。またお会いしましょう。


VRED Core を使用する際のヒント

VRED Core を使用する前に、次の手順が実行されていることを確認します。

詳細とヘルプについては、「Python チュートリアル」、「VRED Core」のそれぞれのトピックを参照してください。

Python サンプル コード

これは、「チュートリアル 3: VRED Core の設定なしで使用できる機能を使用する方法」ビデオに付属する Python サンプル スクリプトです。

ヒント:

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

cmd-data-conversion

cmd-data-conversion は、ファイルを別の形式に変換する際に使用します。

./VREDCore.exe -postpython="load(\"C:/VRED_Examples/vpb/Example.vpb\"); save(\"C:/VRED_Examples/fbx/Example.fbx\"); terminateVred()"

load(\"C:/VRED_Examples/Example.vpb\")
save(\"C:/VRED_Examples/Example.fbx\")
terminateVred()

cmd-rendering

cmd-rendering は、特定のレンダリング設定を行ったり、バリアント セットまたは他のデータ ソースを使用してレンダリングを自動化する際に使用します。

# Start batch rendering with different quality settings

# With createScreenshot
./VREDCore.exe -postpython="load(\"C:/VRED_Examples/Example.vpb\"); createSnapshot(\"C:/VRED_Examples/rendering/screenshot_3.jpg\", 1920, 1080); terminateVred()"

load(\"C:/VRED_Examples/Example.vpb\");
createSnapshot("C:/VRED_Examples/rendering/screenshot_3.jpg", 1920, 1080);
terminateVred()


# With Rendersettings
./VREDCore.exe -postpython="load(\"C:/VRED_Examples/Example.vpb\"); setRenderPixelResolution(1920, 1080, 300); setRenderFilename(\"C:/VRED_Examples/rendering/screenshot_2.jpg\"); startRenderToFile(False); terminateVred()"

load(\"C:/VRED_Examples/Example.vpb\")
setRenderPixelResolution(1920, 1080, 300)
setRenderFilename(\"C:/VRED_Examples/screenshot.jpg\")
startRenderToFile(False)
terminateVred()

# With Rendersettings and Preset
./VREDCore.exe -postpython="load(\"C:/VRED_Examples/Example.vpb\"); applyPreset(\"Production_Quality\"); setRenderFilename(\"C:/VRED_Examples/rendering/screenshot_1.jpg\"); startRenderToFile(False); terminateVred()"

load(\"C:/VRED_Examples/Example.vpb\")
applyPreset(\"Production_Quality\")
setRenderFilename(\"C:/VRED_Examples/screenshot.jpg\")
startRenderToFile(False)
terminateVred()

cmd-watermark

cmd-watermark は、ウォーターマークをストリーミング セッションまたはレンダリングに追加する際に使用します。

# Start batch rendering with different quality settings

# With createScreenshot
./VREDCore.exe -postpython="load(\"C:/VRED_Examples/Example.vpb\"); createSnapshot(\"C:/VRED_Examples/rendering/screenshot_3.jpg\", 1920, 1080); terminateVred()"

load(\"C:/VRED_Examples/Example.vpb\");
createSnapshot("C:/VRED_Examples/rendering/screenshot_3.jpg", 1920, 1080);
terminateVred()


# With Rendersettings
./VREDCore.exe -postpython="load(\"C:/VRED_Examples/Example.vpb\"); setRenderPixelResolution(1920, 1080, 300); setRenderFilename(\"C:/VRED_Examples/rendering/screenshot_2.jpg\"); startRenderToFile(False); terminateVred()"

load(\"C:/VRED_Examples/Example.vpb\")
setRenderPixelResolution(1920, 1080, 300)
setRenderFilename(\"C:/VRED_Examples/screenshot.jpg\")
startRenderToFile(False)
terminateVred()

# With Rendersettings and Preset
./VREDCore.exe -postpython="load(\"C:/VRED_Examples/Example.vpb\"); applyPreset(\"Production_Quality\"); setRenderFilename(\"C:/VRED_Examples/rendering/screenshot_1.jpg\"); startRenderToFile(False); terminateVred()"

load(\"C:/VRED_Examples/Example.vpb\")
applyPreset(\"Production_Quality\")
setRenderFilename(\"C:/VRED_Examples/screenshot.jpg\")
startRenderToFile(False)
terminateVred()

embedded_turntable_tool.py

# global interpolator and slider for turntable
turntableInterpolator = None
turntableSlide = None

# Function to initialize and active the turntable
def turntableToolEnabled():
    print("Enable Turntable Tool")

    global turntableInterpolator
    global turntableSlide

    turntable = vrNodeService.findNode("*tool_turntable", wildcard=True)
    toNode(turntable.getObjectId()).makeTransform()

    turntableInterpolator = vrInterpolator()
    turntableSlide = vrRotationSlide(turntable, 0, 0, 0, 0, 0, 359, 15.0)
    turntableInterpolator.add(turntableSlide)
    turntableInterpolator.setActive(True)

# Function to disable the turntable and clear the scene
def turntableToolDisabled():
    print("Disable Turntable Tool")
    global originalRotation
    global turntableInterpolator

    if turntableInterpolator:
        turntableInterpolator.setActive(False)
        turntableInterpolator = None

turntableToolEnabled()   

watermark_module.py

from vrKernelServices import vrSceneplateTypes
from vrKernelServices import vrdSceneplateNode

# Get reference to sceneplate types
NodeType = vrSceneplateTypes.NodeType
ContentType = vrSceneplateTypes.ContentType
PositionType = vrSceneplateTypes.Position


def addWatermark(text):
    '''
    Add a watermark with a text to your scene
    '''
    print("Create Watermark")
    sceneplateRoot = vrSceneplateService.getRootNode()
    watermarkNode = vrSceneplateService.createNode(sceneplateRoot, NodeType.Frontplate, "Watermark")
    watermark = vrdSceneplateNode(watermarkNode)
    watermark.setContentType(ContentType.Text)
    watermark.setText(text)

    watermark.setFontColor(QVector3D(0.7, 0.7, 0.7))
    watermark.setPosition(PositionType.Center)