スクリプトでレンダリングイメージのZ値(Depthテクスチャ)を取得
スクリプトからレンダリングイメージのZ値(Depthテクスチャ)を取得します。
ここで計算された値は、イメージウィンドウで表示されているグレイスケール画像での値になります。
Shade3DではZ値の検出方法により、このグレイスケールの濃淡は異なります。
これは、Z距離値からDepthへの変換の計算式の違いでおきます。
以下のスクリプトは、レンダリングイメージの「Z値」をマスターイメージ”depth_image”として複製します。
scene = xshade.scene()
depthLayer = scene.rendering.image_layer('ZDepth')
if depthLayer != None and scene.rendering.image != None:
# Depth値の最小と最大.
minDist = depthLayer.minimum_value
maxDist = depthLayer.maximum_value
srcImage = depthLayer.image
width = srcImage.size[0]
height = srcImage.size[1]
# マスターイメージを作成.
scene.begin_creating()
masterImage = scene.create_master_image('depth_image')
masterImage.image = scene.rendering.image.duplicate()
dstImage = masterImage.image
scene.end_creating()
# ピクセルごとに色をコピー.
for y in range(height):
for x in range(width):
# Z値を0.0 - 1.0に変換.
col = srcImage.get_pixel_rgba(x, y)
zDist = col[0]
zVal = (zDist - minDist[0]) / (maxDist[0] - minDist[0])
col = [zVal, zVal, zVal, 1.0]
dstImage.set_pixel_rgba(x, y, col)
dstImage.update()
「xshade.scene().scene.rendering.image_layer(‘ZDepth’)」でレンダリングのイメージレイヤから’ZDepth’を取得します。
これがNoneではない場合はZ値を持つことになります。
「depthLayer.image」がZ値のイメージになります。
Z値での1ピクセルはカメラから対象位置までの距離が格納されています。
これは、イメージウィンドウで表示されている0.0 – 1.0の範囲には収まっていません。
depthLayer.imageのすべてのピクセルを走査したときの最小と最大は、depthLayer.minimum_valueとdepthLayer.maximum_valueで取得されます。
4つの要素を持つ配列データになります。
これを使用して、
「zVal = (zDist – minDist[0]) / (maxDist[0] – minDist[0])」とすると、イメージウィンドウで表示されている0.0-1.0の範囲に変換できます。