「チュートリアル 9: V2 の新しいデータ タイプを使用する方法」のビデオでは、QMatrix4x4 および QVector3D での数値演算の例について説明します。
ビデオ キャプション: VRED Pro の Python チュートリアルへようこそ。Christopher といいます。今日は、API バージョン 2 の新しいデータ タイプを紹介し、その背景を説明し、それらをどのように使用できるかを紹介します。
Python API バージョン 1 を見ると、実際には使用するデータ タイプはありません。すべてのパラメータは、単一の値で渡されるか、ベクトルや色のコンポーネントのようにリストとして渡されます。また、関数の戻り値は、ほとんどの場合、単一の値、タプル、またはリストのいずれかです。
Python の観点からは、これは問題ありません。これは Pythonic と呼ばれています。つまり、Python でこれを行う方法です。しかし、このやり方にはデメリットもあります。たとえば、ベクトルを操作する場合、数学演算を実行するには、Pythonic 表現を変換して使いやすい表現にする必要があります。
したがって、Python API バージョン 2 では、以前の問題に対処する新しいデータ タイプが導入されています。データを操作するオブジェクト指向の方法を紹介します。つまり、ベクトルのコンポーネントなどの値は、個別に扱われるのではなく、単一のオブジェクトに結合されます。たとえば、ベクトルを扱うジオメトリ関数の入力パラメータと戻り値に、新しいデータ タイプが使用されるようになりました。これらのデータ タイプは、VRED が内部的に使用する Qt フレームワークから借用されており、各データ タイプには期待どおりの関数が用意されています。3D グラフィックス プログラミングの場合、「Q Vector 2D」、「3D」、「4D」という新しいタイプと、Matrix データ タイプが追加されました。新しいカラータイプが導入され、16 進値、RGB、その他のカラー形式からカラーを作成できるようになりました。また、QIcon、QSize、QImage などのグラフィカル ユーザ インタフェースの構築に役立つタイプもあります。
これらのタイプを使用する場合は、手動で読み込む必要はありません。VRED では既に追加されており、スクリプト エディタに「大文字の Q」の入力を開始し、[Ctrl]キーを押しながらスペース キーを押すだけで、使用可能なすべての新しいデータ タイプのリストを取得できます。では、新しいデータ タイプで実行できる操作をいくつか見てみましょう。最初の例では、新しい注釈を作成し、その色を設定します。この場合、新しい「Q Color」タイプを使用して、たとえば RGB 値から、HSV またはその他のカラースペースから色を作成することができます。次の手順では、注釈をもう少し高い位置に移動して、実際に自動車のボンネットに配置します。これを行うには、新しい 3D ベクトルを作成し、注釈の「set position」メソッドに配置します。
次の例では、現在のカメラから右を向いているベクトルを計算します。実際には、カメラの視線方向とアップ ベクトルの外積によって表されるベクトルが必要です。外積または内積の計算は、3D プログラミングを行う場合の基本的な操作ですが、新しいデータ タイプを使用すると、最終的にこれを非常に簡単に行うことができます。
スクリプトでは、まず現在のカメラから「上方向」、「開始位置」、および「終了位置」の値を取得します。これらは基本的に上方向、カメラが向いている開始位置、およびカメラが向いている方向を表します。これらの値を使用して、カメラからターゲットへのベクトルとアップ ベクトルを計算することで、基本的に 1 行で外積を計算できます。最後のセットでは、結果を正規化して完了します。これは、これらの新しいデータ タイプの利点です。外部モジュールを読み込んだり、独自のタイプを実装したりすることなく、すべての関数を使用できます。
別の例として、カメラから原点までの距離と、座標系の Z 軸までの距離を計算します。ベクトル クラスにはこのようなメソッドが既に用意されているため、この操作も非常に簡単です。この場合、distanceToPoint と distanceToLine のメソッドを使用します。したがって、外部ライブラリを使用したり、独自のベクトル実装を記述する必要はありません。データ タイプには、3D プログラミングで必要となるほとんどの関数が含まれているはずです。
時間を計測するための「Q Time」データ タイプや面積を表す「Q Size」など、紹介できる非常に便利なデータ タイプがありますが、ベクトル タイプは最も便利なデータ タイプと言えます。その他のすべてのタイプについて学習するには、公式の Qt ドキュメントをお勧めします。ここには素晴らしい例が掲載されています。スクリプト エディタのオート コンプリート機能([Ctrl]+[Space])で使用可能な関数とタイプを表示したり、オンライン検索を使用して Qt タイプのドキュメントを検索してください。
よろしいでしょうか。VRED のすべての新しいデータ タイプについては以上です。お楽しみいただけましたか。ご参加いただき、ありがとうございました。またお会いしましょう。
「チュートリアル 9: V2 の新しいデータ タイプを使用する方法」のビデオ用の Python スクリプトの例を示します。
以下のファイルが含まれた ZIP ファイルをダウンロードするには、ここをクリックしてください。
# Calculating with QtVectors
camera = vrCameraService.getActiveCamera()
cameraTranslation = camera.getTranslation()
print("Distance to origin: ", cameraTranslation.length())
print("Distance to origin (point): ", cameraTranslation.distanceToPoint(QVector3D(0,0,0)))
distanceToZAxis = cameraTranslation.distanceToLine(QVector3D(0,0,0), QVector3D(0,0,1))
print("Distance to z-axis", distanceToZAxis)
# Example 2.0
# Using vrMathService
boxPtr = vrNodeUtils.createBox(1000, 1000, 1000, 1, 1, 1, 1, 1, 1)
boxPtr.setName("Box")
boxPtr.setTranslation(100, 200, 300)
boxPtr.setRotation(23, 34, 45)
boxPtr.setScale(1.2, 1.3, 1.3)
box = vrNodeService.findNode("Box")
transform = box.getWorldTransform()
translation = vrMathService.getTranslation(transform)
rotation = vrMathService.getRotation(transform)
scale = vrMathService.getScaleFactor(transform)
scaleOrientation = vrMathService.getScaleOrientation(transform)
print("Translation", translation)
print("Rotation", rotation.toEulerAngles())
print("Scale", scale)
print("Scale Orientation", scaleOrientation.toEulerAngles())
# Example 1
# QColor:
colorRed = QColor(255, 0, 0)
colorBlue = QColor(0, 255, 0)
colorGreen = QColor(0, 0, 255)
fontcolor = QColor.fromRgb(127, 24, 78)
backgroundColor = QColor.fromHsv(180, 255, 255)
annotation = vrAnnotationService.createAnnotation("New Annotation")
annotation.setFontColor(fontcolor)
annotation.setBackgroundColor(backgroundColor)
annotation.setText("I like it!")
x = 0
y = 0
z = 300
position = QVector3D(x, y, z)
matAnnotation = vrAnnotationService.findAnnotation("MaterialAnnotation")
matAnnotation.setPosition(position)
# Example 2:
# QVector4D, QVector3D, QVector2D
# QVector4D
camera = vrCameraService.getActiveCamera()
viewFrustum = camera.getFrustum()
print("Frustum as QVector4D:", viewFrustum)
# QVector3D
camera = vrCameraService.getActiveCamera()
fromAtUp = vrCameraService.getActiveCamera().getFromAtUp()
fromVector = fromAtUp.getFrom()
atVector = fromAtUp.getAt()
upVector = fromAtUp.getUp()
print("From Vector:", fromVector)
print("At Vector:", atVector)
print("Up Vector:", upVector)
cameraTangent = QVector3D.crossProduct((atVector - fromVector), upVector)
cameraTangent.normalize()
print("Cross product", cameraTangent)
x = 0
y = 0
z = -300
position = QVector3D(x, y, z)
matAnnotation = vrAnnotationService.findAnnotation("MaterialAnnotation")
matAnnotation.setPosition(position)
# QVector2D
camera = vrCameraService.getActiveCamera()
camera.setSensorSize(QVector2D(10, 10))
camera.updateFromPerspectiveMatch()
#Example 3:
# QMatrix4x4
camera = vrCameraService.getActiveCamera()
projectionMat = camera.getCustomProjectionMatrix()
print(projectionMat)
# Example:
# Math operations
# Example 1
# Color
blue = 127
red = 255
green = 127
vrRenderSettings.setRenderBackgroundColor(blue, red, green)
renderBackground = vrRenderSettings.getRenderBackgroundColor()
print(type(renderBackground), renderBackground.x(), renderBackground.y(), renderBackground.z())
# Example 2
# Vectors
camera = vrCamera.getActiveCameraNode()
cameraPosition = camera.getTranslation()
print(type(cameraPosition), cameraPosition)
# Example 3
# Math operations on vectors
v1 = vr