Проблема при конвертации с экранных в мировые координаты в приложении ARCore - PullRequest
0 голосов
/ 02 апреля 2019

Я давно пытаюсь преобразовать экранные координаты в реальные координаты в приложении ARCore. Хотя Arcore с радостью выполняет этот расчет для некоторых точек, для моего случая использования я должен сделать это сам. Я нашел некоторые решения в Интернете, но ни одно из них не работает.

Это то, что я нашел (x и y - экранные координаты):

y=window_height-y;    
float xr = x*2.0F / window_height-1.0F ;
float yr = y*2.0F / window_width-1.0F ;
glm::vec4 farscreenpoint(xr,yr,1.0F,1.0F);
glm::vec4 nearscreenpoint(xr,yr,-1.0F,1.0F);
glm::vec4 nearplanepoint;
glm::vec4 farplanepoint;
glm::mat4 invertedprojectionmatrix = glm::inverse(view_mat) * glm::inverse(projection_mat); 
nearplanepoint=invertedprojectionmatrix*nearscreenpoint;
farplanepoint=invertedprojectionmatrix*farscreenpoint;

glm::vec3 direction(farplanepoint[0] / farplanepoint[3],farplanepoint[1] / farplanepoint[3], farplanepoint[2] / farplanepoint[3]);
glm::vec3 origin(nearplanepoint[0] / nearplanepoint[3],nearplanepoint[1] / nearplanepoint[3], nearplanepoint[2] / nearplanepoint[3]);
float rayx=(((anchor_z-direction[2])/(direction[2]-origin[2]))*((direction[0]-origin[0])))+direction[0];
float rayy=(((anchor_z-direction[2])/(direction[2]-origin[2]))*((direction[1]-origin[1])))+direction[1];

Линия, соединяющая rayx и rayy, должна быть лучом, брошенным в мир ARCore из-под крана на экране. Но луч на самом деле имеет огромное отклонение от того места, где он фактически касается Мы не можем обойти эту проблему. Любая помощь приветствуется !!

...