2016-06-17 3 views
1

vispy에서 장면을 기준으로보기 방향을 얻는 가장 깨끗한 방법은 무엇입니까? 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> 

나는 구성에서 뷰 방향을 배포판에있는 다양한 유형의 변환 목록을 구문 분석하고이를 구성하고 추출하는 뭔가를 쓸 수있는 변환을,하지만 난 '의심 상류에서 수영 해요.

답변

0

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