2015-07-04 4 views
2

Я пытаюсь понять формулу, чтобы перейти от 3D-точки (x, y, z) в мире к виртуальному представлению на двумерном изображении.Как построить 3D-точку на изображении VR (виртуальная реальность)

Я использую эту страницу в качестве примера:

http://dynamic.pulselive.com/dynamic/client/espn/tennis/presets/

enter image description here

Как я могу получить (а, б) положение от реальной (х, у, г) место шара?

Если вы проверяете страницу, есть много интересной информации:

  • страница использует эту 3D-библиотеку http://raphaeljs.com/

  • шары представлены (х, у, 0) местах такие, как для "VR камеры [1-4]" просмотров:

    this.graphs['vr-2'].setData({"names":["PLAYER A","PLAYER B"],"sets":[0,0],"data":{"1.1.1":{ 
    "serverIndex":0, 
    "serveType":"f", 
    "servePlacement":{"x":0,"y":0}, 
    "returnStrike":{"z":0.9144,"x":0,"y":0}, 
    "placements":[[ 
    {"x":0,"y":0}, 
    {"x":-6.4008,"y":0}, 
    {"x":-11.8872,"y":5.4864}, 
    {"x":-11.8872,"y":-5.4864}, 
    {"x":11.8872,"y":5.4864}, 
    {"x":11.8872,"y":-5.4864} 
    ],[]],"strikes":[[],[]]},}}); 
    
  • середина сети, как представляется, (0, 0, 0)

  • В приведенном выше примере, четыре шары:

    -11.8872, 5.4864, 0 (the ball on the tennis double line) 
    0, 0, 0 (the ball in the middle of the net) 
    6.4008, 0, 0 (the ball at the T serve line) 
    -11.8872,-5.4864, 0 (the ball on the other tennis double line) 
    
  • файловые projection.js имеет следующее содержимое:

    onProjections([{ 
    "sp":{"height":290,"width":288,"y":1.57271656153463,"p":-2.37960648536682,"tx":44.8464085506826,"ty":0.072299872443644,"tz":43.6183372879028,"r":0.0,"ar":1.0,"fl":1876.41418457031,"cx":144,"cy":145}, 
    "rsp":{"height":290,"width":288,"y":1.56934654388598,"p":-2.26160676579457,"tx":32.6921108381257,"ty":0.227987701481753,"tz":19.2898811340332,"r":0.0,"ar":1.0,"fl":557.320129394531,"cx":144,"cy":145}, 
    "p":{"height":290,"width":288,"y":1.57234654402847,"p":-2.01060693582986,"tx":40.2668354447684,"ty":0.0886826017731878,"tz":15.4698811340333,"r":0.0,"ar":1.0,"fl":1027.31091308594,"cx":144,"cy":145}, 
    "vr-4":{"height":290,"width":578,"y":-3.14002369728572,"p":-3.14159274101257,"tx":0.0720691962205988,"ty":-0.237841598739008,"tz":144.869881134034,"r":0.0,"ar":1.0,"fl":1735.24694824219,"cx":289,"cy":145}, 
    "vr-3":{"height":290,"width":578,"y":3.13971663596315,"p":-1.80660665035248,"tx":-0.0380399327222413,"ty":21.4384628442103,"tz":8.04833728790282,"r":0.0,"ar":1.0,"fl":333.111877441406,"cx":289,"cy":145}, 
    "vr-2":{"height":290,"width":578,"y":2.14571658875068,"p":-1.86560642719269,"tx":27.0765197103578,"ty":16.2179742216193,"tz":10.4983372879028,"r":0.0,"ar":1.0,"fl":445.122161865234,"cx":289,"cy":145}, 
    "vr-1":{"height":290,"width":578,"y":1.56571656120214,"p":-1.88360643386841,"tx":37.1591340096487,"ty":-0.0542132391350438,"tz":10.9683372879027,"r":0.0,"ar":1.0,"fl":787.308471679688,"cx":289,"cy":145}, 
    "rhp":{"height":290,"width":288,"y":1.57134654398098,"p":-2.25760674476624,"tx":31.4921270358275,"ty":0.153327426083581,"tz":18.0298811340332,"r":0.0,"ar":1.0,"fl":557.320129394531,"cx":144,"cy":145} 
    }]); 
    

Я думаю, что мой вопрос сводится как я могу использовать данные в projection.js для вычисления позиции (a, b) из местоположения (x, y, z)? Обратите внимание, что я пытаюсь получить формулу, и я не очень заинтересован в библиотеке javascript, так как мне придется выполнять реализацию с помощью разных инструментов.

РЕДАКТИРОВАТЬ # 1:

Данные вида, кажется, включает в себя: высоту, ширина, у (рыскания), р (панорамирование), Ое, Та, TZ (положение камеры), г (рулон), ar (???, всегда 1), fl (фокусное расстояние ???), cx, cy (в центре на изображении ????).

Эта страница дает формулу, но она не включает в себя рыскание:

http://freespace.virgin.net/hugo.elias/routines/3d_to_2d.htm

procedure 3Dto2D (x, y, z, pan, centre, position) 

    x = x + position.x 
    y = y + position.y 
    z = z + position.z 

    new.x = x*cos(pan.x) - z*sin(pan.x) 
    new.z = x*sin(pan.x) + z*cos(pan.x) 
    new.y = y*cos(pan.y) - new.z*sin(pan.y) 
    z = new.y*cos(pan.y) - new.z*sin(pan.y) 
    x = new.x*cos(pan.z) - new.y*sin(pan.z) 
    y = new.x*sin(pan.z) + new.y*cos(pan.z) 

    if z > 0 then 
     screen.x = x/z * zoom + centre.x 
     screen.y = y/z * zoom + centre.y 
    end if 

Если я считаю, что мяч на теннисном двойной линии для камеры VR 2, У меня есть следующие информация:

REAL WORLD POSITION (from html source) 
X: -11.8872 
Y: -5.4864 
Y: 0.0 

VR CAMERA 2 INFORMATION (from javascript projection.js) 
height: 290 
width: 578 
y: 2.14571658875068 
p: -1.86560642719269 
tx: 27.0765197103578 
ty: 16.2179742216193 
tz: 10.4983372879028 
r: 0.0 
ar: 1.0 
fl: 445.122161865234 
cx: 289 
cy: 145 

2D LOCATION (from live inspection of page in browser inspector) 
A: 121.9715646498276 
B: 193.3313740587937 

Какова функция (А, в) = F (X, Y, Z, высота, ширина, у, р, Тх, Ту, TZ, г, ар, фл, сх, су)?

ответ