Я давно пытаюсь преобразовать экранные координаты в реальные координаты в приложении 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 из-под крана на экране. Но луч на самом деле имеет огромное отклонение от того места, где он фактически касается Мы не можем обойти эту проблему.
Любая помощь приветствуется !!