透視投影のカメラが持つ、近クリップ面までの距離を計算 (スクリプト)

シーン上のレンダリングに使用するカメラから、Depth計算で使用される「近クリップ面までの距離」をスクリプトで計算します。
なお、この計算は透視投影時の一般的なカメラパラメータを割り当てている場合に使用できます。
魚眼カメラや平行投影時には正しく処理できません。
リアルタイムで使用されるOpenGLやDirectXにカメラ情報を渡すときの、nearパラメータとして利用できます。
また、レンダリングイメージ上の1点からワールド座標位置を逆算する場合にも利用できます。


import numpy
import math

scene = xshade.scene()

# 近クリップ面までの距離を計算.
def m_calcNearClip (zDist):
  wvMat = numpy.matrix(scene.world_to_view_matrix)
  wdMat = numpy.matrix(scene.world_to_device_matrix)
  nearDist = 0.0

  # ビュー座標でのzDist距離をワールド座標に変換.
  vDir = numpy.array([0.0, 0.0, zDist, 1.0])
  wDir = numpy.dot(vDir, wvMat.I)
  wDir = numpy.array([wDir[0,0], wDir[0,1], wDir[0,2],wDir[0,3]])

  # ワールド座標でのwDirベクトルをデバイス座標に変換.
  v4 = numpy.dot(wDir, wdMat)
  v4 = [v4[0,0], v4[0,1], v4[0,2], v4[0,3]]
  z = v4[2]
  w = v4[3]
  if w > z:
    nearDist = w - z

  return nearDist

def calcNearClip ():
  nearDist = m_calcNearClip(-5000.0)
  if math.fabs(nearDist) < 1e-7:
    nearDist = m_calcNearClip(5000.0)

  return nearDist

nearPlane = calcNearClip()
print "近クリップ面までの距離 : " + str(nearPlane)
この記事のタイトルとURLをコピーする
Translate »