スクリプトでレンダリングイメージの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の範囲に変換できます。

Translate »