カメラのワールド座標での視点と注視点を知りたい (スクリプト)

カメラは、「メタカメラ」と「オブジェクトカメラ」があります。
オブジェクトカメラはシーンに配置される形状になり、
形状を選択して形状情報ウィンドウを見ることで、ローカル座標での視点と注視点の値を得ることができます。
ただし、ここではワールド座標での視点/注視点の座標値を知ることはできません。

メタカメラ/オブジェクトカメラの区別なく、
ワールド座標での視点と注視点位置を知りたい場合があります。
ワールド座標でのカメラの視点と注視点は以下のスクリプトを実行すると計算できます。

import numpy

scene = xshade.scene()

# ローカル座標でのカメラの位置と注視点.
eye    = scene.camera.eye
target = scene.camera.target

# カメラのローカル・ワールド変換行列.
lwMat = numpy.matrix(numpy.identity(4))
if scene.camera.camera_object != None:
  lwMat = numpy.matrix(scene.camera.camera_object.local_to_world_matrix)

# カメラの位置と注視点をワールド座標に変換.
eye    = numpy.dot(numpy.array([eye[0], eye[1], eye[2], 1.0]), lwMat)
target = numpy.dot(numpy.array([target[0], target[1], target[2], 1.0]), lwMat)

eye    = [eye[0,0], eye[0,1], eye[0,2]]
target = [target[0,0], target[0,1], target[0,2]]

print "eye : " + str(eye)
print "target : " + str(target)

上記の計算で「numpy」を使用しました。

「xshade.scene().camera」より、「eye」が視点、「target」が注視点になります。
ただし、これはローカル座標での値であるのでワールド座標に変換する必要があります。
「camera.camera_object」がNoneの場合はメタカメラになり、eye/targetはローカル座標=ワールド座標値となっています。
Noneでない場合はオブジェクトカメラで、「camera.camera_object.local_to_world_matrix」にてローカル座標からワールド座標への変換行列が入ります。

numpyを使用してベクトルと行列の乗算を行うことで、
カメラの視点と注視点をローカル座標からワールド座標に変換しています。

ワールド座標からビュー座標変換行列より、カメラのワールド座標位置を計算

また、シーンのワールド座標からビュー座標変換行列より、以下のスクリプトでカメラのワールド座標位置を計算することができます。


import numpy

scene = xshade.scene()

# ワールド座標からビュー座標に変換する行列.
wvMat = numpy.matrix(scene.world_to_view_matrix)

# ビュー座標からワールド座標に変換する行列.
vwMat = wvMat.I

# ビュー座標での(0, 0, 0)のカメラ位置をワールド座標に変換.
cameraPos = numpy.dot([0.0, 0.0, 0.0, 1.0], vwMat)
cameraPos = [cameraPos[0,0], cameraPos[0,1], cameraPos[0,2], cameraPos[0,3]]

print "cameraPos " + str(cameraPos)
Translate »