{"id":282918,"date":"2016-12-23T10:30:04","date_gmt":"2016-12-23T07:30:04","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=282918"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=282918","title":{"rendered":"VR-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \u043d\u0443\u043b\u044f \u043d\u0430 libgdx: \u0447\u0430\u0441\u0442\u044c 1"},"content":{"rendered":"<div style=\"text-align:center;\"><img decoding=\"async\"  src=\"https:\/\/habrastorage.org\/files\/96a\/166\/968\/96a16696860d4ac7a72452c672c5add2.png\"\/><\/div>\n<p>  \u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441\u0442\u0440\u0435\u043c\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430\u0431\u0438\u0440\u0430\u0435\u0442 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u044c \u0441\u0440\u0435\u0434\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u043d\u043e \u0432\u0441\u0435 \u0435\u0449\u0435 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0439 \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u0438\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432. \u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u2014 \u043c\u043d\u043e\u0433\u0438\u0435 \u043f\u0438\u0448\u0443\u0442 \u0438\u0433\u0440\u044b \u0432 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430\u0445, \u043a \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0440\u0438\u043a\u0440\u0443\u0442\u0438\u0442\u044c Cardboard SDK, \u0430 \u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0435 \u043d\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043b\u0435\u043d\u044c. \u0422\u0430\u043a \u0438 \u0441 Libgdx, \u0433\u0434\u0435 \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 <a href=\"https:\/\/github.com\/yangweigbh\/Libgdx-CardBoard-Extension\">\u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u0441\u043a\u0440\u0435\u0441\u0442\u0438\u0442\u044c \u0443\u0436\u0430 \u0441 \u0435\u0436\u043e\u043c<\/a>, \u0432\u0441\u0435 \u0435\u0449\u0435 \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u043d\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c VR \u0438\u0433\u0440\u044b \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041f\u0430\u0440\u0443 \u043c\u0435\u0441\u044f\u0446\u0435\u0432 \u043d\u0430\u0437\u0430\u0434 \u044f \u0437\u0430\u0433\u043e\u0440\u0435\u043b\u0441\u044f \u0436\u0435\u043b\u0430\u043d\u0438\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e VR \u0438\u0433\u0440\u0443\u0448\u043a\u0443, \u0430 \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u044f \u0445\u043e\u0440\u043e\u0448\u043e \u0437\u043d\u0430\u043a\u043e\u043c \u0441 Libgdx \u0438 \u0434\u0430\u0432\u043d\u043e \u0441 \u043d\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u044e, \u0442\u043e \u0443 \u043c\u0435\u043d\u044f \u043e\u0441\u0442\u0430\u0432\u0430\u043b\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u043f\u0443\u0442\u044c: \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u0441\u0430\u043c\u043e\u043c\u0443 \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 VR <s>\u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434<\/s> \u0434\u0432\u0438\u0436\u043e\u043a \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 Libgdx. \u0413\u043b\u0430\u0437\u0430 \u0431\u043e\u044f\u0442\u0441\u044f \u2014 \u0440\u0443\u043a\u0438 \u0434\u0435\u043b\u0430\u044e\u0442, \u0438 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0441\u044f\u0446 \u043d\u043e\u0447\u043d\u044b\u0445 \u043f\u043e\u0441\u0438\u0434\u0435\u043b\u043e\u043a \u0438\u0433\u0440\u0430 \u0431\u044b\u043b\u0430 \u0433\u043e\u0442\u043e\u0432\u0430. \u0411\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u0440\u0443 \u0434\u043d\u0435\u0439 \u043f\u043e\u0441\u043b\u0435 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u043c\u043d\u0435 \u043d\u0430\u0447\u0430\u043b\u0438 \u0437\u0430\u0432\u0430\u043b\u0438\u0432\u0430\u0442\u044c \u043b\u0438\u0447\u043a\u0443 \u043f\u0440\u043e\u0441\u044c\u0431\u0430\u043c\u0438 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043a\u043e\u0434\u043e\u043c \u0438\u043b\u0438 \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c, \u043a\u0430\u043a \u043e\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u042f \u043d\u0435 \u0436\u0430\u0434\u043d\u044b\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u0448\u0438\u043b \u0437\u0430\u043c\u0443\u0442\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u0441\u0442\u0430\u0442\u0435\u0439 \u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0438 \u0432 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0438\u0437 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0438\u0439 \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u043c\u0430\u0440\u0442\u0444\u043e\u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u044e (\u0442.\u043d. head tracking), \u0430 \u0442\u0430\u043a \u0436\u0435 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u0441\u0442\u0435\u0440\u0435\u043e\u043f\u0430\u0440\u0443.<a name=\"habracut\"><\/a><\/p>\n<h2>Disclaimer<\/h2>\n<p>  \u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e Libgdx \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u044b\u0439 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a, \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434 Android. \u041f\u0440\u0438\u0447\u0438\u043d\u044b \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e-\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0439 \u043a\u043e\u0434 \u0434\u0432\u0435:<\/p>\n<p>  <b>1)<\/b> \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 Gdx.input \u0443 Libgdx \u043d\u0435 \u0434\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u00ab\u0441\u044b\u0440\u044b\u0435\u00bb \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u043c\u0430\u0433\u043d\u0438\u0442\u043e\u043c\u0435\u0442\u0440\u0430 (\u043a\u043e\u043c\u043f\u0430\u0441\u0430) \u0441\u043c\u0430\u0440\u0442\u0444\u043e\u043d\u0430. \u0412 \u0447\u0435\u043c \u0431\u044b\u043b\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c 3 \u043c\u0435\u0442\u043e\u0434\u0430 \u043f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441 \u0433\u0438\u0440\u043e\u0441\u043a\u043e\u043f\u043e\u043c \u0438 \u0430\u043a\u0441\u0435\u043b\u0435\u0440\u043e\u043c\u0435\u0442\u0440\u043e\u043c \u044f \u043d\u0435 \u0432 \u043a\u0443\u0440\u0441\u0435, \u043d\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u043f\u043e\u0441\u043b\u0443\u0436\u0438\u043b\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u043e\u0439 \u0432\u044b\u0432\u043e\u0434\u0430 \u0432\u0441\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0430\u0442\u0447\u0438\u043a\u0430\u043c\u0438 \u0432 android-\u043c\u043e\u0434\u0443\u043b\u044c.<\/p>\n<p>  <b>2)<\/b> <a href=\"https:\/\/github.com\/libgdx\/libgdx\/wiki\/Gyroscope\">\u0412 \u0432\u0438\u043a\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e<\/a>, \u0447\u0442\u043e Libgdx \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0433\u0438\u0440\u043e\u0441\u043a\u043e\u043f \u043d\u0430 iOS, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u0430 \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u044f \u043d\u0435 \u0432 \u043a\u0443\u0440\u0441\u0435.<\/p>\n<hr\/>\n<h2>\u0414\u0430\u0442\u0447\u0438\u043a\u0438<\/h2>\n<p>  \u0418\u0442\u0430\u043a, \u0443 \u043d\u0430\u0441 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0441\u043c\u0430\u0440\u0442\u0444\u043e\u043d, \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0442\u0440\u0435\u043c\u044f \u0434\u0430\u0442\u0447\u0438\u043a\u0430\u043c\u0438 (\u0432 \u0438\u0434\u0435\u0430\u043b\u0435). \u041d\u0443\u0436\u043d\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u0432\u0430\u0442\u0435\u0440\u043d\u0438\u043e\u043d \u0434\u043b\u044f \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a\u0430\u043c\u0435\u0440\u044b \u0432 OpenGL. \u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u043a\u0432\u0430\u0442\u0435\u0440\u043d\u0438\u043e\u043d, \u0438 \u0447\u0435\u043c \u043e\u043d \u043f\u043e\u043b\u0435\u0437\u0435\u043d \u0445\u043e\u0440\u043e\u0448\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043e <a href=\"https:\/\/habrahabr.ru\/post\/183908\/\">\u0437\u0434\u0435\u0441\u044c<\/a>. \u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043a\u0440\u0430\u0442\u043a\u043e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0438\u043f \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u0441 \u0447\u0435\u043c \u0432\u043e\u043e\u0431\u0449\u0435 \u043c\u044b \u0438\u043c\u0435\u0435\u043c \u0434\u0435\u043b\u043e.<\/p>\n<h3>\u0413\u0438\u0440\u043e\u0441\u043a\u043e\u043f<\/h3>\n<p>  \u0413\u0438\u0440\u043e\u0441\u043a\u043e\u043f \u2013 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u043e\u0436\u0435\u0442 \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0443\u0433\u043b\u043e\u0432 \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0442\u0435\u043b\u0430, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043e\u043d\u043e \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u043e. \u041c\u0435\u0445\u0430\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0433\u0438\u0440\u043e\u0441\u043a\u043e\u043f\u044b \u043e\u0447\u0435\u043d\u044c \u0434\u0430\u0432\u043d\u043e \u0438 \u0445\u043e\u0440\u043e\u0448\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043e\u043d\u0438 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0432 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0438\u043d\u0435\u0440\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u0434\u043b\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u0443\u0440\u0441\u0430 \u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\"  src=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/d\/d5\/Gyroscope_operation.gif\/200px-Gyroscope_operation.gif\" alt=\"image\"\/><\/div>\n<p>  \u0412 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0441\u043c\u0430\u0440\u0444\u0442\u043e\u043d\u0430\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f MEMS \u0433\u0438\u0440\u043e\u0441\u043a\u043e\u043f\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0443\u0433\u043b\u043e\u0432\u044b\u0435 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043f\u043e \u0442\u0440\u0435\u043c \u043e\u0441\u044f\u043c \u0432 \u0432\u0438\u0434\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/7f3\/8fd\/9d5\/7f38fd9d5e914636849a91f747dc98d1.png\"\/>.  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\"  src=\"https:\/\/habrastorage.org\/files\/582\/707\/c13\/582707c13f8649cdb55168043092b1b2.png\"\/><\/div>\n<p>  \u0414\u043b\u044f \u043d\u0430\u0441 \u043d\u0435 \u0432\u0430\u0436\u043d\u043e, \u0432 \u043a\u0430\u043a\u0438\u0445 \u0435\u0434\u0438\u043d\u0438\u0446\u0430\u0445 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 (\u0440\u0430\u0434\u0438\u0430\u043d\u044b \u0438\u043b\u0438 \u0433\u0440\u0430\u0434\u0443\u0441\u044b), \u0432\u0430\u0436\u043d\u043e \u043b\u0438\u0448\u044c \u0442\u043e, \u0447\u0442\u043e \u043e\u043d\u0438 \u043f\u0440\u044f\u043c\u043e \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b \u0443\u0433\u043b\u043e\u0432\u044b\u043c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044f\u043c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430. \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u0433\u0438\u0440\u043e\u0441\u043a\u043e\u043f \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u043f\u043e\u043a\u043e\u044f \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u044b\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0443\u043b\u0438: <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/30e\/10a\/b28\/30e10ab28cbd4d78b18cb06e48501e07.png\"\/>, \u043d\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 MEMS \u0433\u0438\u0440\u043e\u0441\u043a\u043e\u043f\u043e\u043c \u044d\u0442\u043e \u043d\u0435 \u0442\u0430\u043a. \u0412\u043e\u043e\u0431\u0449\u0435, MEMS \u0433\u0438\u0440\u043e\u0441\u043a\u043e\u043f\u044b \u2013 \u0441\u0430\u043c\u044b\u0435 \u0434\u0435\u0448\u0435\u0432\u044b\u0435 \u0438 \u043d\u0435\u0442\u043e\u0447\u043d\u044b\u0435 \u0438\u0437 \u0432\u0441\u0435\u0445 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445, \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u043f\u043e\u043a\u043e\u044f \u0443 \u043d\u0438\u0445 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u0438\u043b\u044c\u043d\u044b\u0439 \u0434\u0440\u0435\u0439\u0444 \u043d\u0443\u043b\u044f. \u041f\u0440\u0438 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u044d\u0442\u0438\u0445 \u0441\u043a\u0430\u0447\u0443\u0449\u0438\u0445 \u043e\u043a\u043e\u043b\u043e \u043d\u0443\u043b\u044f \u0443\u0433\u043b\u043e\u0432\u044b\u0445 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0435\u0439 \u0432 \u0443\u0433\u043b\u044b \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043e\u0448\u0438\u0431\u043a\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f, \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u044d\u0442\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u043c\u0443 \u0434\u0440\u0438\u0444\u0442\u0443 \u0433\u0438\u0440\u043e\u0441\u043a\u043e\u043f\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u043e\u0440\u043e\u0448\u043e \u0437\u043d\u0430\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u0438\u043c \u043b\u044e\u0431\u0438\u0442\u0435\u043b\u044f\u043c \u043f\u043e\u0438\u0433\u0440\u0430\u0442\u044c \u0432 VR \u0438\u0433\u0440\u0443\u0448\u043a\u0438. \u0414\u043b\u044f \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044f \u0434\u0440\u0435\u0439\u0444\u0430 \u043d\u0443\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0444\u0438\u043b\u044c\u0442\u0440\u044b \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u0438 \u043f\u043e\u0440\u043e\u0433\u043e\u0432\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0443\u0433\u043b\u043e\u0432\u044b\u0445 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0435\u0439, \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u043f\u0430\u043d\u0430\u0446\u0435\u044f, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u0441\u0438\u043b\u044c\u043d\u043e \u043f\u043e\u0440\u0442\u0438\u0442\u0441\u044f \u0442.\u043d. VR experience (\u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u043d\u0435\u0440\u0446\u0438\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0438 \u0440\u044b\u0432\u043a\u0438), \u0430 \u0432\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0438\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0442\u044c \u0434\u0440\u0435\u0439\u0444 \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u043d\u0435 \u0443\u0434\u0430\u0441\u0442\u0441\u044f. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u0434\u0440\u0443\u0433\u0438\u0435 \u0434\u0432\u0430 \u0434\u0430\u0442\u0447\u0438\u043a\u0430 \u0441\u043c\u0430\u0440\u0442\u0444\u043e\u043d\u0430, \u0441 \u0438\u0445 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0443\u0441\u0442\u0440\u0430\u043d\u0438\u0442\u044c \u0434\u0440\u0438\u0444\u0442, \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0432 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c VR experience.<\/p>\n<h3>\u0410\u043a\u0441\u0435\u043b\u0435\u0440\u043e\u043c\u0435\u0442\u0440<\/h3>\n<p>  \u0410\u043a\u0441\u0435\u043b\u0435\u0440\u043e\u043c\u0435\u0442\u0440 \u2013 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0440\u0435\u0430\u0433\u0438\u0440\u0443\u0435\u0442 \u043d\u0430 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u0442\u0435\u043b\u0430, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u043e. \u0410\u043a\u0441\u0435\u043b\u0435\u0440\u043e\u043c\u0435\u0442\u0440 \u0441\u043c\u0430\u0440\u0442\u0444\u043e\u043d\u0430 \u0432\u044b\u0434\u0430\u0435\u0442 \u0432\u0435\u043a\u0442\u043e\u0440 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0439 \u043f\u043e \u043e\u0441\u044f\u043c <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/cbf\/9c2\/a26\/cbf9c2a26fd449a79bdd2953b7e9cac6.png\"\/>, \u0435\u0434\u0438\u043d\u0438\u0446\u0430 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u043c\/\u0441, \u043d\u043e \u0434\u043b\u044f \u043d\u0430\u0441 \u044d\u0442\u043e \u0442\u0430\u043a \u0436\u0435 \u043d\u0435 \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u043e. \u0412 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u043f\u043e\u043a\u043e\u044f \u0430\u043a\u0441\u0435\u043b\u0435\u0440\u043e\u043c\u0435\u0442\u0440 \u0432\u044b\u0434\u0430\u0435\u0442 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0433\u0440\u0430\u0432\u0438\u0442\u0430\u0446\u0438\u0438, \u044d\u0442\u0443 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430 (Tilt correction). \u0423 \u0430\u043a\u0441\u0435\u043b\u0435\u0440\u043e\u043c\u0435\u0442\u0440\u0430 \u0442\u043e\u0436\u0435 \u0435\u0441\u0442\u044c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438. \u0415\u0441\u043b\u0438 \u0433\u0438\u0440\u043e\u0441\u043a\u043e\u043f \u0448\u0443\u043c\u0438\u0442 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u043f\u043e\u043a\u043e\u044f, \u0442\u043e \u0430\u043a\u0441\u0435\u043b\u0435\u0440\u043e\u043c\u0435\u0442\u0440 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0440\u0435\u0442 \u0432 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044e \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u044d\u0442\u0438\u0445 \u0434\u0432\u0443\u0445 \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442\u044c \u0441 \u0443\u043c\u043e\u043c. \u0412 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0418\u041d\u0421 \u0434\u043b\u044f \u043a\u0432\u0430\u0434\u0440\u043e\u043a\u043e\u043f\u0442\u0435\u0440\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0444\u0438\u043b\u044c\u0442\u0440 \u041a\u0430\u043b\u043c\u0430\u043d\u0430, \u043d\u043e \u044f \u0441\u0447\u0438\u0442\u0430\u044e, \u0447\u0442\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 VR \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u043e\u0431\u044b\u0447\u043d\u044b\u043c \u043a\u043e\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u0438\u043a\u043e\u043c, \u0437\u0434\u0435\u0441\u044c \u0438 \u0442\u0430\u043a \u0435\u0441\u0442\u044c \u0447\u0435\u043c \u043d\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0441\u043c\u0430\u0440\u0442\u0444\u043e\u043d\u0430.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\"  src=\"https:\/\/habrastorage.org\/files\/991\/750\/e93\/991750e93fbd487a8be1aeee9b8bac54.png\"\/><\/div>\n<p>  \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0441\u0432\u044f\u0437\u043a\u0430 \u0433\u0438\u0440\u043e\u0441\u043a\u043e\u043f + \u0430\u043a\u0441\u0435\u043b\u0435\u0440\u043e\u043c\u0435\u0442\u0440 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u0443\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0438\u0433\u0440\u044b, \u0442\u043e\u0442 \u0436\u0435 Cardboard SDK \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a. \u041d\u043e \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0434\u0440\u0438\u0444\u0442 \u0432\u043e\u043a\u0440\u0443\u0433 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u0441\u0438, \u0443\u0431\u0440\u0430\u0442\u044c \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043c\u0430\u0433\u043d\u0438\u0442\u043e\u043c\u0435\u0442\u0440\u0430. \u0412 Cardboard SDK \u043c\u0430\u0433\u043d\u0438\u0442\u043e\u043c\u0435\u0442\u0440 \u043e\u0442\u0434\u0430\u043d \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043c\u0430\u0433\u043d\u0438\u0442\u043d\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u043e\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043e \u0432\u0441\u0435\u0445 Cardboard \u0438\u0433\u0440\u0430\u0445 \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043a\u0443\u0440\u0441\u043e\u0432\u043e\u0439 \u0434\u0440\u0438\u0444\u0442.<\/p>\n<h3>\u041c\u0430\u0433\u043d\u0438\u0442\u043e\u043c\u0435\u0442\u0440<\/h3>\n<p>  \u041c\u0430\u0433\u043d\u0438\u0442\u043e\u043c\u0435\u0442\u0440 \u2013 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u0440\u0435\u0430\u0433\u0438\u0440\u0443\u044e\u0449\u0435\u0435 \u043d\u0430 \u043c\u0430\u0433\u043d\u0438\u0442\u043d\u044b\u0435 \u043f\u043e\u043b\u044f. \u0412 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u043f\u043e\u043a\u043e\u044f \u043f\u0440\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0438 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043c\u0430\u0433\u043d\u0438\u0442\u043d\u044b\u0445 \u0438 \u043c\u0430\u0433\u043d\u0438\u0442\u043d\u044b\u0445 \u043f\u043e\u043c\u0435\u0445 \u043c\u0430\u0433\u043d\u0438\u0442\u043e\u043c\u0435\u0442\u0440 \u0441\u043c\u0430\u0440\u0442\u0444\u043e\u043d\u0430 \u0432\u044b\u0434\u0430\u0435\u0442 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u043c\u0430\u0433\u043d\u0438\u0442\u043d\u043e\u0439 \u0438\u043d\u0434\u0443\u043a\u0446\u0438\u0438 \u043f\u043e\u043b\u044f \u0417\u0435\u043c\u043b\u0438 <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/4c4\/bb9\/f49\/4c4bb9f49fb74d438151297ce1077be5.png\"\/>, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043e\u0431\u044b\u0447\u043d\u043e \u0432 \u043c\u0438\u043a\u0440\u043e\u0442\u0435\u0441\u043b\u0430\u0445 (\u03bcT).  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\"  src=\"https:\/\/habrastorage.org\/files\/cca\/968\/da3\/cca968da3ec147e9b9644a7af727a61a.png\"\/><\/div>\n<p>  \u042d\u0442\u0430 \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u0430\u044f \u043e\u043f\u043e\u0440\u0430 \u0432 \u0432\u0438\u0434\u0435 \u043c\u0430\u0433\u043d\u0438\u0442\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u043f\u043b\u0430\u043d\u0435\u0442\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u0443\u0441\u0442\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0432\u043e\u043a\u0440\u0443\u0433 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u0441\u0438, \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0443\u0441\u0442\u0440\u0430\u043d\u0438\u0432 \u0432\u0435\u0441\u044c \u0434\u0440\u0438\u0444\u0442. \u0421\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043c\u0430\u0433\u043d\u0438\u0442\u043d\u0430\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0446\u0438\u044f \u0434\u0440\u0438\u0444\u0442\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0438 \u043d\u0435 \u0432\u0435\u0437\u0434\u0435 \u0442\u0430\u043a, \u043a\u0430\u043a \u043d\u0430\u043c \u044d\u0442\u043e\u0433\u043e \u0445\u043e\u0447\u0435\u0442\u0441\u044f. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043b\u044e\u0431\u044b\u0435 \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u043c\u0430\u043b\u0435\u0439\u0448\u0438\u0435 \u043f\u043e\u043b\u044f \u043e\u0442 \u043c\u0430\u0433\u043d\u0438\u0442\u043e\u0432 \u0432 \u0447\u0435\u0445\u043b\u0435 \u0441\u043c\u0430\u0440\u0442\u0444\u043e\u043d\u0430 \u0438\u043b\u0438 \u0432 \u043a\u0440\u044b\u0448\u043a\u0435 VR \u0448\u043b\u0435\u043c\u0430 \u043f\u0440\u0438\u0432\u0435\u0434\u0443\u0442 \u043a \u043d\u0435\u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u043e\u043c\u0443 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0443. \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u043d\u0430\u043f\u0440\u044f\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043c\u0430\u0433\u043d\u0438\u0442\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u0440\u0430\u0437\u043d\u0430\u044f \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0443\u0433\u043e\u043b\u043a\u0430\u0445 \u043f\u043b\u0430\u043d\u0435\u0442\u044b, \u043a\u0430\u043a \u0438 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u043c\u0430\u0433\u043d\u0438\u0442\u043d\u043e\u0439 \u0438\u043d\u0434\u0443\u043a\u0446\u0438\u0438. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0446\u0438\u044f \u0434\u0440\u0438\u0444\u0442\u0430 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043c\u0430\u0433\u043d\u0438\u0442\u043e\u043c\u0435\u0442\u0440\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432\u043e\u0437\u043b\u0435 \u043f\u043e\u043b\u044e\u0441\u043e\u0432, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0442\u0430\u043c \u0441\u0438\u043b\u043e\u0432\u044b\u0435 \u043b\u0438\u043d\u0438\u0438 \u043c\u0430\u0433\u043d\u0438\u0442\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0435\u0440\u043f\u0435\u043d\u0434\u0438\u043a\u0443\u043b\u044f\u0440\u043d\u044b \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u0437\u0435\u043c\u043b\u0438 \u0438 \u043d\u0435 \u043d\u0435\u0441\u0443\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439 \u0438\u043d\u0444\u044b \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0441\u0442\u043e\u0440\u043e\u043d \u0441\u0432\u0435\u0442\u0430. \u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0441\u0440\u0435\u0434\u0438 \u043d\u0430\u0441 \u043d\u0435\u0442 \u043f\u043e\u043b\u044f\u0440\u043d\u0438\u043a\u043e\u0432?<\/p>\n<hr\/>\n<p>  <\/p>\n<h2>\u0422\u0435\u043e\u0440\u0438\u044f<\/h2>\n<p>  \u0414\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043a\u0432\u0430\u0442\u0435\u0440\u043d\u0438\u043e\u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430 \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0441\u043e \u0432\u0441\u0435\u0445 \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043d\u0430 \u0435\u0435 \u043e\u0441\u043d\u043e\u0432\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430\u0434 \u043a\u0432\u0430\u0442\u0435\u0440\u043d\u0438\u043e\u043d\u043e\u043c, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u043c \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u041f\u0443\u0441\u0442\u044c <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/a68\/4eb\/3e0\/a684eb3e0fa444639ad845b153baaab1.png\"\/> \u2014 \u0438\u0441\u043a\u043e\u043c\u044b\u0439 \u043a\u0432\u0430\u0442\u0435\u0440\u043d\u0438\u043e\u043d \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u043f\u0435\u0440\u0435\u0434 \u0441\u0442\u0430\u0440\u0442\u043e\u043c \u0446\u0438\u043a\u043b\u0430 \u043f\u0440\u0438\u0441\u0432\u043e\u0438\u043c \u0435\u043c\u0443 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/1bf\/81f\/35d\/1bf81f35d4bc46aaaece7aab208b1cbe.png\"\/>.<\/p>\n<h3>1. \u0418\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u0443\u0435\u043c \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u0433\u0438\u0440\u043e\u0441\u043a\u043e\u043f\u0430<\/h3>\n<p>  \u041a\u0430\u043a \u044f \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b, \u0433\u0438\u0440\u043e\u0441\u043a\u043e\u043f \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u0435\u043a\u0442\u043e\u0440 \u0443\u0433\u043b\u043e\u0432\u044b\u0445 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0435\u0439. \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u0437 \u0443\u0433\u043b\u043e\u0432\u044b\u0445 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0435\u0439 \u0443\u0433\u043b\u043e\u0432\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b, \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0445 \u043f\u0440\u043e\u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u0414\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p>  <b>1.1.<\/b> \u041e\u0431\u044a\u044f\u0432\u0438\u043c \u043a\u0432\u0430\u0442\u0435\u0440\u043d\u0438\u043e\u043d <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/7df\/d74\/de3\/7dfd74de32bb4d169866a670cb7cf4ab.png\"\/> \u0438 \u0437\u0430\u0434\u0430\u0434\u0438\u043c \u0435\u0433\u043e \u043a\u0430\u043a:  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\"  src=\"https:\/\/habrastorage.org\/files\/a89\/ba0\/9b5\/a89ba09b528c4590a7e10b924d7ee6f8.png\"\/><\/div>\n<p>  \u0433\u0434\u0435 <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/b48\/56b\/0ed\/b4856b0edc35477eb7fa44e3bf97abbb.png\"\/> \u2014 \u0432\u0440\u0435\u043c\u044f, \u043f\u0440\u043e\u0448\u0435\u0434\u0448\u0435\u0435 \u0441 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u0446\u0438\u043a\u043b\u0430;<br \/>  <b>1.2.<\/b> \u041e\u0431\u043d\u043e\u0432\u0438\u043c <i>q<\/i> \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/7df\/d74\/de3\/7dfd74de32bb4d169866a670cb7cf4ab.png\"\/>: <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/772\/05a\/628\/77205a6289f041f78a526fcf92953e73.png\"\/>.<\/p>\n<p>  \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043a\u0432\u0430\u0442\u0435\u0440\u043d\u0438\u043e\u043d <i>q<\/i> \u0443\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f, \u043e\u0434\u043d\u0430\u043a\u043e \u0438\u0437-\u0437\u0430 \u043e\u0447\u0435\u043d\u044c \u043d\u0438\u0437\u043a\u043e\u0439 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0441\u043c\u0430\u0440\u0442\u0444\u043e\u043d\u043d\u043e\u0433\u043e \u0433\u0438\u0440\u043e\u0441\u043a\u043e\u043f\u0430 \u043e\u043d \u0443\u0436\u0430\u0441\u043d\u043e \u043f\u043b\u044b\u0432\u0435\u0442 \u043f\u043e \u0432\u0441\u0435\u043c \u0442\u0440\u0435\u043c \u043e\u0441\u044f\u043c.<\/p>\n<h3>2. \u0412\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430 (Tilt Correction)<\/h3>\n<p>  \u0412 \u044d\u0442\u043e\u043c \u043d\u0430\u043c \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0430\u043a\u0441\u0435\u043b\u0435\u0440\u043e\u043c\u0435\u0442\u0440. \u0412\u043a\u0440\u0430\u0442\u0446\u0435, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043a\u0432\u0430\u0442\u0435\u0440\u043d\u0438\u043e\u043d \u0438 \u0443\u043c\u043d\u043e\u0436\u0438\u0442\u044c \u0435\u0433\u043e \u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u044d\u0442\u0430\u043f\u0435. \u041a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043a\u0432\u0430\u0442\u0435\u0440\u043d\u0438\u043e\u043d \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u0430-\u043e\u0441\u0438 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0438 \u0443\u0433\u043b\u0430 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430.<\/p>\n<p>  <b>2.1.<\/b> \u0411\u0435\u0440\u0435\u043c \u0432\u0435\u043a\u0442\u043e\u0440 \u0430\u043a\u0441\u0435\u043b\u0435\u0440\u043e\u043c\u0435\u0442\u0440\u0430 \u043a\u0430\u043a \u043a\u0432\u0430\u0442\u0435\u0440\u043d\u0438\u043e\u043d: <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/234\/355\/430\/2343554309444371b64e892bd426515a.png\"\/><br \/>  <b>2.2.<\/b> \u041f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u044d\u0442\u043e\u0442 \u043a\u0432\u0430\u0442\u0435\u0440\u043d\u0438\u043e\u043d \u0430\u043a\u0441\u0435\u043b\u0435\u0440\u043e\u043c\u0435\u0442\u0440\u0430 \u043d\u0430\u0448\u0438\u043c \u043a\u0432\u0430\u0442\u0435\u0440\u043d\u0438\u043e\u043d\u043e\u043c \u0433\u0438\u0440\u043e\u0441\u043a\u043e\u043f\u0430: <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/28b\/b41\/86d\/28bb4186d0fb4a45b8c53f5171fcc9ea.png\"\/><br \/>  <b>2.3.<\/b> \u0411\u0435\u0440\u0435\u043c \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043a\u0432\u0430\u0442\u0435\u0440\u043d\u0438\u043e\u043d\u0430 <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/2ea\/0b2\/716\/2ea0b271604645049964a6a529d45693.png\"\/>: <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/ab5\/df9\/615\/ab5df9615f1e48b28c3d955498f1f9ea.png\"\/><br \/>  <b>2.4.<\/b> \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0435\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u0432\u0435\u043a\u0442\u043e\u0440, \u0437\u0430\u0434\u0430\u044e\u0449\u0438\u0439 \u043e\u0441\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f: <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/45f\/fb8\/282\/45ffb82822604fad86c2a983ec84e906.png\"\/><br \/>  <b>2.5.<\/b> \u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0439\u0442\u0438 \u0443\u0433\u043e\u043b: <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/770\/4fe\/7ef\/7704fe7ef93b438fbaf17deb1f685602.png\"\/><br \/>  <b>2.6.<\/b> \u0418 \u0441\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0432\u0430\u0442\u0435\u0440\u043d\u0438\u043e\u043d \u043e\u0442 \u0433\u0438\u0440\u043e\u0441\u043a\u043e\u043f\u0430: <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/666\/4ec\/a53\/6664eca53a644f5b8c4dc20c029cc307.png\"\/>, \u0433\u0434\u0435 <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/823\/8da\/d15\/8238dad15fa241d1bd59dbc5df185218.png\"\/> \u2014 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0441\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u043d\u0438\u044f, \u0447\u0435\u043c \u043e\u043d \u043c\u0435\u043d\u044c\u0448\u0435 \u2014 \u0442\u0435\u043c \u043f\u043b\u0430\u0432\u043d\u0435\u0435 \u0438 \u0434\u043e\u043b\u044c\u0448\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u0442\u0430\u0431\u0438\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442, \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u2014 0.1.<\/p>\n<p>  \u0412\u0441\u0435, \u0442\u0435\u043f\u0435\u0440\u044c <i>q<\/i> \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u043c\u0435\u0440\u0443 \u0432\u0432\u0435\u0440\u0445 \u043d\u043e\u0433\u0430\u043c\u0438, \u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d \u043b\u0438\u0448\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0434\u0440\u0438\u0444\u0442 \u0432\u043e\u043a\u0440\u0443\u0433 \u043e\u0441\u0438 Y.<\/p>\n<h3>3. \u0423\u0431\u0438\u0440\u0430\u0435\u043c \u0434\u0440\u0438\u0444\u0442 \u0432\u043e\u043a\u0440\u0443\u0433 \u043e\u0441\u0438 Y \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043c\u0430\u0433\u043d\u0438\u0442\u043e\u043c\u0435\u0442\u0440\u0430 (Yaw Correction)<\/h3>\n<p>  \u041a\u043e\u043c\u043f\u0430\u0441 \u0441\u043c\u0430\u0440\u0442\u0444\u043e\u043d\u0430 \u2014 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043a\u0430\u043f\u0440\u0438\u0437\u043d\u0430\u044f \u0432\u0435\u0449\u044c, \u0435\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438, \u043f\u043e\u0434\u043d\u0435\u0441\u0435\u043d\u0438\u044f \u043a \u043c\u0430\u0441\u0441\u0438\u0432\u043d\u044b\u043c \u0436\u0435\u043b\u0435\u0437\u043a\u0430\u043c \u0438\u043b\u0438 \u043c\u0430\u0433\u043d\u0438\u0442\u0430\u043c. \u041f\u043e\u0442\u0435\u0440\u044f \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043a\u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 VR \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u043d\u0435\u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u043e\u043c\u0443 \u043e\u0442\u043a\u043b\u0438\u043a\u0443 \u043a\u0430\u043c\u0435\u0440\u044b \u043d\u0430 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0433\u043e\u043b\u043e\u0432\u044b. \u0412 99% \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u043a\u043e\u043c\u043f\u0430\u0441 \u0443 \u0441\u0440\u0435\u0434\u043d\u0435\u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043d\u0435 \u043e\u0442\u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u0430\u043d, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043d\u0430\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0444\u0438\u0447\u0443 \u043a\u043e\u0440\u0440\u0435\u043a\u0446\u0438\u0438 \u0434\u0440\u0438\u0444\u0442\u0430 \u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u0439, \u0438\u043d\u0430\u0447\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0445\u0432\u0430\u0442\u0430\u0442\u044c \u043d\u0435\u0433\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u043e\u0442\u0437\u044b\u0432\u043e\u0432. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435 \u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043a\u0438 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u0439 \u043a\u043e\u0440\u0440\u0435\u043a\u0446\u0438\u0435\u0439. \u041d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u0430\u043c\u0443 \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043a\u0443 \u0431\u0435\u0440\u0435\u0442 \u043d\u0430 \u0441\u0435\u0431\u044f Android, \u0434\u043b\u044f \u0435\u0435 \u0432\u044b\u0437\u043e\u0432\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0441\u043c\u0430\u0440\u0442\u0444\u043e\u043d\u043e\u043c \u0432 \u0432\u043e\u0437\u0434\u0443\u0445\u0435 \u0446\u0438\u0444\u0440\u0443 \u00ab8\u00bb \u0438\u043b\u0438 &quot;\u221e&quot;.  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\"  src=\"https:\/\/habrastorage.org\/files\/db5\/a7f\/22a\/db5a7f22a5a14db390886b58f0ccf3e4.png\"\/><\/div>\n<p>  \u0416\u0430\u043b\u044c, \u0447\u0442\u043e Android \u043d\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441 \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043a\u0438 \u043a\u043e\u043c\u043f\u0430\u0441\u0430 \u0438 \u0432\u044b\u0434\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430 \u00ab\u0432\u0441\u0451, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u0430\u0445\u0430\u0442\u044c\u00bb, \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0441\u0430\u043c\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u043e\u0440\u043e\u0447\u0438\u0442\u044c\u0441\u044f \u0438 \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0432\u0437\u043c\u0430\u0445\u0438 \u0430\u043a\u0441\u0435\u043b\u0435\u0440\u043e\u043c\u0435\u0442\u0440\u043e\u043c, \u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043c\u044b \u044d\u0442\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u0435 \u0431\u0443\u0434\u0435\u043c. \u041f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043b\u0443\u0447\u0448\u0435 \u043a \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u0441\u0438\u043b\u044c\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0446\u0438\u0438 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430 \u0430\u043a\u0441\u0435\u043b\u0435\u0440\u043e\u043c\u0435\u0442\u0440\u043e\u043c:<\/p>\n<p>  <b>3.1.<\/b> \u0422\u0430\u043a \u0436\u0435 \u043e\u0444\u043e\u0440\u043c\u043b\u044f\u0435\u043c \u0432\u0435\u043a\u0442\u043e\u0440 \u043a\u043e\u043c\u043f\u0430\u0441\u0430 \u0432 \u0432\u0438\u0434\u0435 \u043a\u0432\u0430\u0442\u0435\u0440\u043d\u0438\u043e\u043d\u0430: <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/d99\/023\/e15\/d99023e159d74b469e215b9013f545a7.png\"\/><br \/>  <b>3.2.<\/b> \u0418 \u043f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c: <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/d12\/26a\/f45\/d1226af452774de697265bc363a77dea.png\"\/><br \/>  <b>3.3.<\/b> \u041e\u0441\u044c\u044e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f Y (0, 1, 0), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u0443\u0433\u043e\u043b: <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/eb6\/fe1\/afc\/eb6fe1afc9294ce2aa1afd10b2ef06b4.png\"\/><br \/>  <b>3.4.<\/b> \u041a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u0443\u0435\u043c: <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/32f\/a5b\/7fe\/32fa5b7fe8c64e7fb03a51e3d69e1c5d.png\"\/>, \u0433\u0434\u0435 <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/f31\/150\/8eb\/f311508ebe84402eb45ccd693119faa4.png\"\/> \u2014 \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0441\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u043d\u0438\u044f, \u043a\u0430\u043a <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/823\/8da\/d15\/8238dad15fa241d1bd59dbc5df185218.png\"\/> \u0432\u044b\u0448\u0435<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0434\u0440\u0438\u0444\u0442 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c, \u0435\u0441\u043b\u0438 \u043c\u0430\u0433\u043d\u0438\u0442\u043e\u043c\u0435\u0442\u0440 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u043e\u0442\u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u0430\u043d, \u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0433\u0435\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u043b\u0438\u0437\u043a\u043e \u043a \u043f\u043e\u043b\u044e\u0441\u0430\u043c \u0417\u0435\u043c\u043b\u0438. \u0421\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043c\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0441\u043f\u043e\u0441\u043e\u0431\u0430, <a href=\"https:\/\/developer3.oculus.com\/blog\/magnetometer\/\">\u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u0432 Oculus Rift<\/a>. \u0422\u0430\u043c \u0441\u0443\u0442\u044c \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c: \u0434\u043b\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u0446\u0438\u043a\u043b\u0430 \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u043a\u0432\u0430\u0442\u0435\u0440\u043d\u0438\u043e\u043d \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0435\u043c\u0443 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u043c\u0430\u0433\u043d\u0438\u0442\u043e\u043c\u0435\u0442\u0440\u0430 (\u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0442.\u043d. reference points); \u0434\u0430\u043b\u044c\u0448\u0435 \u0441\u043c\u043e\u0442\u0440\u0438\u043c: \u0435\u0441\u043b\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u043c\u0430\u0433\u043d\u0438\u0442\u043e\u043c\u0435\u0442\u0440\u0430 \u043d\u0435 \u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f, \u0430 \u043a\u0432\u0430\u0442\u0435\u0440\u043d\u0438\u043e\u043d \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u00ab\u0435\u0434\u0435\u0442\u00bb \u2014 \u0442\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0443\u0433\u043e\u043b \u0434\u0440\u0438\u0444\u0442\u0430, \u0438 \u043a\u0432\u0430\u0442\u0435\u0440\u043d\u0438\u043e\u043d \u0434\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043d\u0435\u0433\u043e \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443. \u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0445\u043e\u0440\u043e\u0448\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 Oculus, \u043d\u043e \u043d\u0435\u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u043d\u0430 \u0441\u043c\u0430\u0440\u0442\u0444\u043e\u043d\u0430\u0445 \u0438\u0437-\u0437\u0430 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u0430\u043b\u043e\u0439 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0438\u0445 \u043c\u0430\u0433\u043d\u0438\u0442\u043e\u043c\u0435\u0442\u0440\u043e\u0432. \u042f \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u0438\u0437 \u0441\u0442\u0430\u0442\u044c\u0438 \u2014 \u043d\u0430 \u0441\u043c\u0430\u0440\u0442\u0444\u043e\u043d\u0430\u0445 \u043e\u043d \u0434\u0435\u0440\u0433\u0430\u0435\u0442 \u043a\u0430\u043c\u0435\u0440\u0443 \u0438 \u0442\u043e\u043b\u043a\u043e\u043c \u043d\u0435 \u0443\u0431\u0438\u0440\u0430\u0435\u0442 \u0434\u0440\u0438\u0444\u0442 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c.<\/p>\n<hr\/>\n<p>  <\/p>\n<h2>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/h2>\n<p>  \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u0443\u0441\u0442\u043e\u0439 android \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <a href=\"https:\/\/libgdx.badlogicgames.com\/nightlies\/dist\/gdx-setup.jar\">gdx-setup.jar<\/a>.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\"  src=\"https:\/\/habrastorage.org\/files\/e59\/54b\/b7a\/e5954bb7a98044068aa75bab3c2dbd4c.png\"\/><\/div>\n<p>  \u0422\u0438\u043f\u0438\u0447\u043d\u044b\u0439 android \u043f\u0440\u043e\u0435\u043a\u0442 libgdx \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d \u043d\u0430 \u0434\u0432\u0430 \u043c\u043e\u0434\u0443\u043b\u044f: android \u0438 core. \u0412 \u043f\u0435\u0440\u0432\u043e\u043c \u043c\u043e\u0434\u0443\u043b\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e-\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0439 \u043a\u043e\u0434, \u0430 \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u0438\u0433\u0440\u044b \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430. \u0412\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043c\u043e\u0434\u0443\u043b\u0435\u043c core \u0438 android \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b, \u0438\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u0442\u044c 3 \u0444\u0430\u0439\u043b\u0430:<\/p>\n<ol>\n<li> <b>VRSensorManager<\/b> \u2014 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0441\u0435\u043d\u0441\u043e\u0440\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430<\/li>\n<li> <b>VRSensorManagerAndroid<\/b> \u2014 \u0435\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/li>\n<li> <b>VRCamera<\/b> \u2014 \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u0430\u044f \u043a\u0430\u043c\u0435\u0440\u0430 \u0434\u043b\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438<\/li>\n<\/ol>\n<p>  \u0418 \u0432\u043d\u0435\u0441\u0442\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 2 \u0444\u0430\u0439\u043b\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430:<\/p>\n<ol>\n<li> <b>AndroidLauncher<\/b> \u2014 \u0441\u0442\u0430\u0440\u0442\u0435\u0440-\u043a\u043b\u0430\u0441\u0441 android \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/li>\n<li> <b>GdxVR<\/b> \u2014 \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/li>\n<\/ol>\n<p>  \u0418\u0441\u0445\u043e\u0434\u043d\u0438\u043a \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u044f \u0437\u0430\u043b\u0438\u043b \u0432 <a href=\"https:\/\/github.com\/SinuXVR\/GdxVR-Sample-1\">\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043d\u0430 \u0433\u0438\u0442\u0445\u0430\u0431\u0435<\/a>, \u043a\u043e\u0434 \u044f \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u043b\u0441\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u044f\u0441\u043d\u044e \u043b\u0438\u0448\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b.<\/p>\n<h3>VRSensorManager<\/h3>\n<p>  \u0412\u0441\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0434\u0430\u0442\u0447\u0438\u043a\u0430\u043c\u0438 \u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u043a\u0432\u0430\u0442\u0435\u0440\u043d\u0438\u043e\u043d\u0430 \u044f \u0432\u044b\u0432\u0435\u043b \u0432 \u043c\u043e\u0434\u0443\u043b\u044c android, \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043a\u0432\u0430\u0442\u0435\u0440\u043d\u0438\u043e\u043d\u0430 \u0432 \u043c\u043e\u0434\u0443\u043b\u0435 core \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">VRSensorManager.java<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">package com.sinuxvr.sample; import com.badlogic.gdx.math.Quaternion; \/** \u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e-\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u043c \u043a\u043e\u0434\u043e\u043c *\/ interface VRSensorManager {     \/** \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0433\u0438\u0440\u043e\u0441\u043a\u043e\u043f\u0430 *\/     boolean isGyroAvailable();     \/** \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043c\u0430\u0433\u043d\u0438\u0442\u043e\u043c\u0435\u0442\u0440\u0430 *\/     boolean isMagAvailable();     \/** \u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u043b\u0438\u0441\u0442\u0435\u043d\u0435\u0440\u043e\u0432 *\/     void startTracking();     \/** \u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043b\u0438\u0441\u0442\u0435\u043d\u0435\u0440\u043e\u0432 *\/     void endTracking();     \/** \u0412\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435-\u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0446\u0438\u0438 \u0434\u0440\u0438\u0444\u0442\u0430 \u043d\u0430 \u043b\u0435\u0442\u0443      * @param use - true - \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043e, false - \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043e *\/     void useDriftCorrection(boolean use);     \/** \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u0432\u0430\u0442\u0435\u0440\u043d\u0438\u043e\u043d\u0430 \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0433\u043e\u043b\u043e\u0432\u044b      * @return \u043a\u0432\u0430\u0442\u0435\u0440\u043d\u0438\u043e\u043d \u0434\u043b\u044f \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a\u0430\u043c\u0435\u0440\u044b *\/     Quaternion getHeadQuaternion(); }<\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0412\u0441\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0437\u0434\u0435\u0441\u044c \u0438\u043d\u0442\u0443\u0438\u0442\u0438\u0432\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u044b, \u0434\u0443\u043c\u0430\u044e \u043d\u0438 \u0443 \u043a\u043e\u0433\u043e \u043d\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432. \u041c\u0435\u0442\u043e\u0434\u044b isGyroAvailable \u0438 isMagAvailable \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043d\u0438\u0433\u0434\u0435 \u043d\u0435 \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u044b, \u043d\u043e \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u043a\u043e\u043c\u0443-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u044c\u0441\u044f, \u0432 \u0441\u0432\u043e\u0435\u0439 \u0438\u0433\u0440\u0435 \u044f \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e.<\/p>\n<h3>VRSensorManagerAndroid<\/h3>\n<p>  \u0422\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432 \u043c\u043e\u0434\u0443\u043b\u0435 android \u043c\u043e\u0436\u043d\u043e \u043b\u0438\u0448\u044c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441 \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432, \u0430 \u043a\u0432\u0430\u0442\u0435\u0440\u043d\u0438\u043e\u043d \u043f\u043e \u043d\u0438\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u0443\u0436\u0435 \u0432 core. \u042f \u0440\u0435\u0448\u0438\u043b \u0432\u0441\u0435 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0432 \u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435, \u0447\u0442\u043e\u0431\u044b \u043a\u043e\u0434 \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0449\u0435 \u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434 \u0434\u0440\u0443\u0433\u0438\u0435 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">VRSensorManagerAndroid.java<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">package com.sinuxvr.sample;  import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.math.MathUtils; import com.badlogic.gdx.math.Quaternion; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.math.Vector3;  \/** \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043b\u0438\u0441\u0442\u0435\u043d\u0435\u0440\u0430 \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432 \u043f\u043e\u0434 Android. \u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442 \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u043a\u0432\u0430\u0442\u0435\u0440\u043d\u0438\u043e\u043d  * \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u0434\u043b\u044f \u043a\u0430\u043c\u0435\u0440\u044b \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0438\u043c\u0435\u044e\u0449\u0438\u0445\u0441\u044f \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432 \u0432 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0435.  * \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b: \u0430\u043a\u0441\u0435\u043b\u0435\u0440\u043e\u043c\u0435\u0442\u0440, \u0430\u043a\u0441\u0435\u043b\u0435\u0440\u043e\u043c\u0435\u0442\u0440 + \u043c\u0430\u0433\u043d\u0438\u0442\u043e\u043c\u0435\u0442\u0440, \u0433\u0438\u0440\u043e\u0441\u043a\u043e\u043f + \u0430\u043a\u0441\u0435\u043b\u0435\u0440\u043e\u043c\u0435\u0442\u0440,  * \u0433\u0438\u0440\u043e\u0441\u043a\u043e\u043f + \u0430\u043a\u0441\u0435\u043b\u0435\u0440\u043e\u043c\u0435\u0442\u0440 + \u043c\u0430\u0433\u043d\u0438\u0442\u043e\u043c\u0435\u0442\u0440 *\/  class VRSensorManagerAndroid implements VRSensorManager {      \/** \u041f\u0435\u0440\u0435\u0447\u0435\u043d\u044c \u0440\u0435\u0436\u0438\u043c\u043e\u0432 \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432 *\/     private enum VRControlMode { ACC_ONLY, ACC_GYRO, ACC_MAG, ACC_GYRO_MAG }      private SensorManager sensorManager;                \/\/ \u0421\u0435\u043d\u0441\u043e\u0440\u043d\u044b\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440     private SensorEventListener accelerometerListener;  \/\/ \u041b\u0438\u0441\u0442\u0435\u043d\u0435\u0440 \u0430\u043a\u0441\u0435\u043b\u0435\u0440\u043e\u043c\u0435\u0442\u0440\u0430     private SensorEventListener gyroscopeListener;      \/\/ \u041b\u0438\u0441\u0442\u0435\u043d\u0435\u0440 \u0433\u0438\u0440\u043e\u0441\u043a\u043e\u043f\u0430     private SensorEventListener compassListener;        \/\/ \u041b\u0438\u0441\u0442\u0435\u043d\u0435\u0440 \u043c\u0430\u0433\u043d\u0438\u0442\u043e\u043c\u0435\u0442\u0440\u0430     private Context context;                            \/\/ \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f      \/** \u041c\u0430\u0441\u0441\u0438\u0432\u044b \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 *\/     private final float[] accelerometerValues = new float[3];   \/\/ \u0410\u043a\u0441\u0435\u043b\u0435\u0440\u043e\u043c\u0435\u0442\u0440     private final float[] gyroscopeValues = new float[3];       \/\/ \u0413\u0438\u0440\u043e\u0441\u043a\u043e\u043f     private final float[] magneticFieldValues = new float[3];   \/\/ \u041c\u0430\u0433\u043d\u0438\u0442\u043e\u043c\u0435\u0442\u0440     private final boolean gyroAvailable;                        \/\/ \u0424\u043b\u0430\u0433 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0433\u0438\u0440\u043e\u0441\u043a\u043e\u043f\u0430     private final boolean magAvailable;                         \/\/ \u0424\u043b\u0430\u0433 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043c\u0430\u0433\u043d\u0438\u0442\u043e\u043c\u0435\u0442\u0440\u0430     private volatile boolean useDC;                             \/\/ \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u0438 \u043c\u0430\u0433\u043d\u0438\u0442\u043e\u043c\u0435\u0442\u0440      \/** \u041a\u0432\u0430\u0442\u0435\u0440\u043d\u0438\u043e\u043d\u044b \u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 headOrientation *\/     private final Quaternion gyroQuaternion;     private final Quaternion deltaQuaternion;     private final Vector3 accInVector;     private final Vector3 accInVectorTilt;     private final Vector3 magInVector;     private final Quaternion headQuaternion;     private VRControlMode vrControlMode;      \/** \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 *\/     VRSensorManagerAndroid(Context context) {         this.context = context;         \/\/ \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u0435\u043d\u0441\u043e\u0440\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430         sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);          \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432 (\u0430\u043a\u0441\u0435\u043b\u0435\u0440\u043e\u043c\u0435\u0442\u0440 \u0435\u0441\u0442\u044c \u0432\u0441\u0435\u0433\u0434\u0430 100%, \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435)         magAvailable = (sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD) != null);         gyroAvailable = (sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE) != null);         useDC = false;          \/\/ \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0436\u0438\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0438\u043c\u0435\u044e\u0449\u0438\u0445\u0441\u044f \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432         vrControlMode = VRControlMode.ACC_ONLY;         if (gyroAvailable) vrControlMode = VRControlMode.ACC_GYRO;         if (magAvailable) vrControlMode = VRControlMode.ACC_MAG;         if (gyroAvailable && magAvailable) vrControlMode = VRControlMode.ACC_GYRO_MAG;          \/\/ \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u0432\u0430\u0442\u0435\u0440\u043d\u0438\u043e\u043d\u043e\u0432         gyroQuaternion = new Quaternion(0, 0, 0, 1);         deltaQuaternion = new Quaternion(0, 0, 0, 1);         accInVector = new Vector3(0, 10, 0);         accInVectorTilt = new Vector3(0, 0, 0);         magInVector = new Vector3(1, 0, 0);         headQuaternion = new Quaternion(0, 0, 0, 1);          \/\/ \u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432         startTracking();     }      \/** \u0412\u043e\u0437\u0432\u0440\u0430\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0433\u0438\u0440\u043e\u0441\u043a\u043e\u043f\u0430 *\/     @Override     public boolean isGyroAvailable() {         return gyroAvailable;     }      \/** \u0412\u043e\u0437\u0432\u0440\u0430\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043c\u0430\u0433\u043d\u0438\u0442\u043e\u043c\u0435\u0442\u0440\u0430 *\/     @Override     public boolean isMagAvailable() {         return magAvailable;     }      \/** \u0421\u0442\u0430\u0440\u0442 \u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430 - \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u043b\u0438\u0441\u0442\u0435\u043d\u0435\u0440\u043e\u0432 *\/     @Override     public void startTracking() {         \/\/ \u0410\u043a\u0441\u0435\u043b\u0435\u0440\u043e\u043c\u0435\u0442\u0440 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043b\u044e\u0431\u043e\u043c \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u0435         sensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);         Sensor accelerometer = sensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER).get(0);         accelerometerListener = new SensorListener(this.accelerometerValues, this.magneticFieldValues, this.gyroscopeValues);         sensorManager.registerListener(accelerometerListener, accelerometer, SensorManager.SENSOR_DELAY_GAME);         \/\/ \u041c\u0430\u0433\u043d\u0438\u0442\u043e\u043c\u0435\u0442\u0440         if (magAvailable) {             sensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);             Sensor compass = sensorManager.getSensorList(Sensor.TYPE_MAGNETIC_FIELD).get(0);             compassListener = new SensorListener(this.accelerometerValues, this.magneticFieldValues, this.gyroscopeValues);             sensorManager.registerListener(compassListener, compass, SensorManager.SENSOR_DELAY_GAME);         }         \/\/ \u0413\u0438\u0440\u043e\u0441\u043a\u043e\u043f         if (gyroAvailable) {             sensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);             Sensor gyroscope = sensorManager.getSensorList(Sensor.TYPE_GYROSCOPE).get(0);             gyroscopeListener = new SensorListener(this.gyroscopeValues, this.magneticFieldValues, this.gyroscopeValues);             sensorManager.registerListener(gyroscopeListener, gyroscope, SensorManager.SENSOR_DELAY_GAME);         }     }      \/** \u041e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430 - \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043b\u0438\u0441\u0442\u0435\u043d\u0435\u0440\u043e\u0432 *\/     @Override     public void endTracking() {         if (sensorManager != null) {             if (accelerometerListener != null) {                 sensorManager.unregisterListener(accelerometerListener);                 accelerometerListener = null;             }             if (gyroscopeListener != null) {                 sensorManager.unregisterListener(gyroscopeListener);                 gyroscopeListener = null;             }             if (compassListener != null) {                 sensorManager.unregisterListener(compassListener);                 compassListener = null;             }             sensorManager = null;         }     }      \/** \u0412\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435-\u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0430\u0433\u043d\u0438\u0442\u043e\u043c\u0435\u0442\u0440\u0430 \u043d\u0430 \u043b\u0435\u0442\u0443 *\/     @Override     public void useDriftCorrection(boolean useDC) {         \/\/ \u0420\u0435\u0430\u043b\u044c\u043d\u043e \u043b\u0438\u0441\u0442\u0435\u043d\u0435\u0440 \u043c\u0430\u0433\u043d\u0438\u0442\u043e\u043c\u0435\u0442\u0440\u0430 \u043d\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f, \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u043c \u0435\u0433\u043e \u043f\u0440\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f\u0445         this.useDC = useDC;     }      \/** \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u043a\u0432\u0430\u0442\u0435\u0440\u043d\u0438\u043e\u043d\u0430 \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u0438 *\/     @Override     public synchronized Quaternion getHeadQuaternion() {         \/\/ \u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0440\u0435\u0436\u0438\u043c\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f         switch (vrControlMode) {             \/\/ \u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0434\u043d\u0438\u043c \u0430\u043a\u0441\u0435\u043b\u0435\u0440\u043e\u043c\u0435\u0442\u0440\u043e\u043c             case ACC_ONLY: updateAccData(0.1f);                 \/\/ \u0412\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043f\u043e Yaw \u043d\u0430\u043a\u043b\u043e\u043d\u0430\u043c\u0438 \u0433\u043e\u043b\u043e\u0432\u044b \u0438\u0437 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 (\u043a\u0430\u043a \u0432\u043e \u0432\u0441\u044f\u043a\u0438\u0445 \u0433\u043e\u043d\u043a\u0430\u0445)                 headQuaternion.setFromAxisRad(0, 1, 0, -MathUtils.sin(accelerometerValues[0] \/ 200f)).mul(gyroQuaternion).nor();                 gyroQuaternion.set(headQuaternion);                 break;              \/\/ \u0410\u043a\u0441\u0435\u043b\u0435\u0440\u043e\u043c\u0435\u0442\u0440 + \u043c\u0430\u0433\u043d\u0438\u0442\u043e\u043c\u0435\u0442\u0440 (\u0435\u0441\u043b\u0438 \u0432 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u0432\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0439 \u043a\u043e\u043c\u043f\u0430\u0441, \u0442\u043e \u0434\u0430\u043d\u043d\u0430\u044f \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044f             \/\/ \u0432\u0435\u0434\u0435\u0442 \u0441\u0435\u0431\u044f \u043f\u043e\u0447\u0442\u0438 \u043a\u0430\u043a \u0433\u0438\u0440\u043e\u0441\u043a\u043e\u043f, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u044d\u0442\u0430\u043a\u0430\u044f \u044d\u043c\u0443\u043b\u044f\u0446\u0438\u044f \u0433\u0438\u0440\u043e)             case ACC_MAG: updateAccData(0.2f);                 if (!useDC) {                     headQuaternion.setFromAxisRad(0, 1, 0, -MathUtils.sin(accelerometerValues[0] \/ 200f)).mul(gyroQuaternion).nor();                     gyroQuaternion.set(headQuaternion);                 } else updateMagData(1f, 0.05f);                 break;              \/\/ \u0413\u0438\u0440\u043e\u0441\u043a\u043e\u043f + \u0430\u043a\u0441\u0435\u043b\u0435\u0440\u043e\u043c\u0435\u0442\u0440             case ACC_GYRO: updateGyroData(0.1f);                 updateAccData(0.02f);                 break;              \/\/ \u0412\u0441\u0435 \u0442\u0440\u0438 \u0434\u0430\u0442\u0447\u0438\u043a\u0430 - must have, \u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u043a\u043e\u043c\u043f\u0430\u0441 \u043e\u0442\u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u0430\u043d             case ACC_GYRO_MAG: float dQLen = updateGyroData(0.1f);                 updateAccData(0.02f);                 if (useDC) updateMagData(dQLen, 0.005f);         }          return headQuaternion;     }      \/** \u041b\u043e\u0433\u0438\u043a\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u0438      * \u0418\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0438\u0439 \u0433\u0438\u0440\u043e\u0441\u043a\u043e\u043f\u0430 \u0432 \u043a\u0432\u0430\u0442\u0435\u0440\u043d\u0438\u043e\u043d      * @param driftThreshold - \u043f\u043e\u0440\u043e\u0433 \u0434\u043b\u044f \u043e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u0434\u0440\u0438\u0444\u0442\u0430 \u043f\u043e\u043a\u043e\u044f      * @return - \u0434\u043b\u0438\u043d\u0430 \u043a\u0432\u0430\u0442\u0435\u0440\u043d\u0438\u043e\u043d\u0430 deltaQuaternion *\/     private synchronized float updateGyroData(float driftThreshold) {         float wX = gyroscopeValues[0];         float wY = gyroscopeValues[1];         float wZ = gyroscopeValues[2];          \/\/ \u0418\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0438\u0439 \u0433\u0438\u0440\u043e\u0441\u043a\u043e\u043f\u0430         float l = Vector3.len(wX, wY, wZ);         float dtl2 = Gdx.graphics.getDeltaTime() * l * 0.5f;         if (l &gt; driftThreshold) {             float sinVal = MathUtils.sin(dtl2) \/ l;             deltaQuaternion.set(sinVal * wX, sinVal * wY, sinVal * wZ, MathUtils.cos(dtl2));         } else deltaQuaternion.set(0, 0, 0, 1);         gyroQuaternion.mul(deltaQuaternion);         return l;     }      \/** \u041a\u043e\u0440\u0440\u0435\u043a\u0446\u0438\u044f Tilt \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0430\u043a\u0441\u0435\u043b\u0435\u0440\u043e\u043c\u0435\u0442\u0440\u0430      * @param filterAlpha - \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 *\/     private synchronized void updateAccData(float filterAlpha) {         \/\/ \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0430\u043a\u0441\u0435\u043b\u0435\u0440\u043e\u043c\u0435\u0442\u0440\u0430 \u0432 \u0438\u043d\u0435\u0440\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b         accInVector.set(accelerometerValues[0], accelerometerValues[1], accelerometerValues[2]);         gyroQuaternion.transform(accInVector);         accInVector.nor();          \/\/ \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043e\u0441\u0438 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 accInVector \u0438 UP(0, 1, 0)         float xzLen = 1f \/ Vector2.len(accInVector.x, accInVector.z);         accInVectorTilt.set(-accInVector.z * xzLen, 0, accInVector.x * xzLen);          \/\/ \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0443\u0433\u043b\u0430 \u043c\u0435\u0436\u0434\u0443 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u043c accInVector \u0438 UP(0, 1, 0)         float fi = (float)Math.acos(accInVector.y);          \/\/ \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 Tilt-\u0441\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u0432\u0430\u0442\u0435\u0440\u043d\u0438\u043e\u043d\u0430 \u043f\u043e \u0434\u0430\u043d\u043d\u044b\u043c \u0430\u043a\u0441\u0435\u043b\u0435\u0440\u043e\u043c\u0435\u0442\u0440\u0430         headQuaternion.setFromAxisRad(accInVectorTilt, filterAlpha * fi).mul(gyroQuaternion).nor();         gyroQuaternion.set(headQuaternion);     }      \/** \u041a\u043e\u0440\u0440\u0435\u043a\u0446\u0438\u044f \u0443\u0433\u043b\u0430 \u043f\u043e Yaw \u043c\u0430\u0433\u043d\u0438\u0442\u043e\u043c\u0435\u0442\u0440\u043e\u043c      * @param dQLen - \u0434\u043b\u0438\u043d\u0430 \u043a\u0432\u0430\u0442\u0435\u0440\u043d\u0438\u043e\u043d\u0430 deltaQuaternion      * @param filterAlpha - \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438      * \u041a\u043e\u0440\u0440\u0435\u043a\u0446\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0438 *\/     private synchronized void updateMagData(float dQLen, float filterAlpha) {         \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0434\u043b\u0438\u043d\u044b deltaQuaternion \u0434\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0446\u0438\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0438         if (dQLen &lt; 0.1f) return;         \/\/ \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043c\u0430\u0433\u043d\u0438\u0442\u043e\u043c\u0435\u0442\u0440\u0430 \u0432 \u0438\u043d\u0435\u0440\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b         magInVector.set(magneticFieldValues[0], magneticFieldValues[1], magneticFieldValues[2]);         gyroQuaternion.transform(magInVector);          \/\/ \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u0443\u044e\u0449\u0435\u0433\u043e Yaw \u0443\u0433\u043b\u0430 \u0441 \u043c\u0430\u0433\u043d\u0438\u0442\u043e\u043c\u0435\u0442\u0440\u0430         float theta = MathUtils.atan2(magInVector.z, magInVector.x);          \/\/ \u041a\u043e\u0440\u0440\u0435\u043a\u0446\u0438\u044f \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u0438         headQuaternion.setFromAxisRad(0, 1, 0, filterAlpha * theta).mul(gyroQuaternion).nor();         gyroQuaternion.set(headQuaternion);     }      \/** \u0421\u0432\u043e\u044f \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u0430 \u0441\u0435\u043d\u0441\u043e\u0440\u043d\u043e\u0433\u043e \u043b\u0438\u0441\u0442\u0435\u043d\u0435\u0440\u0430 (\u043a\u043e\u043f\u0438\u043f\u0430\u0441\u0442 \u0438\u0437 AndroidInput) *\/     private class SensorListener implements SensorEventListener {         final float[] accelerometerValues;         final float[] magneticFieldValues;         final float[] gyroscopeValues;          SensorListener (float[] accelerometerValues, float[] magneticFieldValues, float[] gyroscopeValues) {             this.accelerometerValues = accelerometerValues;             this.magneticFieldValues = magneticFieldValues;             this.gyroscopeValues = gyroscopeValues;         }          \/\/ \u0421\u043c\u0435\u043d\u0430 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 (\u043d\u0430\u0441 \u043d\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442)         @Override         public void onAccuracyChanged (Sensor arg0, int arg1) { }          \/\/ \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0442 \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432         @Override         public synchronized void onSensorChanged (SensorEvent event) {             if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {                 accelerometerValues[0] = -event.values[1];                 accelerometerValues[1] = event.values[0];                 accelerometerValues[2] = event.values[2];             }             if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {                 magneticFieldValues[0] = -event.values[1];                 magneticFieldValues[1] = event.values[0];                 magneticFieldValues[2] = event.values[2];             }             if (event.sensor.getType() == Sensor.TYPE_GYROSCOPE) {                 gyroscopeValues[0] = -event.values[1];                 gyroscopeValues[1] = event.values[0];                 gyroscopeValues[2] = event.values[2];             }         }     } }<\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0417\u0434\u0435\u0441\u044c, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u0441\u0434\u0435\u043b\u0430\u044e \u043f\u0430\u0440\u0443 \u043f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u0439. \u0414\u0430\u043d\u043d\u044b\u0435 \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u043b\u0438\u0441\u0442\u0435\u043d\u0435\u0440\u043e\u0432, \u043d\u0430 \u044d\u0442\u043e\u0442 \u0441\u0447\u0435\u0442 \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u043f\u043e\u043b\u043d\u043e \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432. \u0420\u0430\u0431\u043e\u0442\u0443 \u0441 \u043a\u0432\u0430\u0442\u0435\u0440\u043d\u0438\u043e\u043d\u043e\u043c \u044f \u0440\u0430\u0437\u0431\u0438\u043b \u043d\u0430 3 \u043c\u0435\u0442\u043e\u0434\u0430 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e:<\/p>\n<ol>\n<li> <b>updateGyroData<\/b> \u2014 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0443\u0433\u043b\u043e\u0432\u044b\u0445 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0435\u0439 \u0433\u0438\u0440\u043e\u0441\u043a\u043e\u043f\u0430<\/li>\n<li> <b>updateAccData<\/b> \u2014 \u0441\u0442\u0430\u0431\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430 \u0430\u043a\u0441\u0435\u043b\u0435\u0440\u043e\u043c\u0435\u0442\u0440\u043e\u043c<\/li>\n<li> <b>updateMagData<\/b> \u2014 \u043a\u043e\u0440\u0440\u0435\u043a\u0446\u0438\u044f \u0434\u0440\u0438\u0444\u0442\u0430 \u043a\u043e\u043c\u043f\u0430\u0441\u043e\u043c<\/li>\n<\/ol>\n<p>  \u0415\u0441\u043b\u0438 \u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u0447\u0442\u043e \u0430\u043a\u0441\u0435\u043b\u0435\u0440\u043e\u043c\u0435\u0442\u0440 \u0432 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0435 \u0442\u043e\u0447\u043d\u043e \u0435\u0441\u0442\u044c \u0432\u0441\u0435\u0433\u0434\u0430, \u0442\u043e \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0432\u0441\u0435\u0433\u043e 4 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0438 \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432, \u0432\u0441\u0435 \u043e\u043d\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u0432 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0438 VRControlMode:<\/p>\n<pre><code class=\"java\">private enum VRControlMode { ACC_ONLY, ACC_GYRO, ACC_MAG, ACC_GYRO_MAG }<\/code><\/pre>\n<p>  \u041a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044f \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435, \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 getHeadQuaternion \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043d\u0435\u0435 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u0432\u0430\u0442\u0435\u0440\u043d\u0438\u043e\u043d\u0430 \u043f\u043e \u0442\u043e\u043c\u0443 \u0438\u043b\u0438 \u0438\u043d\u043e\u043c\u0443 \u043f\u0443\u0442\u0438. \u041f\u0440\u0435\u043b\u0435\u0441\u0442\u044c \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0437\u043e\u0432\u044b \u043c\u0435\u0442\u043e\u0434\u043e\u0432 updateGyroData\/updateAccData\/updateMagData \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0438\u043c\u0435\u044e\u0449\u0438\u0445\u0441\u044f \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432 \u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0432 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0435 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u043b\u0438\u0448\u044c \u0430\u043a\u0441\u0435\u043b\u0435\u0440\u043e\u043c\u0435\u0442\u0440. \u0415\u0449\u0435 \u043b\u0443\u0447\u0448\u0435, \u0435\u0441\u043b\u0438 \u043a\u0440\u043e\u043c\u0435 \u0430\u043a\u0441\u0435\u043b\u0435\u0440\u043e\u043c\u0435\u0442\u0440\u0430 \u0432 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0435 \u0435\u0441\u0442\u044c \u043a\u043e\u043c\u043f\u0430\u0441 \u2014 \u0442\u043e\u0433\u0434\u0430 \u044d\u0442\u0430 \u0441\u0432\u044f\u0437\u043a\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u0430 \u0432\u0435\u0441\u0442\u0438 \u0441\u0435\u0431\u044f \u043f\u043e\u0447\u0442\u0438 \u043a\u0430\u043a \u0433\u0438\u0440\u043e\u0441\u043a\u043e\u043f, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044f \u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043e\u0439 \u043d\u0430 360\u00b0. \u0425\u043e\u0442\u044c \u043d\u0438 \u043e \u043a\u0430\u043a\u043e\u043c \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u043c VR experience \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438 \u0440\u0435\u0447\u0438, \u0432\u0441\u0435 \u0436\u0435 \u044d\u0442\u043e \u043b\u0443\u0447\u0448\u0435, \u0447\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u0435\u0437\u0434\u0443\u0448\u043d\u0430\u044f \u043d\u0430\u0434\u043f\u0438\u0441\u044c \u00abYour phone doesn&#8217;t have a gyroscope\u00bb, \u043d\u0435 \u0442\u0430\u043a \u043b\u0438? \u0415\u0449\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0435\u043d \u043c\u0435\u0442\u043e\u0434 useDriftCorrection, \u043e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430 \u043b\u0435\u0442\u0443 \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c\/\u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u0430\u0433\u043d\u0438\u0442\u043e\u043c\u0435\u0442\u0440\u0430, \u043d\u0435 \u0437\u0430\u0442\u0440\u0430\u0433\u0438\u0432\u0430\u044f \u043b\u0438\u0441\u0442\u0435\u043d\u0435\u0440\u044b (\u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f updateMagData).<\/p>\n<h3>VRCamera<\/h3>\n<p>  \u0414\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u0432\u0438\u0434\u0435 \u0441\u0442\u0435\u0440\u0435\u043e\u043f\u0430\u0440\u044b \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u044b 2 \u043a\u0430\u043c\u0435\u0440\u044b, \u0440\u0430\u0437\u043d\u0435\u0441\u0435\u043d\u043d\u044b\u0435 \u043d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0434\u0440\u0443\u0433 \u043e\u0442 \u0434\u0440\u0443\u0433\u0430, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u0435 \u0431\u0430\u0437\u043e\u0439 \u043f\u0430\u0440\u0430\u043b\u043b\u0430\u043a\u0441\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 VRCamera \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 2 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 PerspectiveCamera. \u0412\u043e\u043e\u0431\u0449\u0435 \u0432 \u044d\u0442\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043a\u0430\u043c\u0435\u0440\u0430\u043c\u0438 (\u043f\u043e\u0432\u043e\u0440\u043e\u0442 \u043a\u0432\u0430\u0442\u0435\u0440\u043d\u0438\u043e\u043d\u043e\u043c \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435), \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0443 \u0441\u0442\u0435\u0440\u0435\u043e\u043f\u0430\u0440\u044b \u044f \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u043b \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435 GdxVR.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">VRCamera.java<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">package com.sinuxvr.sample;  import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.PerspectiveCamera; import com.badlogic.gdx.math.Matrix4; import com.badlogic.gdx.math.Quaternion; import com.badlogic.gdx.math.Vector3;  \/** \u041a\u043b\u0430\u0441\u0441 VR \u043a\u0430\u043c\u0435\u0440\u044b  * \u0414\u0430\u043d\u043d\u044b\u0435 \u043e\u0431 \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0431\u0435\u0440\u0443\u0442\u0441\u044f \u0438\u0437 VRSensorManager \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 update() *\/  class VRCamera {     private PerspectiveCamera leftCam;   \/\/ \u041b\u0435\u0432\u0430\u044f \u043a\u0430\u043c\u0435\u0440\u0430     private PerspectiveCamera rightCam;  \/\/ \u041f\u0440\u0430\u0432\u0430\u044f \u043a\u0430\u043c\u0435\u0440\u0430     private Vector3 position;            \/\/ \u041f\u043e\u0437\u0438\u0446\u0438\u044f VR \u043a\u0430\u043c\u0435\u0440\u044b     private float parallax;              \/\/ \u0420\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043a\u0430\u043c\u0435\u0440\u0430\u043c\u0438     private Vector3 direction;           \/\/ \u0412\u0435\u043a\u0442\u043e\u0440 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f VR \u043a\u0430\u043c\u0435\u0440\u044b     private Vector3 up;                  \/\/ \u0412\u0435\u043a\u0442\u043e\u0440 UP VR \u043a\u0430\u043c\u0435\u0440\u044b     private Vector3 upDirCross;          \/\/ \u0412\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 up \u0438 direction (\u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0432 \u0447\u0430\u0441\u0442\u0438 2, \u0441\u0435\u0439\u0447\u0430\u0441 \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u0435\u043c)      \/** \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 *\/     VRCamera(float fov, float parallax, float near, float far) {         this.parallax = parallax;         leftCam = new PerspectiveCamera(fov, Gdx.graphics.getWidth() \/ 2, Gdx.graphics.getHeight());         leftCam.near = near;         leftCam.far = far;         leftCam.update();         rightCam = new PerspectiveCamera(fov, Gdx.graphics.getWidth() \/ 2, Gdx.graphics.getHeight());         rightCam.near = near;         rightCam.far = far;         rightCam.update();         position = new Vector3(0, 0, 0);         direction = new Vector3(0, 0, 1);         up = new Vector3(0, 1, 0);         upDirCross = new Vector3().set(direction).crs(up).nor();     }      \/** \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043a\u0430\u043c\u0435\u0440\u044b *\/     void update() {         Quaternion headQuaternion = GdxVR.vrSensorManager.getHeadQuaternion();          \/\/ \u0418\u0437-\u0437\u0430 \u043e\u0431\u0445\u043e\u0434\u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a\u0430\u043c\u0435\u0440\u044b \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u0440\u0443\u0447\u043d\u0443\u044e         \/\/ \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0432\u0435\u043a\u0442\u043e\u0440\u044b \u0435\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438\u0437 \u043a\u0432\u0430\u0442\u0435\u0440\u043d\u0438\u043e\u043d\u0430         direction.set(0, 0, 1);         headQuaternion.transform(direction);         up.set(0, 1, 0);         headQuaternion.transform(up);         upDirCross.set(direction);         upDirCross.crs(up).nor();          \/\/ \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0443\u0433\u043b\u043e\u0432 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a\u0430\u043c\u0435\u0440 \u0438\u0437 \u043a\u0432\u0430\u0442\u0435\u0440\u043d\u0438\u043e\u043d\u0430         float angle = 2 * (float)Math.acos(headQuaternion.w);         float s = 1f \/ (float)Math.sqrt(1 - headQuaternion.w * headQuaternion.w);         float vx = headQuaternion.x * s;         float vy = headQuaternion.y * s;         float vz = headQuaternion.z * s;          \/\/ \u0412\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043b\u0435\u0432\u043e\u0439 \u043a\u0430\u043c\u0435\u0440\u044b         leftCam.view.idt(); \/\/ \u0421\u0431\u0440\u043e\u0441 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0432\u0438\u0434\u0430         leftCam.view.translate(parallax, 0, 0); \/\/ \u041f\u0435\u0440\u0435\u043d\u043e\u0441 \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 + parallax \u043f\u043e X         leftCam.view.rotateRad(vx, vy, vz, -angle); \/\/ \u041f\u043e\u0432\u043e\u0440\u043e\u0442 \u043a\u0432\u0430\u0442\u0435\u0440\u043d\u0438\u043e\u043d\u043e\u043c         leftCam.view.translate(-position.x, -position.y, -position.z); \/\/ \u0421\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0432 position         leftCam.combined.set(leftCam.projection);         Matrix4.mul(leftCam.combined.val, leftCam.view.val);          \/\/ \u0412\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043f\u0440\u0430\u0432\u043e\u0439 \u043a\u0430\u043c\u0435\u0440\u044b         rightCam.view.idt(); \/\/ \u0421\u0431\u0440\u043e\u0441 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0432\u0438\u0434\u0430         rightCam.view.translate(-parallax, 0, 0); \/\/ \u041f\u0435\u0440\u0435\u043d\u043e\u0441 \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 + parallax \u043f\u043e X         rightCam.view.rotateRad(vx, vy, vz, -angle); \/\/ \u041f\u043e\u0432\u043e\u0440\u043e\u0442 \u043a\u0432\u0430\u0442\u0435\u0440\u043d\u0438\u043e\u043d\u043e\u043c         rightCam.view.translate(-position.x, -position.y, -position.z); \/\/ \u0421\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0432 position         rightCam.combined.set(rightCam.projection);         Matrix4.mul(rightCam.combined.val, rightCam.view.val);     }      \/** \u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043a\u0430\u043c\u0435\u0440\u044b *\/     void setPosition(float x, float y, float z) {         position.set(x, y, z);     }      \/** \u0412\u043e\u0437\u0432\u0440\u0430\u0442 \u043b\u0435\u0432\u043e\u0439 \u043a\u0430\u043c\u0435\u0440\u044b *\/     PerspectiveCamera getLeftCam() {         return leftCam;     }      \/** \u0412\u043e\u0437\u0432\u0440\u0430\u0442 \u043f\u0440\u0430\u0432\u043e\u0439 \u043a\u0430\u043c\u0435\u0440\u044b *\/     PerspectiveCamera getRightCam() {         return rightCam;     }      \/** \u0412\u043e\u0437\u0432\u0440\u0430\u0442 \u043f\u043e\u0437\u0438\u0446\u0438\u0438, \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 UP \u043a\u0430\u043c\u0435\u0440\u044b, \u0430 \u0442\u0430\u043a \u0436\u0435 \u0438\u0445 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f*\/     public Vector3 getPosition() { return position; }     public Vector3 getDirection() { return direction; }     public Vector3 getUp() { return up; }     public Vector3 getUpDirCross() { return upDirCross; } }<\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0421\u0430\u043c\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0437\u0434\u0435\u0441\u044c \u2014 \u044d\u0442\u043e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0438 update. \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0443\u0433\u043e\u043b \u043f\u043e\u043b\u044f \u0437\u0440\u0435\u043d\u0438\u044f (fov), \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043a\u0430\u043c\u0435\u0440\u0430\u043c\u0438 (parallax), \u0430 \u0442\u0430\u043a \u0436\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0434\u043e \u0431\u043b\u0438\u0436\u043d\u0435\u0439 \u0438 \u0434\u0430\u043b\u044c\u043d\u0435\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0435\u0439 \u043e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u044f (near, far):<\/p>\n<pre><code class=\"java\">VRCamera(float fov, float parallax, float near, float far)<\/code><\/pre>\n<p>  \u0412 \u043c\u0435\u0442\u043e\u0434\u0435 update \u043c\u044b \u0431\u0435\u0440\u0435\u043c \u043a\u0432\u0430\u0442\u0435\u0440\u043d\u0438\u043e\u043d \u0438\u0437 VRSensorManager, \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c \u043a\u0430\u043c\u0435\u0440\u044b \u0432 (\u00b1parallax, 0, 0), \u043f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0438\u0445, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e. \u041f\u0440\u0438 \u0442\u0430\u043a\u043e\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0435 \u043c\u0435\u0436\u0434\u0443 \u043a\u0430\u043c\u0435\u0440\u0430\u043c\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0434\u0430\u043d\u043d\u0430\u044f \u0431\u0430\u0437\u0430 \u043f\u0430\u0440\u0430\u043b\u043b\u0430\u043a\u0441\u0430, \u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0431\u0443\u0434\u0435\u0442 \u0432\u0438\u0434\u0435\u0442\u044c \u0441\u0442\u0435\u0440\u0435\u043e\u0441\u043a\u043e\u043f\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u043f\u0440\u0438 \u043b\u044e\u0431\u043e\u0439 \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0433\u043e\u043b\u043e\u0432\u044b. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u043c\u044b \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441 view \u043c\u0430\u0442\u0440\u0438\u0446\u0430\u043c\u0438 \u043a\u0430\u043c\u0435\u0440, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0432\u0435\u043a\u0442\u043e\u0440\u044b direction \u0438 up \u0443 \u043a\u0430\u043c\u0435\u0440 \u043d\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u044e\u0442\u0441\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 VRCamera \u0432\u0432\u0435\u0434\u0435\u043d\u044b \u0441\u0432\u043e\u0438 2 \u0432\u0435\u043a\u0442\u043e\u0440\u0430, \u0438 \u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043a\u0432\u0430\u0442\u0435\u0440\u043d\u0438\u043e\u043d\u0430.<\/p>\n<h3>AndroidLauncher<\/h3>\n<p>  \u0412 \u0441\u0442\u0430\u0440\u0442\u0435\u0440-\u043a\u043b\u0430\u0441\u0441\u0435 \u043f\u0440\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 VRSensorManagerAndroid \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0433\u043b\u0430\u0432\u043d\u043e\u043c\u0443 \u043a\u043b\u0430\u0441\u0441\u0443 \u0438\u0433\u0440\u044b (\u0432 \u043c\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 GdxVR):<\/p>\n<pre><code class=\"java\">\t@Override \tprotected void onCreate (Bundle savedInstanceState) {                 super.onCreate(savedInstanceState); \t\tAndroidApplicationConfiguration config = new AndroidApplicationConfiguration(); \t\tconfig.useWakelock = true; \t\tconfig.useAccelerometer = false; \t\tconfig.useGyroscope = false; \t\tconfig.useCompass = false; \t\tvrSensorManagerAndroid = new VRSensorManagerAndroid(this.getContext()); \t\tinitialize(new GdxVR(vrSensorManagerAndroid), config); \t}<\/code><\/pre>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0442\u044c\/\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u0438\u0441\u0442\u0435\u043d\u0435\u0440\u044b \u043f\u0440\u0438 \u0441\u043a\u0440\u044b\u0442\u0438\u0438\/\u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"java\">\t@Override \tpublic void onPause() { \t\tvrSensorManagerAndroid.endTracking(); \t\tsuper.onPause(); \t}  \t@Override \tpublic void onResume() { \t\tsuper.onResume(); \t\tvrSensorManagerAndroid.startTracking(); \t}<\/code><\/pre>\n<p>  \u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u0441\u0442\u0430\u0440\u0442\u0435\u0440-\u043a\u043b\u0430\u0441\u0441\u0430:<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">AndroidLauncher.java<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">package com.sinuxvr.sample;  import android.os.Bundle; import com.badlogic.gdx.backends.android.AndroidApplication; import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration;  public class AndroidLauncher extends AndroidApplication {  \tprivate VRSensorManagerAndroid vrSensorManagerAndroid;    \/\/ \u041c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432  \t\/** \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f *\/ \t@Override \tprotected void onCreate (Bundle savedInstanceState) { \t\tsuper.onCreate(savedInstanceState); \t\tAndroidApplicationConfiguration config = new AndroidApplicationConfiguration();  \t\t\/\/ \u0417\u0430\u043f\u0440\u0435\u0442 \u043d\u0430 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u044d\u043a\u0440\u0430\u043d\u0430 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432 \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439 libgdx \t\tconfig.useWakelock = true; \t\tconfig.useAccelerometer = false; \t\tconfig.useGyroscope = false; \t\tconfig.useCompass = false; \t\tconfig.numSamples = 2;  \t\t\/\/ \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0432\u043e\u0435\u0433\u043e \u043b\u0438\u0441\u0442\u0435\u043d\u0435\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432 (\u043f\u043e\u044d\u0442\u043e\u043c\u0443 useAccelerometer \u0438 \u0442.\u043f. \u043d\u0435 \u043d\u0443\u0436\u043d\u044b) \t\tvrSensorManagerAndroid = new VRSensorManagerAndroid(this.getContext()); \t\tinitialize(new GdxVR(vrSensorManagerAndroid), config); \t}  \t\/** \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0430\u0443\u0437\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f - \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043b\u0438\u0441\u0442\u0435\u043d\u0435\u0440\u0430 \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432 *\/ \t@Override \tpublic void onPause() { \t\tvrSensorManagerAndroid.endTracking(); \t\tsuper.onPause(); \t}  \t\/** \u041f\u0440\u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0438 - \u0441\u043d\u043e\u0432\u0430 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u0438\u0441\u0442\u0435\u043d\u0435\u0440\u044b \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432 *\/ \t@Override \tpublic void onResume() { \t\tsuper.onResume(); \t\tvrSensorManagerAndroid.startTracking(); \t} } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u0437\u0430\u043a\u0438\u043d\u0443\u0442\u044c \u0432 \u043f\u0430\u043f\u043a\u0443 assets \u0444\u0430\u0439\u043b \u043c\u043e\u0434\u0435\u043b\u0438 room.g3db \u0438 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443 texture.png, \u043e\u043d\u0438 \u043d\u0430\u043c \u043f\u0440\u0438\u0433\u043e\u0434\u044f\u0442\u0441\u044f \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u044d\u0442\u0430\u043f\u0435. \u0421\u043a\u0430\u0447\u0430\u0442\u044c \u0438\u0445 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 <a href=\"https:\/\/github.com\/SinuXVR\/GdxVR-Sample-1\/tree\/master\/android\/assets\">\u043e\u0442\u0441\u044e\u0434\u0430<\/a>. \u041f\u043e\u0434\u043e\u0439\u0434\u0435\u0442 \u043b\u044e\u0431\u0430\u044f \u0434\u0440\u0443\u0433\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u0441\u0446\u0435\u043d\u044b, \u044f \u0440\u0435\u0448\u0438\u043b \u043e\u0441\u043e\u0431\u043e \u043d\u0435 \u0437\u0430\u043c\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0438 \u0432\u0437\u044f\u043b \u0433\u043e\u0442\u043e\u0432\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u043e\u0442 \u0443\u0440\u043e\u0432\u043d\u044f \u0441\u0432\u043e\u0435\u0439 \u0436\u0435 \u0438\u0433\u0440\u044b, \u0432 \u043d\u0435\u0439 \u0445\u043e\u0440\u043e\u0448\u043e \u043e\u0449\u0443\u0449\u0430\u0435\u0442\u0441\u044f \u044d\u0444\u0444\u0435\u043a\u0442 3D \u0438\u0437-\u0437\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043c\u0435\u043b\u043a\u0438\u0445 \u0434\u0435\u0442\u0430\u043b\u0435\u0439.<\/p>\n<h3>GdxVR<\/h3>\n<p>  \u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u043c\u044b \u043f\u043e\u0434\u043e\u0448\u043b\u0438 \u043a \u0433\u043b\u0430\u0432\u043d\u043e\u043c\u0443 \u043a\u043b\u0430\u0441\u0441\u0443. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u0432 \u043d\u0435\u043c \u043d\u0430\u0448 VRSensorManager \u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0439 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u043e\u0442 AndroidLauncher:<\/p>\n<pre><code class=\"java\">static VRSensorManager vrSensorManager; GdxVR(VRSensorManager vrSensorManager) {      GdxVR.vrSensorManager = vrSensorManager; } <\/code><\/pre>\n<p>  \u041a\u043e\u0434 \u0446\u0435\u043b\u0438\u043a\u043e\u043c: <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">GdxVR.java<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\"> package com.sinuxvr.sample;  import com.badlogic.gdx.ApplicationAdapter; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.assets.AssetManager; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.g3d.Model; import com.badlogic.gdx.graphics.g3d.ModelBatch; import com.badlogic.gdx.graphics.g3d.ModelInstance;  \/** \u0413\u043b\u0430\u0432\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043a\u0430\u043c\u0435\u0440\u044b, \u043c\u043e\u0434\u0435\u043b\u0438 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0443 *\/  class GdxVR extends ApplicationAdapter {  \tstatic VRSensorManager vrSensorManager;  \/\/ \u041c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432 \tprivate int scrHeight, scrHalfWidth;     \/\/ \u0414\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 viewport \tprivate AssetManager assets;\t\t\t \/\/ \u0417\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \tprivate ModelBatch modelBatch;\t\t\t \/\/ \u041f\u0430\u043a\u0435\u0442\u043d\u0438\u043a \u0434\u043b\u044f \u043c\u043e\u0434\u0435\u043b\u0438 \tprivate ModelInstance roomInstance;      \/\/ \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043c\u043e\u0434\u0435\u043b\u0438 \u043a\u043e\u043c\u043d\u0430\u0442\u044b \tprivate VRCamera vrCamera;               \/\/ VR \u043a\u0430\u043c\u0435\u0440\u0430  \t\/** \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 *\/ \tGdxVR(VRSensorManager vrSensorManager) { \t\tGdxVR.vrSensorManager = vrSensorManager; \t}  \t\/** \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 *\/ \t@Override \tpublic void create () { \t\t\/\/ \u0420\u0430\u0437\u043c\u0435\u0440\u044b \u044d\u043a\u0440\u0430\u043d\u0430 \t\tscrHalfWidth = Gdx.graphics.getWidth() \/ 2; \t\tscrHeight = Gdx.graphics.getHeight();  \t\t\/\/ \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043c\u043e\u0434\u0435\u043b\u0438 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 \t\tmodelBatch = new ModelBatch(); \t\tassets = new  AssetManager(); \t\tassets.load(&quot;room.g3db&quot;, Model.class); \t\tassets.finishLoading(); \t\tModel roomModel = assets.get(&quot;room.g3db&quot;); \t\troomInstance = new ModelInstance(roomModel);  \t\t\/\/ \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u0430\u043c\u0435\u0440\u044b (fov, parallax, near, far) \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \t\tvrCamera = new VRCamera(90, 0.4f, 0.1f, 30f); \t\tvrCamera.setPosition(-1.7f, 3f, 3f);  \t\t\/\/ \u0420\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u043c \u043a\u043e\u0440\u0440\u0435\u043a\u0446\u0438\u044e \u0434\u0440\u0438\u0444\u0442\u0430 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043a\u043e\u043c\u043f\u0430\u0441\u0430 \t\tvrSensorManager.useDriftCorrection(true); \t}  \t\/** \u041e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u0441\u0442\u0435\u0440\u0435\u043e\u043f\u0430\u0440\u044b \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f viewport-\u0430 *\/ \t@Override \tpublic void render () { \t\t\/\/ \u041e\u0447\u0438\u0441\u0442\u043a\u0430 \u044d\u043a\u0440\u0430\u043d\u0430 \t\tGdx.gl.glClearColor(0f, 0f, 0f, 1f); \t\tGdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);  \t\t\/\/ \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043a\u0430\u043c\u0435\u0440\u044b \t\tvrCamera.update();  \t\t\/\/ \u041e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u0441\u0446\u0435\u043d\u044b \u0434\u043b\u044f \u043b\u0435\u0432\u043e\u0433\u043e \u0433\u043b\u0430\u0437\u0430 \t\tGdx.gl.glViewport(0, 0, scrHalfWidth, scrHeight); \t\tmodelBatch.begin(vrCamera.getLeftCam()); \t\tmodelBatch.render(roomInstance); \t\tmodelBatch.end();  \t\t\/\/ \u041e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u0441\u0446\u0435\u043d\u044b \u0434\u043b\u044f \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0433\u043b\u0430\u0437\u0430 \t\tGdx.gl.glViewport(scrHalfWidth, 0, scrHalfWidth, scrHeight); \t\tmodelBatch.begin(vrCamera.getRightCam()); \t\tmodelBatch.render(roomInstance); \t\tmodelBatch.end(); \t}  \t\/** \u0412\u044b\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 *\/ \t@Override \tpublic void dispose () { \t\tmodelBatch.dispose(); \t\tassets.dispose(); \t} } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0412 \u043c\u0435\u0442\u043e\u0434\u0435 create \u043c\u044b \u0443\u0437\u043d\u0430\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u044d\u043a\u0440\u0430\u043d\u0430 (\u0448\u0438\u0440\u0438\u043d\u0430 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430 2, \u0441\u0430\u043c\u0438 \u0437\u043d\u0430\u0435\u0442\u0435 \u0437\u0430\u0447\u0435\u043c), \u0433\u0440\u0443\u0437\u0438\u043c \u043c\u043e\u0434\u0435\u043b\u044c \u0441\u0446\u0435\u043d\u044b, \u0430 \u0437\u0430\u0442\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u0435\u043c \u043a\u0430\u043c\u0435\u0440\u0443:<\/p>\n<pre><code class=\"java\">vrCamera = new VRCamera(90, 0.4f, 0.1f, 30f); vrCamera.setPosition(-1.7f, 3f, 3f);<\/code><\/pre>\n<p>  \u0415\u0449\u0435 \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u044f \u0432\u043a\u043b\u044e\u0447\u0438\u043b \u043a\u043e\u0440\u0440\u0435\u043a\u0446\u0438\u044e \u0434\u0440\u0438\u0444\u0442\u0430, \u0435\u0441\u043b\u0438 \u0443 \u043a\u043e\u0433\u043e-\u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u043a\u0430\u043c\u0435\u0440\u043e\u0439 \u2014 \u0438\u0449\u0438\u0442\u0435 \u043f\u0440\u0438\u0447\u0438\u043d\u0443 \u0432 \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043a\u0435 \u043a\u043e\u043c\u043f\u0430\u0441\u0430:<\/p>\n<pre><code class=\"java\">vrSensorManager.useDriftCorrection(true);<\/code><\/pre>\n<p>  \u0412 \u043c\u0435\u0442\u043e\u0434\u0435 render \u043f\u0435\u0440\u0435\u0434 \u0432\u0441\u0435\u043c\u0438 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430\u043c\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u0430\u043c\u0435\u0440\u044b:<\/p>\n<pre><code class=\"java\">vrCamera.update();<\/code><\/pre>\n<p>  \u0421\u0442\u0435\u0440\u0435\u043e\u043f\u0430\u0440\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e viewport-\u0430. \u041f\u043e\u0434\u0433\u043e\u043d\u044f\u0435\u043c viewport \u043f\u043e\u0434 \u043b\u0435\u0432\u0443\u044e \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u044d\u043a\u0440\u0430\u043d\u0430 \u0438 \u0440\u0438\u0441\u0443\u0435\u043c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0434\u043b\u044f \u043b\u0435\u0432\u043e\u0433\u043e \u0433\u043b\u0430\u0437\u0430:<\/p>\n<pre><code class=\"java\">Gdx.gl.glViewport(0, 0, scrHalfWidth, scrHeight); modelBatch.begin(vrCamera.getLeftCam()); modelBatch.render(roomInstance); modelBatch.end(); <\/code><\/pre>\n<p>  \u0417\u0430\u0442\u0435\u043c \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435 \u0434\u043b\u044f \u043f\u0440\u0430\u0432\u043e\u0433\u043e:<\/p>\n<pre><code class=\"java\">Gdx.gl.glViewport(scrHalfWidth, 0, scrHalfWidth, scrHeight); modelBatch.begin(vrCamera.getRightCam()); modelBatch.render(roomInstance); modelBatch.end(); <\/code><\/pre>\n<hr\/>\n<p>  <\/p>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>  \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u0431\u044b\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e, \u0442\u043e \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u043c\u0430\u0440\u0442\u0444\u043e\u043d \u0432 VR \u043e\u0447\u043a\u0438 \u0438 \u043f\u043e\u0433\u0440\u0443\u0437\u0438\u0442\u044c\u0441\u044f \u0432 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0438\u0440, \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0441\u0432\u043e\u0438\u043c\u0438 \u0440\u0443\u043a\u0430\u043c\u0438:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\"  src=\"https:\/\/habrastorage.org\/files\/9fc\/77c\/ffb\/9fc77cffbf9e47e5b35c6856177ed8b6.png\"\/><\/div>\n<p>  \u0414\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u0432 \u043d\u043e\u0432\u0443\u044e \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c! \u041f\u0440\u043e \u0440\u0430\u0431\u043e\u0442\u0443 \u0441\u043e \u0437\u0432\u0443\u043a\u0430\u043c \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0447\u0430\u0441\u0442\u0438, \u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0443 \u043c\u0435\u043d\u044f \u0432\u0441\u0435. \u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0435\u0441\u043b\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u2014 \u044f \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u043d\u0430 \u043d\u0438\u0445 \u043e\u0442\u0432\u0435\u0442\u0438\u0442\u044c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445.<\/p>\n<hr\/>\n<p>  <\/p>\n<h2>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438<\/h2>\n<p>  <\/p>\n<ol>\n<li> <a href=\"http:\/\/stanford.edu\/class\/ee267\/lectures\/lecture10.pdf\">Quaternions &#038; IMU Sensor Fusion with Complementary Filtering<\/a><\/li>\n<li> <a href=\"https:\/\/developer3.oculus.com\/blog\/magnetometer\/\">Help! My Cockpit Is Drifting Away<\/a><\/li>\n<\/ol>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habrahabr.ru\/post\/318278\/\"> https:\/\/habrahabr.ru\/post\/318278\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div style=\"text-align:center;\"><img decoding=\"async\"  src=\"https:\/\/habrastorage.org\/files\/96a\/166\/968\/96a16696860d4ac7a72452c672c5add2.png\"\/><\/div>\n<p>  \u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441\u0442\u0440\u0435\u043c\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430\u0431\u0438\u0440\u0430\u0435\u0442 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u044c \u0441\u0440\u0435\u0434\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u043d\u043e \u0432\u0441\u0435 \u0435\u0449\u0435 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0439 \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u0438\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432. \u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u2014 \u043c\u043d\u043e\u0433\u0438\u0435 \u043f\u0438\u0448\u0443\u0442 \u0438\u0433\u0440\u044b \u0432 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430\u0445, \u043a \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0440\u0438\u043a\u0440\u0443\u0442\u0438\u0442\u044c Cardboard SDK, \u0430 \u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0435 \u043d\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043b\u0435\u043d\u044c. \u0422\u0430\u043a \u0438 \u0441 Libgdx, \u0433\u0434\u0435 \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 <a href=\"https:\/\/github.com\/yangweigbh\/Libgdx-CardBoard-Extension\">\u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u0441\u043a\u0440\u0435\u0441\u0442\u0438\u0442\u044c \u0443\u0436\u0430 \u0441 \u0435\u0436\u043e\u043c<\/a>, \u0432\u0441\u0435 \u0435\u0449\u0435 \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u043d\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c VR \u0438\u0433\u0440\u044b \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041f\u0430\u0440\u0443 \u043c\u0435\u0441\u044f\u0446\u0435\u0432 \u043d\u0430\u0437\u0430\u0434 \u044f \u0437\u0430\u0433\u043e\u0440\u0435\u043b\u0441\u044f \u0436\u0435\u043b\u0430\u043d\u0438\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e VR \u0438\u0433\u0440\u0443\u0448\u043a\u0443, \u0430 \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u044f \u0445\u043e\u0440\u043e\u0448\u043e \u0437\u043d\u0430\u043a\u043e\u043c \u0441 Libgdx \u0438 \u0434\u0430\u0432\u043d\u043e \u0441 \u043d\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u044e, \u0442\u043e \u0443 \u043c\u0435\u043d\u044f \u043e\u0441\u0442\u0430\u0432\u0430\u043b\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u043f\u0443\u0442\u044c: \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u0441\u0430\u043c\u043e\u043c\u0443 \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 VR <s>\u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434<\/s> \u0434\u0432\u0438\u0436\u043e\u043a \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 Libgdx. \u0413\u043b\u0430\u0437\u0430 \u0431\u043e\u044f\u0442\u0441\u044f \u2014 \u0440\u0443\u043a\u0438 \u0434\u0435\u043b\u0430\u044e\u0442, \u0438 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0441\u044f\u0446 \u043d\u043e\u0447\u043d\u044b\u0445 \u043f\u043e\u0441\u0438\u0434\u0435\u043b\u043e\u043a \u0438\u0433\u0440\u0430 \u0431\u044b\u043b\u0430 \u0433\u043e\u0442\u043e\u0432\u0430. \u0411\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u0440\u0443 \u0434\u043d\u0435\u0439 \u043f\u043e\u0441\u043b\u0435 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u043c\u043d\u0435 \u043d\u0430\u0447\u0430\u043b\u0438 \u0437\u0430\u0432\u0430\u043b\u0438\u0432\u0430\u0442\u044c \u043b\u0438\u0447\u043a\u0443 \u043f\u0440\u043e\u0441\u044c\u0431\u0430\u043c\u0438 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043a\u043e\u0434\u043e\u043c \u0438\u043b\u0438 \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c, \u043a\u0430\u043a \u043e\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u042f \u043d\u0435 \u0436\u0430\u0434\u043d\u044b\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u0448\u0438\u043b \u0437\u0430\u043c\u0443\u0442\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u0441\u0442\u0430\u0442\u0435\u0439 \u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0438 \u0432 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0438\u0437 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0438\u0439 \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u043c\u0430\u0440\u0442\u0444\u043e\u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u044e (\u0442.\u043d. head tracking), \u0430 \u0442\u0430\u043a \u0436\u0435 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u0441\u0442\u0435\u0440\u0435\u043e\u043f\u0430\u0440\u0443.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-282918","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/282918","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=282918"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/282918\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=282918"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=282918"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=282918"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}