2016-05-25 20 views
0

私は、世界の点を表示座標に変換する4x4投影行列を取得しようとしています。vtk投影行列:世界から表示

ピクセル(x、y)とそれに対応するz値(zbufferから)を持って、私はvtkWorldPointPickerクラスで3Dワールド座標を取得します。結果をxと表記しましょう。

documentationによれば、IはXにマトリックスGetCompositeProjectionTransformMatrixを適用することにより、世界のポイントのビューの座標を計算することができます。次に、私はvtkViewport::ViewToDisplayに見出されるコード(*)を使用して、初期表示座標にビューからの変換を使用しています:sizexsizey幅と画素の画像の高さ

dx = (v[0] + 1.0) * (sizex*(v[2]-v[0]))/2.0 + sizex*v[0]; 
dy = (v[1] + 1.0) * (sizey*(v[3]-v[1]))/2.0 + sizey*v[1]; 

、およびvは計算されたビュー座標です。

残念ながら、私は戻って取得値は、元と一致しません:

display [0, 0, 0.716656] // x,y-pixel coordinates and the zbuffer 
x = [0.0255492, -0.0392383, 0.00854707] // world coordinates (using vtkWorldPointPicker) 

// camera->GetCompositeProjectionTransformMatrix 
P = [ 
-1.84177   0   0   0 
     0 1.20317 1.39445   0 
     0 -757.134 653.275 -9.9991 
     0 -0.757126 0.653268   0 ] 

v = [-0.0470559, -0.0352919, 25.2931, 0.0352919] // P*x 
a = [7697.18, -0.597848] // using (*) 

は正しい(一般的に)このアプローチであり、またはこれを行うにはより多くの従来の方法は何ですか?助けてくれてありがとう。

編集:vtkViewport::ViewToDisplayの提供スニペットが間違っています。読み込みする必要があります。

dx = (v[0] + 1.0) * (sizex*(vp[2]-vp[0]))/2.0 + sizex*vp[0]; 
dy = (v[1] + 1.0) * (sizey*(vp[3]-vp[1]))/2.0 + sizey*vp[1]; 

注意を、vは、正規化されたビューの座標を参照していること、vpは(vp := [0, 0, 1, 1]、デフォルトでは)ビューポートです!

答えて

0

変換は実際に有効ですが、最終的なマトリックスを得るための組み込みの方法があるかもしれません。

仮定は、一つのみが(デフォルト)ビューポートが使用され、ディスプレイにビュー変換行列座標である:

XY
M = [X/2, 0, 0, X/2, 
     0, Y/2, 0, Y/2, 
     0, 0, 1, 0, 
     0, 0, 0, 1] 

ピクセル単位での画像の幅と高さです。世界中の点x座標、表示が均一な形態で座標所与したがって は、次のとおりPCompositeProjectionTransformMatrixある

c = M * P * x; 

。正規化した後(c[i] /= c[3]i = 0,1,2)、元のピクセル値に達します。

関連する問題