<p>经过测试,我得出结论,一个人应该使用<code>vtkExternalOpenGLCamera</code></p>
<blockquote>
<p>This class extends vtkOpenGLCamera by introducing API wherein the
camera matrices can be set explicitly by the application.</p>
</blockquote>
<p>复合投影变换矩阵<code>X</code>虽然不容易使用,但它的裁剪范围必须改变</p>
<pre><code># copy X into numpy matrix for comfort
P = np.zeros( (4,4),dtype=np.double)
for y in range(4):
for x in range(4):
P[y][x]=X.GetElement(y,x)
# P maps valid z-values to [n,f] so change that by
# z <- 2.0 * ( z - n )/(f-n) -1.0
# to fit values into the default clipping range [-1,1]
A = np.eye(4,dtype=np.double)
A[2][3]=-n
B = np.eye(4, dtype=np.double)
B[2][2]=2.0/(f-n)
C = np.eye(4, dtype=np.double)
C[2][3]=-1.0
P = np.matmul(C,np.matmul(B,np.matmul(A,P)) )
# then use vtkExternalOpenGLCamera
c2 = vtk.vtkExternalOpenGLCamera()
c2.SetViewTransformMatrix( np.reshape( np.eye(4,dtype=np.double),[-1,1]) )
c2.SetProjectionTransformMatrix( np.reshape( np.transpose(P),[-1,1]) )
r2.layer0.SetActiveCamera( c2 )
r2.Render()
</code></pre>
<p>值得注意的是,下面的矩阵<code>P</code>也适用于上面提到的modelview矩阵变换hack:</p>
<pre><code>c2 = vtk.vtkCamera()
# P is now back to vtk.vtkMatrix4x4 type
# assert that the modelview matrix will be identity matrix
Mx = vtk.vtkMatrix4x4()
Mx.DeepCopy( c2.GetModelViewTransformMatrix() )
print( Mx ) # its not!
Mx.Invert() # so invert
# Y*M = X*inv(M)*M = X
vtk.vtkMatrix4x4.Multiply4x4( P, Mx, P )
c2.SetUseExplicitProjectionTransformMatrix(1)
c2.SetExplicitProjectionTransformMatrix( P )
</code></pre>
<p>但结果不太好。。。你知道吗</p>
<p>尽管VTK的默认摄影机灯光模型不适用于烘焙复合变换,但如果将投影矩阵和模型视图矩阵分别放入<code>vtkExternalOpenGLCamera</code>中,则它确实有效。你知道吗</p>