获取相对于场景vispy视图方向?(Get view direction relative to s

2019-09-27 04:37发布

什么是让视线方向相对于场景中vispy的最干净的方式是什么?

view.scene.transform包含变换的整个链:

In [88]: view.scene.transform
Out[88]: 
<ChainTransform [<STTransform scale=[ 960. -540.    1.    1.] translate=[ 960.  540.    0.    0.] at 0x139757309901840>,
                 MatrixTransform(matrix=[[26.44507, 0.0, 0.0, 0.0],
                        [0.0, 47.013458, 0.0, 0.0],
                        [0.0, 0.0, -1e-06, 0.0],
                        [-0.0, -0.0, -0.0, 1.0]] at 0x7f1bc8d526d0),
                 <Inverse of '<ChainTransform [MatrixTransform(matrix=[[0.64390097845776273, -0.18562251042644023, -0.74225050593726238, 0.0],\n                        [0.74851597030808681, 0.35377196489238, 0.56086472437650059, 0.0],\n                        [0.15847830177938896, -0.91672770247177038, 0.36673552784799862, 0.0],\n                        [0.002241050448888897, 0.013296952664039196, 0.015024409939918581, 1.0]] at 0x7f1bc8c81710)] at 0x7f1bc8cb7e90>'>] at 0x7f1bc8e75490>

我可以写的东西来解析varous类型转换的列表和它们组合,并提取视图方向从所构成的变换,但我怀疑我游泳上游。

Answer 1:

Vispy转换有一个mapimap现场和屏幕之间,您可以使用映射函数坐标坐标在任一方向。 我用他们分了很多的断言是安全的扔; 有可能是更简单的实现。 我测试了这对正投影。 我〜想它会为透视投影工作,只要过的投影中心是在屏幕的中间。

def get_view_direction_in_scene_coordinates(view):
    import numpy
    tform=view.scene.transform
    w,h = view.canvas.size
    screen_center = numpy.array([w/2,h/2,0,1]) # in homogeneous screen coordinates
    d1 = numpy.array([0,0,1,0]) # in homogeneous screen coordinates
    point_in_front_of_screen_center = screen_center + d1 # in homogeneous screen coordinates
    p1 = tform.imap(point_in_front_of_screen_center) # in homogeneous scene coordinates
    p0 = tform.imap(screen_center) # in homogeneous screen coordinates
    assert(abs(p1[3]-1.0) < 1e-5) # normalization necessary before subtraction
    assert(abs(p0[3]-1.0) < 1e-5)
    d2 = p1 - p0 # in homogeneous screen coordinates
    assert(abs(d2[3])< 1e-5)
    d3 = d2[0:3] # in 3D screen coordinates
    d4 = d3 / numpy.linalg.norm(d3)
    return d4


文章来源: Get view direction relative to scene in vispy?