{"id":356315,"date":"2024-05-20T23:27:01","date_gmt":"2024-05-20T23:27:01","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=356315"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2024-05-20T23:27:01","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=356315","title":{"rendered":"<span>\u0421\u0430\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u043b, \u0441\u0430\u043c \u043f\u043e\u0433\u043e\u043d\u044f\u043b: \u043a\u0430\u043a \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b 3D-\u0433\u043e\u043d\u043a\u0438 \u00ab\u043d\u0430 \u0436\u0438\u0433\u0443\u043b\u044f\u0445\u00bb \u0437\u0430 \u043d\u0435\u0434\u0435\u043b\u044e, \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0441 \u043d\u0443\u043b\u044f?<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/vz\/cw\/ag\/vzcwagsxhxidoafivthxxwegds8.png\" alt=\"image\" data-src=\"https:\/\/habrastorage.org\/webt\/vz\/cw\/ag\/vzcwagsxhxidoafivthxxwegds8.png\"\/><\/p>\n<p>  \u0421\u0442\u0430\u0442\u044c\u0438 \u043f\u0440\u043e \u0438\u043d\u0434\u0438-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0438\u0433\u0440 \u2014 \u044d\u0442\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e. \u041d\u043e \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u0440\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0438\u0433\u0440 \u0441 \u043d\u0443\u043b\u044f, \u0431\u0435\u0437 \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u0438\u0433\u0440\u043e\u0432\u044b\u0445 \u0434\u0432\u0438\u0436\u043a\u043e\u0432 \u2014 \u0435\u0449\u0451 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435! \u0423 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0444\u0435\u0442\u0438\u0448, \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0438\u0433\u0440\u0430\u0431\u0435\u043b\u044c\u043d\u044b\u0445 3D-\u0434\u0435\u043c\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0431\u044b \u0434\u0430\u0436\u0435 \u043d\u0430 \u0436\u0435\u043b\u0435\u0437\u0435 20-\u043b\u0435\u0442\u043d\u0435\u0439 \u0434\u0430\u0432\u043d\u043e\u0441\u0442\u0438. \u041f\u043e\u043b\u0442\u043e\u0440\u0430 \u0433\u043e\u0434\u0430 \u043d\u0430\u0437\u0430\u0434, \u0432 \u043c\u0430\u0435 2022 \u0433\u043e\u0434\u0430, \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0434\u0435\u043c\u043a\u0443 \u0433\u043e\u043d\u043e\u0447\u043d\u043e\u0439 \u0438\u0433\u0440\u044b \u0441 \u043e\u0447\u0435\u043d\u044c \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u043c \u0432\u0441\u0435\u043c \u043d\u0430\u043c \u0441\u0435\u0442\u0442\u0438\u043d\u0433\u043e\u043c \u2014 \u0436\u0438\u0433\u0443\u043b\u0438, \u0434\u0435\u0432\u044f\u0442\u043a\u0438, \u0434\u0435\u0441\u044f\u0442\u043a\u0438, \u0438 \u0432\u0441\u0451 \u044d\u0442\u043e \u0434\u0430\u0436\u0435 \u0441 \u0442\u044e\u043d\u0438\u043d\u0433\u043e\u043c! \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0432\u0430\u043c \u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 3D-\u0438\u0433\u0440 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441 \u043d\u0443\u043b\u044f: \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440, \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u0438 \u0433\u0440\u0430\u0444 \u0441\u0446\u0435\u043d\u044b, 3D-\u0437\u0432\u0443\u043a, \u0432\u0432\u043e\u0434 \u0438 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u043a\u0430. \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0439\u0448\u0430\u044f \u0445\u0430\u0431\u0440\u043e\u0442\u043e\u0440\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0438\u0433\u0440\u044b \u0441 \u043d\u0443\u043b\u044f? \u0422\u043e\u0433\u0434\u0430 \u0434\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c!<a name=\"habracut\"><\/a><\/p>\n<h2><font color=\"#1c22be\">\u276f<\/font> <font color=\"#454cee\">\u041f\u0440\u0435\u0434\u044b\u0441\u0442\u043e\u0440\u0438\u044f<\/font><\/h2>\n<p>  \u041d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438, \u044f \u0432\u0441\u0451 \u0435\u0449\u0451 \u043e\u0441\u0442\u0430\u044e\u0441\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u044e\u043d\u044b\u043c \u2014 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e 5 \u0434\u043d\u0435\u0439 \u043d\u0430\u0437\u0430\u0434 \u043c\u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u043b\u043e\u0441\u044c 22 \u0433\u043e\u0434\u0430. \u041d\u043e \u0435\u0441\u043b\u0438 \u043e\u0442\u043a\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043d\u0430 4 \u0433\u043e\u0434\u0430 \u043d\u0430\u0437\u0430\u0434 \u0438 \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u0442\u044c \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044f \u043c\u043e\u0435\u0433\u043e \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e\u043b\u0435\u0442\u0438\u044f, \u0442\u043e \u043d\u0430 \u0443\u043c \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u0441\u0440\u0430\u0437\u0443 \u0434\u0432\u0430 \u0437\u043d\u0430\u0447\u0438\u043c\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u044f: \u043e\u0442\u0435\u0446 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0432 \u043e\u0434\u0438\u043d \u0434\u0435\u043d\u044c \u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u00ab\u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0439 \u044e\u043b\u0438\u0442\u043e, \u0431\u0443\u0434\u0435\u043c \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0430\u0432\u0442\u043e \u0437\u0430 40 \u0442\u044b\u0449 \u0440\u0443\u0431\u043b\u0435\u0439\u00bb. \u041f\u043e\u043d\u044f\u0442\u043d\u043e\u0435 \u0434\u0435\u043b\u043e, \u0447\u0442\u043e \u0437\u0430 \u044d\u0442\u0443 \u0441\u0443\u043c\u043c\u0443 (~700$ \u043f\u043e \u0442\u043e\u043c\u0443 \u043a\u0443\u0440\u0441\u0443) \u043e\u0441\u043e\u0431\u043e \u043d\u0435 \u0440\u0430\u0437\u0433\u0443\u043b\u044f\u0435\u0448\u044c\u0441\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0439 \u0432\u044b\u0431\u043e\u0440 \u043f\u0430\u043b \u043d\u0430 \u043a\u0430\u0440\u0431\u044e\u0440\u0430\u0442\u043e\u0440\u043d\u0443\u044e \u00ab\u0441\u0435\u043c\u0435\u0440\u043e\u0447\u043a\u0443\u00bb, \u0441\u0432\u043e\u044e \u0440\u043e\u0432\u0435\u0441\u043d\u0438\u0446\u0443 (2001 \u0433\u043e\u0434) \u0441\u0438\u043d\u0435\u0433\u043e \u0446\u0432\u0435\u0442\u0430. \u041f\u0440\u0438\u0435\u0445\u0430\u043b\u0438 \u0441 \u0431\u0430\u0442\u044c\u043a\u043e\u0439 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0443, \u043e\u0431\u043a\u0430\u0442\u0430\u043b\u0438 \u0438 \u043f\u0440\u0438\u043d\u044f\u043b\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u2014 \u043d\u0430\u0434\u043e \u0431\u0440\u0430\u0442\u044c!<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/post_images\/b94\/d41\/7a0\/b94d417a0ec4106360d5ef3c882d079d.jpg\" alt=\"image\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/b94\/d41\/7a0\/b94d417a0ec4106360d5ef3c882d079d.jpg\" data-blurred=\"true\"\/><\/p>\n<p>  \u0421 \u0442\u0435\u0445 \u043f\u043e\u0440 \u044f \u0435\u0437\u0434\u0438\u043b \u043d\u0430 \u0441\u0432\u043e\u0435\u043c \u00ab\u0442\u0430\u0437\u0435\u00bb \u0438 \u0433\u043e\u0440\u044f \u043d\u0435 \u0437\u043d\u0430\u043b \u2014 \u043c\u0430\u0448\u0438\u043d\u043a\u0430 \u043d\u0435 \u043b\u043e\u043c\u0430\u043b\u0430\u0441\u044c, \u043d\u0438 \u0440\u0430\u0437\u0443 \u043d\u0435 \u043f\u043e\u0434\u0432\u043e\u0434\u0438\u043b\u0430, \u0432\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 \u0441\u0435\u0431\u044f \u043d\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u0430, \u0430 \u044f \u043d\u0430\u0447\u0430\u043b \u0432\u0441\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0443\u0432\u043b\u0435\u043a\u0430\u0442\u044c\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u043e\u0431\u0438\u043b\u044f\u043c\u0438 \u0438 \u0438\u0437\u0443\u0447\u0430\u0442\u044c \u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b. \u0421\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u044f \u043f\u043e\u043b\u044e\u0431\u0438\u043b \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0430\u0432\u0442\u043e\u043c\u043e\u0431\u0438\u043b\u0435\u0439, \u043d\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043c\u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u043b\u0441\u044f \u0410\u0432\u0442\u043e\u0412\u0410\u0417. \u0412 \u043e\u0434\u0438\u043d \u043c\u043e\u043c\u0435\u043d\u0442, \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u0432 \u043f\u0440\u043e \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0439 \u0438 \u043f\u0440\u043e\u0432\u0430\u043b\u044c\u043d\u044b\u0439 \u043d\u0435\u043a\u043e\u0433\u0434\u0430 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/LADA_Racing_Club\">Lada Racing Club<\/a>, \u043c\u043d\u0435 \u0437\u0430\u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u00ab\u0433\u043e\u043d\u043e\u0447\u043a\u0438 \u043d\u0430 \u0436\u0438\u0433\u0443\u043b\u044f\u0445\u00bb \u0441\u0430\u043c\u043e\u043c\u0443, \u043f\u0440\u0438\u0447\u0451\u043c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0441 \u043d\u0443\u043b\u044f. \u0410 \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0430\u0440\u0442\u0430 \u0434\u043b\u044f \u0433\u043e\u0440\u043e\u0434\u0430 \u0443 \u043c\u0435\u043d\u044f \u043d\u0435 \u0431\u044b\u043b\u043e, \u0438\u0433\u0440\u0443 \u044f \u0440\u0435\u0448\u0438\u043b \u043d\u0430\u0437\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u043e: \u00ab\u0420\u0430\u043b\u043b\u0438-\u043a\u0443\u0431\u043e\u043a \u0422\u0410\u0417\u043e\u0432\u00bb \ud83d\ude42<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/083\/0a7\/959\/0830a79598b160c83802ecf96a9b8318.png\" alt=\"image\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/083\/0a7\/959\/0830a79598b160c83802ecf96a9b8318.png\"\/><br \/>  <i>\u041f\u043e\u0451\u043c \u0432\u0441\u0435\u043c \u0425\u0430\u0431\u0440\u043e\u043c!<\/i><\/p>\n<p>  \u041d\u043e \u0441 \u0447\u0435\u0433\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u043e\u0431\u044a\u0435\u043c\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441\u0430\u043c\u043e\u043c\u0443? \u0422\u0443\u0442 \u043d\u0430\u043c, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u043d\u0443\u0436\u0435\u043d \u043f\u043b\u0430\u043d. \u0423 \u043c\u0435\u043d\u044f \u0443\u0436\u0435 \u0431\u044b\u043b \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u0441\u0430\u043c\u043e\u043f\u0430\u043b\u044c\u043d\u044b\u0439 3D-\u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0434\u043b\u044f \u0438\u0433\u0440\u0443\u0448\u0435\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043f\u0440\u043e\u0448\u043b\u044b\u0445 \u0434\u0435\u043c\u043e\u043a: \u0430\u0440\u0435\u043d\u0430-\u0448\u0443\u0442\u0435\u0440 \u043e\u0442 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043b\u0438\u0446\u0430 \u0441 \u043c\u043e\u0434\u0435\u043b\u044c\u043a\u0430\u043c\u0438 \u0438\u0437 \u043c\u043e\u0434\u043e\u0432 \u0434\u043b\u044f Quake. \u0424\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0431\u044b\u043b \u0432\u043f\u043e\u043b\u043d\u0435 \u0440\u0430\u0431\u043e\u0447\u0438\u043c, \u043d\u043e \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u00ab\u043a\u0443\u0431\u043a\u0435 \u0442\u0430\u0437\u043e\u0432\u00bb.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/f42\/635\/d4d\/f42635d4d45414edefa818651587eb40.png\" alt=\"image\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/f42\/635\/d4d\/f42635d4d45414edefa818651587eb40.png\"\/><\/p>\n<p>  \u041d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0433\u043e\u043d\u043e\u0447\u043a\u0438 \u0443 \u043c\u0435\u043d\u044f \u0443\u0436\u0435 \u0431\u044b\u043b\u0438 \u0433\u043e\u0442\u043e\u0432\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0444\u0438\u0448\u043a\u0438:<\/p>\n<ul>\n<li> <b>\u0420\u0435\u043d\u0434\u0435\u0440\u0435\u0440<\/b>: Direct3D9, \u043f\u0440\u0438\u0447\u0451\u043c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e FFP \u2014 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0438\u0433\u0440\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u0430\u0441\u044c \u0434\u0430\u0436\u0435 \u043d\u0430 \u0432\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 Intel, \u0433\u0434\u0435 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432 \u0434\u043e HD-\u0441\u0435\u0440\u0438\u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0431\u044b\u043b\u043e. \u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0441\u0435 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u043d\u044b\u0435 \u0442\u0435\u0445\u043d\u0438\u043a\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043c\u0431\u0430\u0439\u043d\u0435\u0440\u044b \u2014 \u0434\u0430\u043b\u044c\u043d\u0438\u0439 \u043f\u0440\u0435\u0434\u043e\u043a \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u044b\u0445 \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432, \u0433\u0434\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u043e\u043f\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b \u0446\u0435\u043b\u044b\u043c\u0438 \u0441\u0442\u0430\u0434\u0438\u044f\u043c\u0438 \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430, \u0430 \u043d\u0435 \u043f\u0438\u0441\u0430\u043b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u0447\u0442\u043e \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u043b\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439. \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u043b\u0438\u0441\u044c: \u043c\u043d\u043e\u0433\u043e\u0441\u043b\u043e\u0439\u043d\u044b\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b, \u043e\u0434\u043d\u043e\u043f\u0440\u043e\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u043f\u043b\u0430\u0442-\u043c\u0430\u043f\u043f\u0438\u043d\u0433 \u0434\u043b\u044f \u043f\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043b\u0430\u043d\u0434\u0448\u0430\u0444\u0442\u043e\u0432, \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u043a\u0443\u0431\u043c\u0430\u043f\u0430\u0445, \u043f\u043b\u0430\u0432\u043d\u044b\u0439 \u043c\u043e\u0440\u0444\u0438\u043d\u0433 (\u0432\u0435\u0440\u0448\u0438\u043d\u043d\u0430\u044f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f) \u0441 \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u044f\u0446\u0438\u0435\u0439 \u043c\u0435\u0436\u0434\u0443 \u043a\u0430\u0434\u0440\u0430\u043c\u0438, MSAA (\u044d\u0442\u043e \u0437\u0430\u0441\u043b\u0443\u0433\u0430 GAPI), \u043e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u043e\u0439 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u043f\u043e \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0435 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0438 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u0439 \u0430\u043b\u044c\u0444\u0430-\u0431\u043b\u0435\u043d\u0434\u0438\u043d\u0433 \u0441 \u0440\u0443\u0447\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u043e\u0439.<\/li>\n<li> <b>\u0417\u0432\u0443\u043a<\/b>: 3D-\u0437\u0432\u0443\u043a \u043d\u0430 DirectSound \u0441 \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0437\u0432\u0443\u043a\u0430, \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435\u043c \u0438 \u0442. \u043f. \u0422\u0443\u0442 \u043c\u043e\u0435\u0439 \u0437\u0430\u0441\u043b\u0443\u0433\u0438 \u043e\u0441\u043e\u0431\u043e \u043d\u0435\u0442, \u043a\u0440\u043e\u043c\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a\u0430 wav-\u0444\u0430\u0439\u043b\u043e\u0432 \u044f \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u0438\u0441\u0430\u043b.<\/li>\n<li> <b>\u0412\u0432\u043e\u0434<\/b>: WinAPI + DirectInput. \u041a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0430 \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u043b\u0430\u0441\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e GetAsyncKeyState, \u0432 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a \u0433\u0435\u0439\u043c\u043f\u0430\u0434\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e DirectInput. \u0411\u044b\u043b\u0430 \u0438 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f \u043e\u0441\u0435\u0439 \u0432\u0432\u043e\u0434\u0430 \u2014 \u0434\u0430\u0431\u044b \u043d\u0435 \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0434 \u043a\u0443\u0447\u0443 \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432.<\/li>\n<li> <b>\u041c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432<\/b>: \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u0435\u043d. \u041a \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0443 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u044f \u043e\u0442\u043d\u0435\u0441\u0443 \u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a\u0438 \u2014 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u043b \u043c\u043e\u0434\u0435\u043b\u0438 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0430\u0445 SMD (\u043d\u0435 \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043c\u0435\u0448\u0438, \u0444\u043e\u0440\u043c\u0430\u0442 Half-life) \u0438 MD2 (\u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043c\u0435\u0448\u0438, \u0444\u043e\u0440\u043c\u0430\u0442 Quake 2, \u0441\u0442\u0440\u043e\u0433\u043e \u043e\u0434\u0438\u043d \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043d\u0430 \u043e\u0434\u0438\u043d \u043c\u0435\u0448), \u0437\u0432\u0443\u043a\u0438 \u2014 wav \u0438 \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u0438\u0439 \u0441\u0430\u043c\u043e\u043f\u0430\u043b\u044c\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u0432. \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440: \u0442\u0440\u0435\u043a\u0438\u043d\u0433 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u043d\u0430 \u0441\u043b\u0430\u0431\u044b\u0445 \u0441\u0441\u044b\u043b\u043a\u0430\u0445, \u043f\u0443\u043b \u0430\u0441\u0441\u0435\u0442\u043e\u0432 \u0434\u043b\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0434\u0443\u0431\u043b\u0438\u0440\u0443\u044e\u0449\u0435\u0439\u0441\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438 \u0442. \u043f.<\/li>\n<\/ul>\n<p>  \u0424\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0432\u044b\u0434\u0430\u0432\u0430\u043b \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043a\u0440\u0443\u0442\u0443\u044e \u0433\u0440\u0430\u0444\u0438\u043a\u0443:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/d29\/dd9\/138\/d29dd91383553acab71edfa6839aa33f.png\" alt=\"image\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/d29\/dd9\/138\/d29dd91383553acab71edfa6839aa33f.png\"\/><\/p>\n<p>  \u0417\u0430\u0442\u043e \u0431\u044b\u043b \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u00ab\u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c\u00bb, \u0438\u043c\u0435\u043b \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043d\u0435\u043f\u043b\u043e\u0445\u0443\u044e \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u043c\u0443\u044e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u0438 \u0432 \u0446\u0435\u043b\u043e\u043c, \u043d\u0430 \u043d\u0435\u043c \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0437\u0430\u043f\u0438\u043b\u0438\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u043f\u0440\u0438\u043a\u043e\u043b\u044c\u043d\u043e\u0435. \u0413\u0434\u0435-\u0442\u043e \u0437\u0430 \u043d\u0435\u0434\u0435\u043b\u044e \u044f \u0437\u0430\u043f\u0438\u043b\u0438\u043b \u0432\u043e\u0442 \u0442\u0430\u043a\u0443\u044e \u0434\u0435\u043c\u043a\u0443 \u0448\u0443\u0442\u0435\u0440\u0430 \u043e\u0442 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043b\u0438\u0446\u0430:<\/p>\n<div class=\"oembed\">\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/6517f267962d8d30c11eaa78\" data-style=\"\" id=\"6517f267962d8d30c11eaa78\" width=\"\"><\/div>\n<\/div>\n<p>\u0418\u0433\u0440\u0443\u0448\u043a\u0430 \u0434\u0430\u0436\u0435 \u043d\u0430 VIA UniChrome \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430 \u2014 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u0435 \u0432\u0441\u0435\u043c \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0433\u043e S3 Savage\/S3 Virge!<\/p>\n<p>  \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cs\">public sealed class GameMain : IGameApp     {         private Mesh mesh;         private Material material;         private Vector3 pos = new Vector(0, 0, -150);          public void OnCreate()         {            mesh = Engine.Current.Data.GetMesh(\"test.md2\");            material = new Material();            material.Text = Engine.Current.Data.GetTexture(\"test.png\");         }          public void OnDraw()         {            Engine.Current.Graphics.DrawMesh(mesh, 0, material, pos, Vector3.Zero);         }          public void OnExit()         {          }          public void OnDrawGUI()         {          }          public void OnUpdate()         {          }     } <\/code><\/pre>\n<p>  \u041f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u044b\u0439 \u0432\u044b\u0448\u0435 \u043a\u043e\u0434 \u043d\u0430\u0440\u0438\u0441\u0443\u0435\u0442 \u043c\u043e\u0434\u0435\u043b\u044c\u043a\u0443 \u0441 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u043e\u0439 \u043f\u0435\u0440\u0435\u0434 \u043b\u0438\u0446\u043e\u043c \u0438\u0433\u0440\u043e\u043a\u0430. \u0412\u0441\u0451 \u043f\u0440\u043e\u0441\u0442\u043e \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u043e. \u041e\u0434\u043d\u0430\u043a\u043e, \u043a\u0430\u043a \u044d\u0442\u043e \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u00ab\u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c\u00bb? \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f:<\/p>\n<h2><font color=\"#1c22be\">\u276f<\/font> <font color=\"#454cee\">\u041e\u0441\u043d\u043e\u0432\u0430 \u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440<\/font><\/h2>\n<p>  \u0412 \u0441\u0432\u043e\u0438\u0445 \u0438\u0433\u0440\u0430\u0445 \u044f \u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u043f\u0440\u0438\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0434\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b: \u0435\u0441\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 Engine, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u043e\u043a\u043e\u043d, \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u0438\u0433\u0440\u044b \u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043e\u0431\u044b\u0447\u043d\u043e \u0437\u0430\u043f\u0443\u0449\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0438\u0433\u0440\u044b (\u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u2014 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0430\u0432\u0442\u043e\u0440\u0438\u0442\u0430\u0440\u043d\u044b\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u044b \u0441 \u043a\u043e\u043c\u043d\u0430\u0442\u0430\u043c\u0438, \u043d\u0430 \u043c\u0430\u043d\u0435\u0440 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/Left_4_Dead\">Left 4 Dead<\/a>), \u0441\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435 Engine \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d\u043e\u043c \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432 \u0441\u0435\u0431\u0435 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043f\u043e\u0434\u043c\u043e\u0434\u0443\u043b\u0438.<\/p>\n<pre><code class=\"cs\">   Game.Initialize(new GameApp());   Game.Current.Run(); <\/code><\/pre>\n<p>  \u041a\u0430\u043a \u044f \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b \u0432\u044b\u0448\u0435, \u0441\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435 \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d \u043d\u0430 \u0431\u0430\u0437\u0435 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e API Direct3D9. \u0412\u044b\u0431\u043e\u0440 DX9 \u043e\u0431\u0443\u0441\u043b\u043e\u0432\u043b\u0435\u043d \u0435\u0433\u043e \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u0430 \u0436\u0435\u043b\u0435\u0437\u0435 \u043f\u0440\u043e\u0448\u043b\u044b\u0445 \u043b\u0435\u0442, \u0445\u043e\u0440\u043e\u0448\u0435\u0439 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c\u044e (DX9 \u043b\u0435\u0433\u043a\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0436\u0435\u043b\u0435\u0437\u0435 \u0432\u0440\u0435\u043c\u0435\u043d DX8 \u0438 \u0434\u0430\u0436\u0435 DX7) \u0438 \u0438\u043d\u043e\u0433\u0434\u0430 \u043b\u0443\u0447\u0448\u0435\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u0430 \u0432\u0438\u0434\u0435\u043e\u0447\u0438\u043f\u0430\u0445 \u043e\u0442 ATI. \u041f\u043e \u0441\u0443\u0442\u0438, \u0432\u0441\u0451 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0438\u043b\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u043e\u043b\u043e\u0433\u0438\u0438 DirectX: \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0448\u0438\u0440\u0438\u043d\u0430 \u0438 \u0432\u044b\u0441\u043e\u0442\u0430 \u0432\u0442\u043e\u0440\u0438\u0447\u043d\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430, \u0436\u0435\u043b\u0430\u0435\u043c\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0441\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u043d\u0438\u044f MSAA, \u0432\u0438\u0434\u0435\u043e\u0440\u0435\u0436\u0438\u043c \u0438 \u0447\u0430\u0441\u0442\u043e\u0442\u0430 \u0436\u0435\u043b\u0430\u0435\u043c\u0430\u044f \u0447\u0430\u0441\u0442\u043e\u0442\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u044d\u043a\u0440\u0430\u043d\u0430.<\/p>\n<pre><code class=\"cs\"> internal Graphics()         {             d3d = new Direct3D();              CreateDevice();             Camera = new Camera();         }          private void CreateDevice()         {             int msaa = PickBestMSAALevel(Game.Current.Config.GetInt(\"renderer.msaa\"));              bool fullScreen = Game.Current.Config.GetBool(\"renderer.fullScreen\");              PresentParameters pp = new PresentParameters();             pp.AutoDepthStencilFormat = Format.D24S8;             pp.BackBufferCount = 1;             pp.BackBufferWidth = fullScreen ? Game.Current.Config.GetInt(\"engine.width\") : Game.Current.Width;             pp.BackBufferHeight = fullScreen ? Game.Current.Config.GetInt(\"engine.height\") : Game.Current.Height;             pp.BackBufferFormat = !fullScreen ? Format.Unknown : Format.X8R8G8B8;             pp.DeviceWindowHandle = Game.Current.Form.Handle;             pp.EnableAutoDepthStencil = true;             pp.SwapEffect = SwapEffect.Discard;             pp.Windowed = !fullScreen;             pp.MultiSampleType = (MultisampleType)msaa;             pp.FullScreenRefreshRateInHz = 0;             pp.MultiSampleQuality = 0;             pp.PresentFlags = PresentFlags.None;             pp.PresentationInterval = PresentInterval.Default;             pp.SwapEffect = SwapEffect.Discard;             device = new Device(d3d, 0, DeviceType.Hardware, Game.Current.Form.Handle, CreateFlags.HardwareVertexProcessing | CreateFlags.PureDevice, pp);              Game.Current.Log.Print(\"Initialized graphics\");             Game.Current.Log.Print(\"Total video memory: \" + device.AvailableTextureMemory \/ 1024 \/ 1024);         }          private int PickBestMSAALevel(int level)         {             int ret = level;              for (int i = level; i > 1; i--)             {                 if (d3d.CheckDeviceMultisampleType(0, DeviceType.Hardware, Format.Unknown,                     !Game.Current.Config.GetBool(\"renderer.fullScreen\"), (MultisampleType)i))                 {                     ret = i;                      continue;                 }             }              if(ret != level)                 Game.Current.Log.Print(\"Picked MSAA x\" + ret + \" , as your GPU doesn't support desired level\");              return ret;         }<\/code><\/pre>\n<p>  \u041f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0438 \u043d\u044e\u0430\u043d\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u2014 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u0443\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0432\u0435\u0440\u0448\u0438\u043d (<b>D3DCREATE_HARDWARE_VERTEXPROCESSING<\/b>), \u0438\u0437-\u0437\u0430 \u0447\u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0448\u0438\u0431\u043a\u043e\u0439 \u0431\u0435\u0437 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0444\u043b\u0430\u0433\u0430, \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u044b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442 \u0440\u0430\u0437\u043d\u044b\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u044b \u0431\u0443\u0444\u0435\u0440\u0430 \u0433\u043b\u0443\u0431\u0438\u043d\u044b \u0438 \u0442\u0440\u0430\u0444\u0430\u0440\u0435\u0442\u0430 (\u0441\u0435\u0439\u0447\u0430\u0441 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u044b \u043d\u0430\u0442\u0438\u0432\u043d\u043e \u0434\u0430\u0436\u0435 24\u0445-\u0431\u0438\u0442\u043d\u044b\u0439 RGB \u0434\u043b\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0442\u0430\u0440\u0433\u0435\u0442\u043e\u0432 \u043d\u0435 \u0443\u043c\u0435\u044e\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u044b\u0440\u0430\u0432\u043d\u0435\u043d\u043d\u044b\u0439 XRGB), \u0430 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u044b \u0434\u043e GF5xxx-GF6xxx \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u043b\u0438 Pure \u0440\u0435\u0436\u0438\u043c D3D, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0432\u043e\u0437\u043b\u0430\u0433\u0430\u0435\u0442 \u0432\u0441\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043e\u0448\u0438\u0431\u043e\u043a \u043d\u0430 \u0441\u0435\u0431\u044f, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u0432 \u0441\u0430\u043c\u043e\u043c GAPI \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442\u0441\u044f, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0447\u0435\u043c\u0443 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0432\u044b\u0438\u0433\u0440\u044b\u0448 \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>  \u0412\u0430\u0436\u043d\u043e \u0442\u0430\u043a \u0436\u0435 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0430\u0441\u043f\u0435\u043a\u0442, \u043a\u0430\u043a \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438. \u041a \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u044b \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u0441\u0442\u0430\u0440\u044b\u0445 GAPI \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u0438 \u0431\u0443\u0444\u0435\u0440\u044b (\u043a\u0430\u043a \u0432\u0435\u0440\u0448\u0438\u043d\u043d\u044b\u0435, \u0442\u0430\u043a \u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u043d\u044b\u0435). \u0412 OpenGL \u043e\u0441\u043e\u0431\u043e \u043d\u0435\u0442 \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u043d\u044f\u0442\u0438\u044f, \u043a\u0430\u043a Device Lost. \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0441\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0432\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438\u0437 \u043f\u043e\u043b\u043d\u043e\u044d\u043a\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u0436\u0438\u043c\u0430, \u0438\u043b\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u0438\u0434\u0435\u043e\u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u043a\u0440\u0430\u0448\u0438\u0442\u0441\u044f \u2014 \u0442\u043e GL \u0441\u0430\u043c \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u0437\u0430\u0431\u043e\u0442\u0438\u0442\u0441\u044f \u043e \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u0432\u0438\u0434\u0435\u043e\u043f\u0430\u043c\u044f\u0442\u044c (\u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u2014 Android \u0438 iOS, \u043d\u0430 \u043c\u043e\u0431\u0438\u043b\u043a\u0430\u0445 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043d\u0435 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0438\u0442\u0441\u044f, \u043d\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0433\u0440\u0443\u0436\u0435\u043d\u044b \u0438 \u0438\u0445 \u0445\u0435\u043d\u0434\u043b\u044b \u0441\u0442\u0430\u043d\u0443\u0442 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u043c\u0438). \u0423 D3D \u0435\u0441\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0435 <b>Lost<\/b>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u043e\u0442\u0435\u0440\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u2014 \u0438 \u0435\u0433\u043e \u0442\u043e\u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u0433\u0440\u0430\u043c\u043e\u0442\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 D3D \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0443\u043b\u043e\u0432:<\/p>\n<ul>\n<li> Managed: D3D9 \u0441\u0430\u043c \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u043a\u043e\u043f\u0438\u044e \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u0438\u043b\u0438 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u0432 \u041e\u0417\u0423, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0438 \u043f\u043e\u0442\u0435\u0440\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u043f\u0435\u0440\u0435\u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0435 \u0431\u0443\u0444\u0435\u0440\u044b \u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u043d\u0443\u0436\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u0430\u043c.<\/li>\n<li> Default: \u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u044e\u0442\u0441\u044f \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432 \u0432\u0438\u0434\u0435\u043e\u043f\u0430\u043c\u044f\u0442\u044c (\u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u043e\u043b\u043e\u0433\u0438\u0438 D3D \u2014 AGP memory), \u0438\u043b\u0438, \u0435\u0441\u043b\u0438 \u0432\u0438\u0434\u0435\u043e\u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u2014 \u0432 \u041e\u0417\u0423, \u0435\u0441\u043b\u0438 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 Shared Memory Architecture.<\/li>\n<li> System: \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u041e\u0417\u0423. \u042d\u0442\u043e\u0442 \u043f\u0443\u043b \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u0438\u0433\u0440\u0430\u0445 \u2014 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e.<\/li>\n<\/ul>\n<p>  \u0418 \u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0432 \u043f\u0443\u043b Default. \u0418\u043d\u0430\u0447\u0435 \u043f\u0440\u0438 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u0438\u0433\u0440\u0430 \u043d\u0430\u0447\u043d\u0435\u0442 \u00ab\u0436\u0440\u0430\u0442\u044c\u00bb \u041e\u0417\u0423 \u043d\u0435 \u0432 \u0441\u0435\u0431\u044f (\u043f\u0440\u0438\u043c\u0435\u0440 \u2014 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/Sid_Meier%E2%80%99s_Civilization_V\">Civilization 5<\/a>). \u041f\u0440\u0438 \u043f\u043e\u0442\u0435\u0440\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430, \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0441 \u0434\u0438\u0441\u043a\u0430 \u00ab\u043d\u0430 \u0433\u043e\u0440\u044f\u0447\u0443\u044e\u00bb!<\/p>\n<p>  \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0441\u0430\u043c\u043e\u043c\u0443 \u0432\u0430\u0436\u043d\u043e\u043c\u0443 \u2014 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0435 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438. \u0414\u043b\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0432\u0438\u0434\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0435 <i>\u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b<\/i>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0432 \u0441\u0435\u0431\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a\u0430\u044f \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0430 \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u044a\u0435\u043a\u0442 \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442 \u0441\u0432\u0435\u0442, \u043a\u0430\u043a\u0430\u044f \u0442\u0435\u0445\u043d\u0438\u043a\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438 \u0442. \u043f. \u0412 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0434\u0432\u0438\u0436\u043a\u0430\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u043e\u0431\u044b\u0447\u043d\u043e \u0433\u0438\u0431\u043a\u0430\u044f, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0448\u0435\u0439\u0434\u0435\u0440\u044b \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0441\u0430\u043c\u044b\u0435 \u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432 \u043d\u0435\u0442 \u0432\u043e\u043e\u0431\u0449\u0435, \u043d\u0430\u0431\u043e\u0440 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d \u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u044b: \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0442\u0435\u0445\u043d\u0438\u043a\u0438 \u0442\u0438\u043f\u0430 \u043f\u043e\u0432\u0435\u0440\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u0442\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u043e \u0424\u043e\u043d\u0433\u0443\/\u0413\u0443\u0440\u043e, \u0446\u0432\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0442\u0443\u043c\u0430\u043d \u0438 \u0442. \u043f. <\/p>\n<p>  \u0424\u043e\u0440\u043c\u0430\u0442 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u0432 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cs\">public struct Material     {         public Shader Shader; \/\/ Null for default          public Texture Texture;         public Texture Detail;         public Texture Detail2;         public Texture Reflection;          public MaterialDetailType DetailType;         public MaterialFlags Flags;          public bool NonLit;         public bool SampleShadowMap;          public Color4 Color;         public bool DepthTest;         public bool DepthWrite; \/\/ false - write          public Vector2 UVScale;          public static Material CreateDefault()         {             return new Material()             {                 Color = new Color4(1, 1, 1, 1)             };         }     }<\/code><\/pre>\n<p>  \u041e\u0434\u043d\u0430\u043a\u043e \u0434\u0430\u0436\u0435 \u0431\u0435\u0437 \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432 \u0431\u044b\u043b\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0433\u0438\u0431\u043a\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u2014 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <i>\u043a\u043e\u043c\u0431\u0430\u0439\u043d\u0435\u0440\u043e\u0432<\/i>, \u043a\u0430\u043a \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u043b\u0430 Quake 3. \u0421\u0430\u043c\u044b\u0435 \u043f\u0435\u0440\u0432\u044b\u0435 3D-\u0443\u0441\u043a\u043e\u0440\u0438\u0442\u0435\u043b\u0438 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u043b\u0438 \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0442\u0435\u043a\u0441\u0442\u0443\u0440 \u0437\u0430 \u043e\u0434\u0438\u043d \u0432\u044b\u0437\u043e\u0432 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0433\u0440\u044b \u0448\u043b\u0438 \u043d\u0430 \u0443\u0445\u0438\u0449\u0440\u0435\u043d\u0438\u0435: \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443 Quake \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043b \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044e \u043f\u043e \u043e\u0442\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0431\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0443\u0444\u0435\u0440\u0430 \u0433\u043b\u0443\u0431\u0438\u043d\u044b, \u043e\u043d \u043f\u0440\u043e\u0441\u0442\u043e\u2026 \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u043b \u0430\u043b\u044c\u0444\u0430-\u0431\u043b\u0435\u043d\u0434\u0438\u043d\u0433\u043e\u043c \u0442\u0443 \u0436\u0435 \u0441\u0430\u043c\u0443\u044e \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044e \u0441 \u0437\u0430\u0442\u0435\u043d\u0435\u043d\u043d\u043e\u0439 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u043e\u0439 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f (\u043b\u0430\u0439\u0442\u043c\u0430\u043f\u0430). \u042d\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u043d\u043e\u0433\u043e\u043f\u0440\u043e\u0445\u043e\u0434\u043d\u043e\u0439 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433. \u041a\u043e\u043c\u0431\u0430\u0439\u043d\u0435\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u0431\u043b\u0438\u0436\u0435 \u043a \u043a\u043e\u043d\u0446\u0443 90-\u0445, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u043b\u0438 \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u043a\u0441\u0442\u0443\u0440 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 (Add, Sub, Mul, Xor \u0438 \u0442. \u043f.), \u0430 \u0442\u0430\u043a\u0436\u0435 \u0443\u043c\u043d\u043e\u0436\u0430\u0442\u044c \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0446\u0432\u0435\u0442 \u043d\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442. \u0418\u043c\u0435\u043d\u043d\u043e \u043a\u043e\u043c\u0431\u0430\u0439\u043d\u0435\u0440\u044b \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0432 \u0441\u0432\u043e\u0451\u043c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0435 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432 \u2014 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043b\u0430\u0432\u043d\u043e\u0435 \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0443\u0440 \u043d\u0430 \u043b\u0430\u043d\u0434\u0448\u0430\u0444\u0442\u0435:<\/p>\n<pre><code class=\"cs\">  private void SetRenderState(Material mat)         {             device.SetRenderState&lt;ZBufferType>(RenderState.ZEnable, !mat.DepthTest ? ZBufferType.UseZBuffer : ZBufferType.DontUseZBuffer);             device.SetRenderState(RenderState.ZWriteEnable, !mat.DepthWrite);         }          private void SetShadowMeshState()         {             \/\/ Special case for shadow meshes             device.SetRenderState(RenderState.ZWriteEnable, false);             device.SetRenderState(RenderState.Lighting, false);              device.SetRenderState(RenderState.TextureFactor, new Color4(0, 0, 0, 0.9f).ToBgra());             device.SetTextureStageState(0, TextureStage.Constant, new Color4(0.1f, 0.1f, 0.1f, 1).ToBgra());             device.SetTextureStageState(0, TextureStage.ColorOperation, TextureOperation.SelectArg1);             device.SetTextureStageState(0, TextureStage.ColorArg1, TextureArgument.TFactor);             device.SetTextureStageState(0, TextureStage.AlphaArg1, TextureArgument.TFactor);              device.SetTextureStageState(1, TextureStage.ColorOperation, TextureOperation.Disable);             device.SetTextureStageState(1, TextureStage.AlphaOperation, TextureOperation.Disable);         }          private void SetTextureState(Material mat)         {             for (int i = 1; i &lt; 4; i++)             {                 device.SetTextureStageState(i, TextureStage.ColorOperation, TextureOperation.Disable);                 device.SetTextureStageState(i, TextureStage.AlphaOperation, TextureOperation.Disable);                                  device.SetTextureStageState(0, TextureStage.AlphaArg1, TextureArgument.Texture);                  device.SetSamplerState(i, SamplerState.MinFilter, TextureFilter.Linear);                 device.SetSamplerState(i, SamplerState.MagFilter, TextureFilter.Anisotropic);                 device.SetSamplerState(i, SamplerState.MipFilter, TextureFilter.Linear);             }              device.SetRenderState(RenderState.TextureFactor, mat.Color.ToRgba());              if (mat.DetailType != MaterialDetailType.BlendMask)             {                 if (mat.Texture != null)                 {                     device.SetTextureStageState(0, TextureStage.ColorOperation, TextureOperation.Modulate);                     device.SetTextureStageState(0, TextureStage.ColorArg1, TextureArgument.Texture);                     device.SetTextureStageState(0, TextureStage.ColorArg0, TextureArgument.Current);                     device.SetTexture(0, mat.Texture.Handle);                      if (mat.UVScale == Vector2.Zero)                         mat.UVScale = new Vector2(1, 1);                      device.SetTextureStageState(0, TextureStage.TextureTransformFlags, TextureTransform.Count2);                     device.SetTransform(TransformState.Texture0, Matrix.Scaling(mat.UVScale.X, mat.UVScale.Y, 1));                     device.SetTextureStageState(0, TextureStage.ResultArg, TextureArgument.Current);                      device.SetSamplerState(0, SamplerState.MinFilter, TextureFilter.Linear);                     device.SetSamplerState(0, SamplerState.MagFilter, TextureFilter.Anisotropic);                     device.SetSamplerState(0, SamplerState.MipFilter, TextureFilter.Linear);                 }             }             else             {                 if (mat.Texture != null)                 {                     device.SetTextureStageState(0, TextureStage.ColorOperation, TextureOperation.SelectArg1);                     device.SetTextureStageState(0, TextureStage.ColorArg1, TextureArgument.Texture);                     device.SetTextureStageState(0, TextureStage.ColorArg0, TextureArgument.Current);                     device.SetTexture(0, mat.Texture.Handle);                      if (mat.UVScale == Vector2.Zero)                         mat.UVScale = new Vector2(1, 1);                      device.SetTextureStageState(0, TextureStage.TextureTransformFlags, TextureTransform.Count2);                     device.SetTransform(TransformState.Texture0, Matrix.Scaling(mat.UVScale.X, mat.UVScale.Y, 1));                     device.SetTextureStageState(0, TextureStage.ResultArg, TextureArgument.Temp);                      device.SetSamplerState(0, SamplerState.MinFilter, TextureFilter.Linear);                     device.SetSamplerState(0, SamplerState.MagFilter, TextureFilter.Anisotropic);                     device.SetSamplerState(0, SamplerState.MipFilter, TextureFilter.Linear);                 }             }              if (mat.Detail != null)             {                 if (mat.DetailType == MaterialDetailType.BlendMask)                 {                     device.SetTexture(1, mat.Detail.Handle);                      device.SetTextureStageState(1, TextureStage.ColorOperation, TextureOperation.SelectArg1);                      device.SetTextureStageState(1, TextureStage.ColorArg0, TextureArgument.Current);                     device.SetTextureStageState(1, TextureStage.ColorArg1, TextureArgument.Texture);                     device.SetTextureStageState(1, TextureStage.ResultArg, TextureArgument.Temp);                     device.SetTextureStageState(1, TextureStage.TexCoordIndex, 0);                      device.SetSamplerState(1, SamplerState.MinFilter, TextureFilter.Linear);                     device.SetSamplerState(1, SamplerState.MagFilter, TextureFilter.Anisotropic);                     device.SetSamplerState(1, SamplerState.MipFilter, TextureFilter.Linear);                 }                 else                 {                     device.SetTexture(1, mat.Detail.Handle);                      device.SetTextureStageState(1, TextureStage.ColorOperation, TextureOperation.Modulate);                      device.SetTextureStageState(1, TextureStage.ColorArg0, TextureArgument.Current);                     device.SetTextureStageState(1, TextureStage.ColorArg1, TextureArgument.Texture);                     device.SetTextureStageState(1, TextureStage.ResultArg, TextureArgument.Current);                     device.SetTextureStageState(1, TextureStage.TexCoordIndex, 0);                      device.SetSamplerState(1, SamplerState.MinFilter, TextureFilter.Linear);                     device.SetSamplerState(1, SamplerState.MagFilter, TextureFilter.Anisotropic);                     device.SetSamplerState(1, SamplerState.MipFilter, TextureFilter.Linear);                 }             }         } <\/code><\/pre>\n<p>  \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043a\u043e\u043c\u0431\u0430\u0439\u043d\u0435\u0440\u043e\u0432 \u2014 \u043a\u0430\u0448\u0430 \u0438\u0437 \u0441\u0442\u0435\u0439\u0442\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u0434 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043d\u0435 \u043e\u0441\u043e\u0431\u043e \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u043e. \u0412\u0445\u043e\u0434\u043d\u0430\u044f \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430-\u043c\u0430\u0441\u043a\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/post_images\/2ae\/96f\/6d3\/2ae96f6d3e4ec2bf175ce297748a02b2.jpg\" alt=\"image\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/2ae\/96f\/6d3\/2ae96f6d3e4ec2bf175ce297748a02b2.jpg\" data-blurred=\"true\"\/><\/p>\n<p>  \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0435. \u041f\u043e \u0441\u0443\u0442\u0438, \u0437\u0430 \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043e\u0434\u0438\u043d \u043c\u0435\u0442\u043e\u0434 \u2014 DrawMesh, \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043a\u0430\u043c\u0438 (\u0432 \u0438\u0434\u0435\u0430\u043b\u0435 \u2014 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u0430 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u044b\u0435 World-space \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438). \u0412 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u0435 \u043c\u0435\u0442\u043e\u0434 \u0440\u0438\u0441\u0443\u0435\u0442 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e DIPUP, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0441\u044f \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f \u0432 \u0438\u0433\u0440\u0435 \u0431\u044b\u043b\u0430 \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0430 (\u0438 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f, \u0441\u0430\u043c\u043e \u0441\u043e\u0431\u043e\u0439, \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b\u0430\u0441\u044c \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0441\u043e\u0444\u0442\u0432\u0430\u0440\u043d\u043e, \u043d\u0430 \u0426\u041f\u0423, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043d\u0435 \u0432\u0438\u0434\u0435\u043b \u0440\u0430\u0437\u043d\u0438\u0446\u044b \u043c\u0435\u0436\u0434\u0443 \u043f\u0435\u0440\u0435\u0437\u0430\u043b\u0438\u0432\u043a\u043e\u0439 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u043d\u0430 GPU \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u0430\u0434\u0440 \u0438 DIPUP), \u043e\u0434\u043d\u0430\u043a\u043e \u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u0431\u0440\u0430\u043d\u0447\u0435\u0439 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u044f \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u043b \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0443 \u0441\u0442\u0430\u0442\u0438\u043a\u0443 \u043d\u0430 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 DIP. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e DIPUP \u0434\u043b\u044f \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u043e\u0439 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u043d\u0430 \u0441\u0442\u0430\u0440\u044b\u0445 GPU \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u043c \u2014 \u043a\u043e\u0433\u0434\u0430-\u0442\u043e \u044d\u0442\u0438\u043c \u0441\u0442\u0440\u0430\u0434\u0430\u043b \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0434\u0432\u0438\u0436\u043e\u043a Irrlicht.<\/p>\n<pre><code class=\"cs\"> public void DrawMesh(Mesh mesh, int frame, Material mat, Vector3 position, Vector3 rotation, Vector3 scale,             float morphFactor, Vector2 uv)         {             if(mesh != null)             {                 Matrix matrix = Matrix.Identity;                  matrix *= Matrix.Scaling(scale) *                     Matrix.RotationY(rotation.Y * Mathf.DegToRad) *                     Matrix.RotationZ(rotation.Z * Mathf.DegToRad) *                     Matrix.RotationX(rotation.X * Mathf.DegToRad) *                     Matrix.Translation(position);                  if (mat.Flags.HasFlag(MaterialFlags.ShadowMesh))                     matrix *= Matrix.Shadow(new Vector4(0, 1, 1, 0), new Plane(new Vector3(0, 1, 0), 0.95f)); \/\/ Note: This is hardcoded. We should calculate mesh height by it's bounding box(not implemented yet)                  device.SetTransform(TransformState.World, matrix);                  SetRenderState(mat);                                  if (mat.Flags.HasFlag(MaterialFlags.ShadowMesh))                 {                     SetShadowMeshState();                 }                 else                 {                     device.SetRenderState(RenderState.Lighting, !mat.NonLit);                     SetTextureState(mat);                 }                  bool lerpEnable = Game.Current.Config.GetBool(\"renderer.lerp\");                  if (morphFactor > 0)                 {                     if (frame &lt; mesh.Frames.Length &amp;&amp; lerpEnable)                     {                         mesh.UpdateMorphTarget(frame, frame + 1, morphFactor);                     }                 }                  if (morphFactor > 0 &amp;&amp; lerpEnable)                     device.DrawUserPrimitives&lt;Vertex>(PrimitiveType.TriangleList, mesh.Frames[frame].Length \/ 3, mesh.MorphVerts);                 else                     device.DrawUserPrimitives&lt;Vertex>(PrimitiveType.TriangleList, mesh.Frames[frame].Length \/ 3, mesh.Frames[frame]);             }         } <\/code><\/pre>\n<p>  \u0412 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0437\u0434\u043d\u0435\u043c \u0431\u0440\u0430\u043d\u0447\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u043e\u0441\u044c \u043e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0434\u0438\u0441\u0442\u0430\u043d\u0446\u0438\u0438 \u043e\u0442 \u00ab\u0433\u043b\u0430\u0437\u00bb \u0438\u0433\u0440\u043e\u043a\u0430 \u0438 \u043f\u043e \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0435 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438. <\/p>\n<p>  \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438. \u0415\u0441\u0442\u044c \u0442\u0440\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u0430 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u0432 \u0438\u0433\u0440\u0430\u0445:<\/p>\n<ul>\n<li> <b>\u0421\u043a\u0438\u043d\u043d\u0438\u043d\u0433<\/b>: \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f \u0432\u0435\u0440\u0448\u0438\u043d \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043a\u0435\u043b\u0435\u0442\u0430 \u043c\u043e\u0434\u0435\u043b\u0438. \u041e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u0439. \u0412\u0435\u0441\u044c \u0441\u043a\u0435\u043b\u0435\u0442 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0435\u0439, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044f, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043b\u0435\u0433\u043a\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u00ab\u0441\u043a\u0435\u043b\u0435\u0442\u043a\u0443\u00bb \u0432 \u0433\u0440\u0430\u0444-\u0441\u0446\u0435\u043d\u044b \u0441\u0430\u043c\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u043a\u0430 (Unity \u2014 \u0441\u0430\u043c\u044b\u0439 \u044f\u0440\u043a\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440). \u0418\u043d\u043e\u0433\u0434\u0430 \u0441\u043a\u0435\u043b\u0435\u0442\u043a\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0438 \u0434\u043b\u044f \u00ab\u043d\u0435\u043e\u0436\u0438\u0432\u043b\u0435\u043d\u043d\u044b\u0445\u00bb \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432 \u2014 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f \u043f\u043e\u0434\u0432\u0435\u0441\u043a\u0438 \u0430\u0432\u0442\u043e.<\/li>\n<li> <b>\u041c\u043e\u0440\u0444\u0438\u043d\u0433<\/b>: \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0441\u0443\u0442\u044c \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u00ab\u0437\u0430\u043f\u0435\u043a\u0430\u043d\u0438\u0438\u00bb \u0432\u0441\u0435\u0445 \u043a\u0430\u0434\u0440\u043e\u0432 \u0432 \u0432\u0438\u0434\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043c\u0435\u0448\u0435\u0439. \u0417\u0430\u0442\u0435\u043c \u0438\u0433\u0440\u0430 \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u0438\u0440\u0443\u0435\u0442 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043c\u0435\u0436\u0434\u0443 \u043a\u0430\u0434\u0440\u0430\u043c\u0438 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0447\u0435\u043c\u0443 \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u044d\u0444\u0444\u0435\u043a\u0442 \u043f\u043b\u0430\u0432\u043d\u043e\u0441\u0442\u0438.<\/li>\n<li> <b>Object-Transform<\/b>: \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u0435\u0442\u043e\u0434 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438, \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u0441\u043a\u0438\u043d\u043d\u0438\u043d\u0433, \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043d\u0435 \u0441\u0430\u043c\u0438 \u0432\u0435\u0440\u0448\u0438\u043d\u044b, \u0430 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u043a \u043d\u0438\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u044b. \u041f\u0440\u0438\u043c\u0435\u043d\u044f\u043b\u0430\u0441\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u0438\u0433\u0440\u0430\u0445 \u043d\u0430 PS1 \u0438 \u0432 GTA III (\u0437\u0430\u043c\u0435\u0447\u0430\u043b\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043f\u043b\u0430\u0432\u043d\u043e\u0441\u0442\u0438 \u0432 \u043c\u0435\u0441\u0442\u0430\u0445 \u0441\u043e\u0447\u043b\u0435\u043d\u0435\u043d\u0438\u0439 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u0439 \u2014 \u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c OT).<\/li>\n<\/ul>\n<p>  \u042f \u043d\u0435 \u0443\u043c\u0435\u044e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0441\u043a\u0438\u043d\u043d\u0438\u043d\u0433\u043e\u043c \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0432 3D-\u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430\u0445 \u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0435 \u044e\u0437\u0430\u044e \u0441\u043a\u0438\u043d\u043d\u0438\u043d\u0433 \u0432 \u0441\u0432\u043e\u0438\u0445 \u0438\u0433\u0440\u0443\u0448\u043a\u0430\u0445 \u2014 \u0434\u043b\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0434\u0435\u043c\u043e\u043a \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u043c\u043e\u0440\u0444\u0438\u043d\u0433\u0430 \u0441 \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u044f\u0446\u0438\u0435\u0439. \u0415\u0441\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u044f\u0446\u0438\u044e \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, \u0442\u043e \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u043e\u043f\u043e\u0440\u043d\u043e (\u0432 Quake 1 \u043f\u0440\u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 CVar&#8217;\u0430 \u0442\u0430\u043a\u0430\u044f \u0438 \u0431\u044b\u043b\u0430):<\/p>\n<div class=\"oembed\">\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/651d2daf72e08276d7ab0161\" data-style=\"\" id=\"651d2daf72e08276d7ab0161\" width=\"\"><\/div>\n<\/div>\n<pre><code class=\"cs\"> internal void UpdateMorphTarget(int currFrame, int nextFrame, float time)         {             for(int i = 0; i &lt; MorphVerts.Length; i++)             {                 MorphVerts[i].Position = Vector3.Lerp(Frames[currFrame][i].Position, Frames[nextFrame][i].Position, time);                 MorphVerts[i].Normal = Vector3.Lerp(Frames[currFrame][i].Normal, Frames[nextFrame][i].Normal, time);                 MorphVerts[i].UV = Frames[currFrame][i].UV;             }         }  <\/code><\/pre>\n<p>  \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f\u043c\u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u0430 \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cs\"> animator.AddSequence(new MeshSequence()             {                 From = 0,                 To = 30,                 Speed = 0.5f             }, \"idle\");              animator.AddSequence(new MeshSequence()             {                 From = 80,                 To = 90,                 Speed = 0.2f             }, \"attack\");              animator.AddSequence(new MeshSequence()             {                 From = 80,                 To = 85,                 Speed = 0.2f             }, \"damage\");              animator.AddSequence(new MeshSequence()             {                 From = 190,                 To = 197,                 Speed = 0.2f             }, \"kill\");              animator.AttachEventToSequence(\"kill\", () =>             {                 World.Destroy(this);             });              animator.AddSequence(new MeshSequence()             {                 From = 40,                 To = 45,                 Speed = 0.14f             }, \"walk\"); <\/code><\/pre>\n<p>  \u041f\u043e \u0441\u0443\u0442\u0438, \u043e\u0434\u043d\u0430 \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u044b\u0445 \u0447\u0430\u0441\u0442\u0435\u0439 \u2014 \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440, \u0433\u043e\u0442\u043e\u0432\u0430. \u041e\u0434\u043d\u0430\u043a\u043e \u0432 \u0438\u0433\u0440\u0430\u0445 \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0443\u0434\u0430 \u043f\u0440\u043e\u0449\u0435.<\/p>\n<h2><font color=\"#1c22be\">\u276f<\/font> <font color=\"#454cee\">\u0417\u0432\u0443\u043a \u0438 \u0432\u0432\u043e\u0434<\/font><\/h2>\n<p>  \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u0432\u0443\u043a\u0430 \u0432 \u0438\u0433\u0440\u0430\u0445 \u0437\u0430\u0434\u0430\u0447\u0430 \u043d\u0435 \u0448\u0438\u0431\u043a\u043e \u0441\u043b\u043e\u0436\u043d\u0430\u044f, \u0435\u0441\u043b\u0438 \u0434\u0435\u043b\u043e \u043d\u0435 \u0434\u043e\u0445\u043e\u0434\u0438\u0442 \u0434\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u0438\u043a\u0448\u0435\u0440\u0430, 3D-\u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432. \u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0443 \u0438\u0433\u0440 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u043d\u0435-\u0441\u0436\u0430\u0442\u043e\u0433\u043e wav, \u0437\u0432\u0443\u043a \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0435 PCM-\u043f\u043e\u0442\u043e\u043a\u0430.<\/p>\n<p>  \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 API \u0434\u043b\u044f \u0437\u0432\u0443\u043a\u0430 \u044f \u0432\u044b\u0431\u0440\u0430\u043b DirectSound. \u041e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e\u0435 API, \u0445\u043e\u0442\u044f \u0441\u0435\u0439\u0447\u0430\u0441 \u0435\u0433\u043e \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u0442\u0435\u0441\u043d\u0438\u043b XAudio. DirectSound \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043b\u044e\u0431\u044b\u0435 \u0437\u0432\u0443\u043a\u043e\u0432\u044b\u0435 \u043a\u0430\u0440\u0442\u044b, \u0441\u0430\u043c \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043c\u0438\u043a\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0437\u0432\u0443\u043a\u0430, \u0430 \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0442\u0430\u0440\u0438\u0447\u043a\u0430\u0445 \u0442\u0438\u043f\u0430 AC97 \u0443\u043c\u0435\u0435\u0442 \u0434\u0430\u0436\u0435 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u043e\u0435 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435! \u041d\u0430 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d\u0430\u0445 \u043e\u0431\u044b\u0447\u043d\u043e \u043c\u0438\u043a\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u043e\u0444\u0442\u0432\u0430\u0440\u043d\u043e, \u0434\u0430\u0431\u044b \u043d\u0435 \u0443\u043f\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u0430\u043d\u0430\u043b\u043e\u0432\/\u043f\u0430\u043c\u044f\u0442\u044c \u043d\u0430 \u0431\u043e\u0440\u0442\u0443 \u0437\u0432\u0443\u043a\u043e\u0432\u043e\u0433\u043e \u0430\u0434\u0430\u043f\u0442\u0435\u0440\u0430, \u043d\u043e \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u043c \u044d\u0442\u043e \u043f\u043e\u043c\u043e\u0433\u0430\u043b\u043e \u0441\u043d\u0438\u0437\u0438\u0442\u044c \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u043d\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440.<\/p>\n<p>  \u0412 DirectSound \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u0430: \u0441\u0430\u043c IDirectSound8, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043a \u0437\u0432\u0443\u043a\u043e\u0432\u043e\u0439 \u043a\u0430\u0440\u0442\u0435 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044e \u0435\u0451 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438 \u0438 <i>\u0431\u0443\u0444\u0435\u0440<\/i> \u2014 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u0434\u043a\u0440\u0435\u043f\u043b\u0435\u043d \u043a\u0430\u043a \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u0442\u0430\u043a \u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0437 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430. \u0412 \u0438\u0433\u0440\u0430\u0445, \u043e\u043d\u0438 \u0434\u0435\u043b\u044f\u0442\u0441\u044f \u043d\u0430 \u0442\u0440\u0438 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u043f\u043e\u043d\u044f\u0442\u0438\u044f:<\/p>\n<ul>\n<li> <b>\u0421\u043b\u0443\u0448\u0430\u0442\u0435\u043b\u044c<\/b>: \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0438 \u0438\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u00ab\u0441\u043b\u0443\u0448\u0430\u0442\u0435\u043b\u044f\u00bb \u2014 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0443\u0448\u0435\u0439 \u0432 \u0438\u0433\u0440\u043e\u0432\u043e\u043c \u043c\u0438\u0440\u0435. \u041e\u0431\u044b\u0447\u043d\u043e \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0441\u043b\u0443\u0448\u0430\u0442\u0435\u043b\u044f \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u043f\u043e\u0437\u0438\u0446\u0438\u0435\u0439 \u0438\u0433\u0440\u043e\u043a\u0430.<\/li>\n<li> <b>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a<\/b>: \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0437\u0432\u0443\u043a\u0430 \u0432 3D-\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u043c\u0438\u043c\u043e \u043d\u0430\u0441 \u043f\u0440\u043e\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043c\u0430\u0448\u0438\u043d\u0430, \u0442\u043e \u0437\u0432\u0443\u043a\u043e\u0432\u043e\u043c\u0443 API \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u043d\u0430\u0442\u044c \u043f\u043e\u0437\u0438\u0446\u0438\u044e, \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u0438 \u0434\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0437\u0432\u0443\u043a\u0430, \u0434\u0430\u0431\u044b \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0441\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0432\u0443\u043a \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435.<\/li>\n<li> <b>\u041f\u043e\u0442\u043e\u043a<\/b>: \u043f\u043e\u0442\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432 \u0441\u0435\u0431\u0435 \u0437\u0432\u0443\u043a. \u041c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u043c \u0431\u0443\u0444\u0435\u0440\u043e\u043c, \u043a\u0443\u0434\u0430 \u0437\u0432\u0443\u043a \u0443\u0436\u0435 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d, \u0442\u0430\u043a \u0438 \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u044b\u043c \u0431\u0443\u0444\u0435\u0440\u043e\u043c, \u043a\u0443\u0434\u0430 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u044c \u043c\u0443\u0437\u044b\u043a\u0438 \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0434\u043b\u0438\u043d\u043d\u043e\u0433\u043e \u0442\u0440\u0435\u043a\u0430.<\/li>\n<\/ul>\n<p>  \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0437\u0432\u0443\u043a\u0430:<\/p>\n<pre><code class=\"cs\">public struct WavHeader     {         public int chunkId;         public int chunkSize;         public int format;         public int subchunkid;         public int subchunksize;         public short audioFormat;         public short numChannels;         public int sampleRate;         public int byteRate;         public short blockAlign;         public short bitsPerSample;         public int subchunk2Id;         public int subchunk2Size;     }      public enum AudioType     {         Music,         Effect     }      public sealed class AudioStream     {         private SecondarySoundBuffer buffer;          public AudioType Type         {             get;             set;         }          public float Volume         {             get             {                 return buffer.Volume;             }             set             {                 buffer.Volume = (int)(value * -2000.0f);             }         }          public bool IsPlaying         {             get             {                 return buffer.Status == (int)BufferStatus.Playing;             }         }          public AudioStream()         {          }          public void Play()         {             buffer.Play(0, PlayFlags.None);         }          public void Stop()         {             buffer.Stop();         }          public void Upload(int sampleRate, int align, int channels, byte[] data, int size)         {             if(data != null)             {                 if (buffer != null)                     buffer.Dispose();                  SoundBufferDescription desc = new SoundBufferDescription();                 desc.Flags = BufferFlags.Software | BufferFlags.ControlVolume;                 desc.Format = new SharpDX.Multimedia.WaveFormat(sampleRate, align, channels);                 desc.BufferBytes = size;                 buffer = new SecondarySoundBuffer(Game.Current.AudioManager.ds, desc);                  DataStream ds2 = null;                 DataStream strm = buffer.Lock(0, size, LockFlags.EntireBuffer, out ds2);                 strm.WriteRange&lt;byte>(data, 0, size);                 buffer.Unlock(strm, ds2);                              }         }          public unsafe static AudioStream LoadWav(System.IO.Stream strm)         {             BinaryReader reader = new BinaryReader(strm);             WavHeader hdr = new WavHeader()             {                 chunkId = reader.ReadInt32(),                 chunkSize = reader.ReadInt32(),                 format = reader.ReadInt32(),                 subchunkid = reader.ReadInt32(),                 subchunksize = reader.ReadInt32(),                 audioFormat = reader.ReadInt16(),                 numChannels = reader.ReadInt16(),                 sampleRate = reader.ReadInt32(),                 byteRate = reader.ReadInt32(),                 blockAlign = reader.ReadInt16(),                 bitsPerSample = reader.ReadInt16(),                 subchunk2Id = reader.ReadInt32(),                 subchunk2Size = reader.ReadInt32()             };              byte[] data = new byte[strm.Length - sizeof(WavHeader)];             reader.Read(data, 0, data.Length);              AudioStream stream = new AudioStream();             stream.Upload(hdr.sampleRate, hdr.bitsPerSample, hdr.numChannels, data, data.Length);              return stream;         }          public unsafe static AudioStream LoadVorbis(System.IO.Stream strm)         {             Vorbis.Vorbis vorbisStrm = new Vorbis.Vorbis(strm);              return null;         }     }      public sealed class AudioManager     {         internal DirectSound ds;         private PrimarySoundBuffer buffer;          internal AudioManager()         {             ds = new DirectSound();             ds.SetCooperativeLevel(Game.Current.Form.Handle, CooperativeLevel.Normal);              SoundBufferDescription desc = new SoundBufferDescription();             desc.Flags = BufferFlags.PrimaryBuffer;             desc.Format = null;             buffer = new PrimarySoundBuffer(ds, desc);         }     } <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c \u0437\u0432\u0443\u043a\u0438 \u0432 \u043d\u0430\u0448\u0435\u0439 \u0438\u0433\u0440\u0435!<\/p>\n<p>  \u041e\u0434\u043d\u0430\u043a\u043e, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0433 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441 \u043d\u0430\u0448\u0435\u0439 \u0438\u0433\u0440\u043e\u0439. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u0435\u0441\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 API \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438 \u0432\u0432\u043e\u0434\u0430. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 Windows \u2014 \u044d\u0442\u043e DirectInput \u0434\u043b\u044f \u043e\u0431\u044b\u0447\u043d\u044b\u0445 USB-\u0433\u0435\u0439\u043c\u043f\u0430\u0434\u043e\u0432 \u0438 \u0440\u0443\u043b\u0435\u0439, \u0438 XInput \u0434\u043b\u044f \u0433\u0435\u0439\u043c\u043f\u0430\u0434\u043e\u0432, \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0445 \u0441 Xbox 360\/Xbox One. \u041d\u0430\u0436\u0430\u0442\u0438\u044f \u0441 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0434\u0432\u0443\u043c\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438: \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043e\u0431\u044b\u0442\u0438\u0439 WM_KEYDOWN \u0438 WM_KEYUP \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 WinAPI GetAsyncKeyState.<\/p>\n<p>  \u041f\u043e\u043a\u0430 \u0447\u0442\u043e \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0430 \u0438 \u043c\u044b\u0448\u044c:<\/p>\n<pre><code class=\"cs\"> public sealed class Input   {     private KeyboardState[] keyboardState;      [DllImport(\"user32.dll\")]     private static extern short GetAsyncKeyState(Keys vKey);      public Input()     {       this.keyboardState = new KeyboardState[(int) byte.MaxValue];     }      private bool IsPressed(Keys key)     {        return ((int) Input.GetAsyncKeyState(key) &amp; 32768) > 0;     }       public KeyboardState GetKeyState(Keys key)     {        return this.keyboardState[(int) key];     }      public Vector2 GetMousePosition()     {       if (Game.Current.Form.IsDisposed)         return Vector2.Zero;       Point client = Game.Current.Form.PointToClient(new Point(Cursor.Position.X, Cursor.Position.Y));       return new Vector2((float) client.X, (float) client.Y);     }      internal void Update()     {       for (int key = 0; key &lt; (int) byte.MaxValue; ++key)       {         if (this.keyboardState[key] == KeyboardState.Hot)           this.keyboardState[key] = KeyboardState.Pressed;         if (this.keyboardState[key] == KeyboardState.Idle &amp;&amp; this.IsPressed((Keys) key))           this.keyboardState[key] = KeyboardState.Hot;         if (this.keyboardState[key] == KeyboardState.Pressed &amp;&amp; !this.IsPressed((Keys) key))           this.keyboardState[key] = KeyboardState.Idle;       }     }   } <\/code><\/pre>\n<p>  \u0412 \u0438\u0434\u0435\u0430\u043b\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0432\u0432\u043e\u0434\u0430 \u043b\u0443\u0447\u0448\u0435 \u0430\u0431\u0441\u0442\u0440\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0442 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u043f\u043e\u043d\u044f\u0442\u0438\u044f \u043e\u0441\u0435\u0439, \u043a\u043d\u043e\u043f\u043e\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0438 \u0442. \u043f. \u0416\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u0434\u0443\u043c\u0430\u0442\u044c, \u043a\u0430\u043a \u0438\u0433\u0440\u0430 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0433\u0435\u0439\u043c\u043f\u0430\u0434\u043e\u043c \u0438 \u0443\u0436\u0435 \u0437\u0430\u0442\u0435\u043c \u043d\u0430\u0437\u043d\u0430\u0447\u0430\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0430\u043c \u043d\u0430 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u0433\u043e \u0433\u0435\u0439\u043c\u043f\u0430\u0434\u0430.<\/p>\n<p>  \u041d\u0443 \u0447\u0442\u043e \u0436, \u0441\u0430\u043c\u044b\u0439 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0434\u043b\u044f \u0438\u0433\u0440 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c. \u041f\u043e\u0440\u0430 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u0441\u0430\u043c\u043e\u0439 \u0438\u0433\u0440\u044b!<\/p>\n<h2><font color=\"#1c22be\">\u276f<\/font> <font color=\"#454cee\">\u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0443\u0440\u043e\u0432\u043d\u0435\u0439<\/font><\/h2>\n<p>  \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0443 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u043d\u0435\u0442 \u043a\u0430\u043a\u043e\u0433\u043e-\u043b\u0438\u0431\u043e \u0441\u0432\u043e\u0435\u0433\u043e \u0433\u0440\u0430\u0444\u0430 \u0441\u0446\u0435\u043d\u044b, \u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u044e \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0433\u0440\u0435 \u0441 \u043d\u0443\u043b\u044f \u2014 \u043f\u043e\u0434 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u043d\u0443\u0436\u0434\u044b. \u0412 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0438\u0433\u0440\u0435 \u043d\u0443\u0436\u0435\u043d \u0441\u0442\u0440\u0438\u043c\u0438\u043d\u0433 \u0434\u043b\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u043c\u0438\u0440\u0430, \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u2014 \u0431\u044b\u0441\u0442\u0440\u0430\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0443\u0440\u043e\u0432\u043d\u0435\u0439, \u0433\u0434\u0435 \u0435\u0441\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438. \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b Blender \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u0438 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043b \u043a\u0430\u0440\u0442\u044b \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u043b \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432 \u0444\u0430\u0439\u043b.<\/p>\n<p>  \u041e\u0434\u043d\u0430\u043a\u043e \u0431\u043b\u0435\u043d\u0434\u0435\u0440 (\u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e 2.79 \u0438 \u043d\u0438\u0436\u0435) \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u043a\u0430\u0440\u0442\u0430\u043c\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0441\u0442\u0430\u043b \u0432\u043e\u043f\u0440\u043e\u0441 \u0441 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0433\u0440\u0430\u0444\u0430 \u0441\u0446\u0435\u043d\u044b \u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u043a\u0430\u0440\u0442.<\/p>\n<p>  \u0413\u0440\u0430\u0444 \u0441\u0446\u0435\u043d\u044b \u0438 \u0433\u0440\u0430\u0444\u043e\u043c \u0442\u043e \u043d\u0435 \u043d\u0430\u0437\u043e\u0432\u0435\u0448\u044c \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043d\u0430 \u0441\u0446\u0435\u043d\u0435. \u041a\u0430\u0436\u0434\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442\u0441\u044f \u043e\u0442 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 Entity, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u00ab\u043d\u0435\u0432\u0438\u0434\u0438\u043c\u044b\u0439\u00bb \u043e\u0431\u044a\u0435\u043a\u0442, \u0438\u043b\u0438 PhysicsEntity, \u0435\u0441\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0434\u0432\u0438\u0436\u043a\u043e\u043c. \u0423 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u043c\u044f \u0438 \u0444\u043b\u0430\u0433 \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435.<\/p>\n<pre><code class=\"cs\">   public abstract class Entity   {     public string Name { get; set; }      public bool IsSelected { get; set; }      public virtual void Update()     {     }      public virtual void Draw()     {     }      public virtual void TransparentDraw()     {     }      public virtual void Destroy()     {     }      public override string ToString() => this.Name;   } } <\/code><\/pre>\n<p>  \u0412\u043e\u043e\u0431\u0449\u0435, \u0434\u043b\u044f \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u0445\u043e\u0442\u044c \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 Unity \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0432 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0435\u0440 \u0432 \u0441\u0430\u043c\u043e\u043f\u0430\u043b\u044c\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442. \u041e\u0434\u043d\u0430\u043a\u043e \u044f \u0440\u0435\u0448\u0438\u043b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440: \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e\u0435 Windows Forms \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 + \u043f\u0430\u043d\u0435\u043b\u044c, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0434\u0432\u0438\u0436\u043e\u043a \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443. \u0412 \u0435\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435\u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e: \u043e\u043d \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0443\u0440\u043e\u0432\u0435\u043d\u044c, \u043a\u0430\u043a \u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0438\u0433\u0440\u0430, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0438\u0433\u0440\u043e\u043a\u0430 \u0438 \u0431\u043e\u0442\u043e\u0432 \u0438 \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u0443\u044e \u043a\u0430\u043c\u0435\u0440\u0443.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/909\/c83\/e9d\/909c83e9d24639655b3c89a059f158f3.png\" alt=\"image\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/909\/c83\/e9d\/909c83e9d24639655b3c89a059f158f3.png\"\/><\/p>\n<p>  \u0424\u043e\u0440\u043c\u0430\u0442 \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u0439 \u0434\u043e\u043d\u0435\u043b\u044c\u0437\u044f. \u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0438\u0433\u0440\u0443\u0448\u0435\u043a \u044f \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443 KISS \u0438 \u043d\u0435 \u043b\u044e\u0431\u043b\u044e \u0440\u0430\u0441\u043f\u044b\u043b\u044f\u0442\u044c\u0441\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u043c\u0438 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430\u043c\u0438\/\u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430\u043c\u0438 \u0438 \u043f\u0440\u043e\u0447\u0438\u043c\u0438 \u0437\u0430\u043c\u043e\u0440\u043e\u0447\u043a\u0430\u043c\u0438, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u044f \u043b\u0438\u0448\u044c \u0441\u0430\u043c\u044b\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b. \u0424\u043e\u0440\u043c\u0430\u0442 \u043a\u0430\u0440\u0442 \u2014 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439, \u043e\u0434\u043d\u0430 \u043b\u0438\u043d\u0438\u044f \u043d\u0430 \u043e\u0434\u0438\u043d \u043e\u0431\u044a\u0435\u043a\u0442:<\/p>\n<pre><code class=\"cs\">p ferns 0 0 10.8 0 0 0 1<\/code><\/pre>\n<p>  \u0413\u0434\u0435 p \u2014 \u00ab\u043a\u043b\u0430\u0441\u0441\u00bb \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 p \u2014 \u044d\u0442\u043e Prop, \u00ab\u0434\u0435\u043a\u043e\u0440\u0430\u0446\u0438\u044f\u00bb.<br \/>  ferns \u2014 \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u0440\u043e\u043f\u0430. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u0430\u043c\u0438 \u043f\u0440\u043e\u043f\u044b \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0445 \u0444\u0430\u0439\u043b\u0430\u0445, \u0433\u0434\u0435 \u0432 \u0432\u0438\u0434\u0435 key-value \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0438, \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430, \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u0438 \u0442. \u043f.<br \/>  XYZ \u2014 \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0432 \u043c\u0438\u0440\u0435.<br \/>  XYZ \u2014 \u043f\u043e\u0432\u043e\u0440\u043e\u0442 \u0432 \u043c\u0438\u0440\u043e\u0432\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u0445, \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u0432 \u0443\u0433\u043b\u0430\u0445 \u042d\u0439\u043b\u0435\u0440\u0430 (\u044d\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0441\u0442\u0430\u0442\u0438\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0435 \u043f\u043e\u0434\u0432\u0435\u0440\u0436\u0435\u043d\u0430 Gimbal Lock, \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u0432\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0438\u0434\u0451\u0442 \u0441 \u043a\u0432\u0430\u0442\u0435\u0440\u043d\u0438\u043e\u043d\u0430\u043c\u0438).<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/5f5\/60e\/b6d\/5f560eb6daeba3dac22b92b08c2e75f9.png\" alt=\"image\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/5f5\/60e\/b6d\/5f560eb6daeba3dac22b92b08c2e75f9.png\"\/><\/p>\n<h2><font color=\"#1c22be\">\u276f<\/font> <font color=\"#454cee\">\u0424\u0438\u0437\u0438\u043a\u0430 \u0430\u0432\u0442\u043e\u043c\u043e\u0431\u0438\u043b\u0435\u0439<\/font><\/h2>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0433\u0440\u0430\u0444 \u0441\u0446\u0435\u043d\u044b \u0431\u044b\u043b \u0433\u043e\u0442\u043e\u0432, \u044f \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043b \u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0444\u0438\u0437\u0438\u043a\u0438 \u0430\u0432\u0442\u043e\u043c\u043e\u0431\u0438\u043b\u0435\u0439. \u041d\u043e \u043a\u0430\u043a \u044f \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b, \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0434\u0432\u0438\u0436\u043e\u043a \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u2014 \u0442. \u0435. \u0432\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u043f\u043e \u0440\u0435\u0437\u043e\u043b\u0432\u0438\u043d\u0433\u0443 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0439, \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u0435\u043b\u043b\u0438\u0432\u0430\u043d\u0438\u044e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0438 Joint&#8217;\u0430\u043c \u0441\u0432\u043e\u0434\u0438\u043b\u0430\u0441\u044c \u0447\u0438\u0441\u0442\u043e \u043a \u043d\u0435\u043c\u0443. \u042f \u043b\u0438\u0448\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0432 \u0444\u0438\u0437\u0438\u043a\u0443 \u043a\u043e\u043b\u0435\u0441\u0430, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043c\u0430\u0448\u0438\u043d\u043a\u0438, \u0432\u043d\u0435\u0441\u044f \u0432 \u043d\u0435\u0433\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f: \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u2014 \u0432\u044b\u043d\u0435\u0441 \u0432 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0442\u0440\u0435\u043d\u0438\u044f \u043a\u043e\u043b\u0435\u0441\u0430. <\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/fcb\/edd\/2e5\/fcbedd2e566e048db43ecf7e6b94ecd4.png\" alt=\"image\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/fcb\/edd\/2e5\/fcbedd2e566e048db43ecf7e6b94ecd4.png\"\/><\/p>\n<p>  \u0421\u0430\u043c\u043e \u043a\u043e\u043b\u0435\u0441\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u043f\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u043c\u0443 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443 \u0440\u0435\u0439\u043a\u0430\u0441\u0442\u0438\u043d\u0433\u0430 \u2014 \u043a\u043e\u043b\u0435\u0441\u043e \u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043f\u043e\u0434 \u0441\u0435\u0431\u044f \u043b\u0443\u0447\u0438 \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0442\u0440\u0435\u043d\u0438\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0441\u0442\u043e\u0438\u0442, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0434\u0432\u0438\u0433\u0430\u044f \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0442\u0435\u043b\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435. \u0421\u0435\u0439\u0447\u0430\u0441 \u0432 \u0438\u0433\u0440\u0430\u0445 \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0442\u043e\u0447\u043d\u043e\u0439 \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f Pacejka Magic Formula \u2014 \u0444\u043e\u0440\u043c\u0443\u043b\u0430, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0430\u044f \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u043e\u043a\u0440\u044b\u0448\u043a\u0438 \u0441 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0434\u0438\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438.<\/p>\n<p>  \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043a\u043b\u0430\u0441\u0441 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u043c\u0430\u0448\u0438\u043d\u043a\u0438 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u0441\u0430\u043c\u044b\u0445 \u0440\u0430\u0437\u043d\u044b\u0445 \u0430\u0441\u043f\u0435\u043a\u0442\u043e\u0432 (\u043a\u043e\u0440\u043e\u0431\u043a\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0447, \u0430\u0441\u043f\u0435\u043a\u0442\u044b \u0442\u044e\u043d\u0438\u043d\u0433\u0430, \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u0438 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b), \u044f \u0432\u044b\u043d\u0435\u0441 \u0447\u0430\u0441\u0442\u044c \u0444\u0438\u0437\u0438\u043a\u0438 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 CarPhysics:<\/p>\n<pre><code class=\"cs\"> public sealed class CarPhysics   {     private AudioStream[] hitSounds;     private AudioSource srcHit;      public Wheel[] Wheels { get; private set; }      public Rigidbody Rigidbody { get; set; }      public float MaxSteerAngle { get; set; }      public float Acceleration { get; set; }      public float MaxSpeed { get; set; }      public Car Car { get; private set; }      internal CarPhysics(Car car)     {       this.Car = car;       this.Wheels = new Wheel[4];       this.hitSounds = new AudioStream[3]       {         Game.Current.Data.GetAudioStream(\"sound\/hit1.wav\"),         Game.Current.Data.GetAudioStream(\"sound\/hit2.wav\"),         Game.Current.Data.GetAudioStream(\"sound\/hit3.wav\")       };       this.Car.game.track.JWorld.Events.BodiesBeginCollide += new Action&lt;RigidBody, RigidBody>(this.OnCollide);     }      private void OnCollide(RigidBody arg1, RigidBody arg2)     {       if (arg1 != this.Rigidbody.Body &amp;&amp; arg2 != this.Rigidbody.Body)         return;       new AudioSource(this.hitSounds[new Random().Next(0, this.hitSounds.Length - 1)])       {         Position = this.Rigidbody.Position,         Velocity = new Vector3(this.Rigidbody.Body.LinearVelocity.X, this.Rigidbody.Body.LinearVelocity.Y, this.Rigidbody.Body.LinearVelocity.Z)       }.Play();     }      public void Move(float gas, float steer)     {       if (this.Wheels[0] != null &amp;&amp; this.Wheels[1] != null)       {         this.Wheels[0].SteerAngle = steer * this.MaxSteerAngle;         this.Wheels[1].SteerAngle = steer * this.MaxSteerAngle;       }       this.Wheels[0].AddTorque(gas * this.Acceleration);       this.Wheels[1].AddTorque(gas * this.Acceleration);       this.Wheels[2].AddTorque(gas * this.Acceleration);       this.Wheels[3].AddTorque(gas * this.Acceleration);        this.Rigidbody.Body.LinearVelocity = new                  JVector(Mathf.Clamp(this.Rigidbody.Body.LinearVelocity.X, -this.MaxSpeed,                  this.MaxSpeed), Mathf.Clamp(this.Rigidbody.Body.LinearVelocity.Y, -this.MaxSpeed,                  this.MaxSpeed), Mathf.Clamp(this.Rigidbody.Body.LinearVelocity.Z, -this.MaxSpeed,                  this.MaxSpeed));     }      public void PreStep(float step)     {       for (int index = 0; index &lt; this.Wheels.Length; ++index)       {         if (this.Wheels[index] != null)           this.Wheels[index].PreStep(step);       }     }      public void PostStep(float step)     {       for (int index = 0; index &lt; this.Wheels.Length; ++index)       {         if (this.Wheels[index] != null)           this.Wheels[index].PostStep(step);       }     }   } <\/code><\/pre>\n<p>  \u041a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0432\u0438\u0434\u0435\u0442\u044c \u0438\u0437 \u043c\u0435\u0442\u043e\u0434\u0430 Move, \u043d\u0430\u0448\u0430 \u043c\u0430\u0448\u0438\u043d\u043a\u0430 \u043f\u043e\u043b\u043d\u043e\u043f\u0440\u0438\u0432\u043e\u0434\u043d\u0430\u044f \u0438 \u0438\u043c\u0435\u0435\u0442 \u0434\u0432\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u043e\u0441\u0438 (\u043f\u0435\u0440\u0435\u0434\u043d\u0438\u0435, \u0441\u0430\u043c\u043e \u0441\u043e\u0431\u043e\u0439). \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u043f\u0440\u0438\u0432\u043e\u0434\u0430 \u043b\u0435\u0433\u043a\u043e \u043c\u043e\u0436\u043d\u043e \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c.<br \/>  \u041a\u043e\u043b\u043b\u0438\u0437\u0438\u044f \u043a\u0443\u0437\u043e\u0432\u0430 \u043c\u0430\u0448\u0438\u043d\u043a\u0438 \u2014 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 OBB \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a, \u043d\u0443 \u0438\u043b\u0438 \u00ab\u043a\u043e\u0440\u043e\u0431\u043a\u0430\u00bb.<\/p>\n<p>  \u0410 \u0432\u043e\u0442 \u043a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435:<\/p>\n<div class=\"oembed\">\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/651d45f76f566b30a56f6ce7\" data-style=\"\" id=\"651d45f76f566b30a56f6ce7\" width=\"\"><\/div>\n<\/div>\n<p>\u041f\u043e\u043a\u0430 \u0447\u0442\u043e \u0433\u043e\u043d\u043a\u0438 \u043d\u0430 \u0443\u0442\u044e\u0433\u0430\u0445. \u041d\u043e \u0435\u0437\u0434\u0438\u0442 \u0436\u0435. :))<br \/>  \u041d\u043e \u0441 \u043a\u0435\u043c \u043c\u044b \u0433\u043e\u043d\u044f\u0435\u043c\u0441\u044f?<\/p>\n<h2><font color=\"#1c22be\">\u276f<\/font> <font color=\"#454cee\">\u0411\u043e\u0442\u044b<\/font><\/h2>\n<p>  \u042f \u043d\u0435 \u0441\u0442\u0430\u043b \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0440\u0430\u0437\u0434\u0435\u043b \u0418\u0418 \u2014 \u0431\u043e\u0442\u044b \u0432 \u0438\u0433\u0440\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u0435. \u0417\u0434\u0435\u0441\u044c \u043d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0443\u0442\u0438, \u0431\u043e\u0442\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0435\u0437\u0434\u044f\u0442 \u043f\u043e \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043e\u0442\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u043c \u0442\u043e\u0447\u043a\u0430\u043c \u043d\u0430 \u043a\u0430\u0440\u0442\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f <br \/>  <i>\u0432\u0435\u0439\u043f\u043e\u0438\u043d\u0442\u0430\u043c\u0438<\/i>. \u042d\u0442\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u0433\u043e\u043d\u043a\u0430\u0445, \u043e\u0434\u043d\u0430\u043a\u043e \u0435\u0451 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0438\u0433\u0440\u044b \u043a \u0438\u0433\u0440\u0435. \u0412\u043e\u043e\u0431\u0449\u0435, \u0434\u043b\u044f \u0433\u043e\u043d\u043e\u043a \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u0449\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u043f\u0440\u0430\u043a\u0442\u0438\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u0438\u043a\u043e\u0432:<\/p>\n<ul>\n<li> <b>\u0412\u0435\u0439\u043f\u043e\u0438\u043d\u0442\u044b \u0441 \u043f\u043e\u0438\u0441\u043a\u043e\u043c \u043f\u0443\u0442\u0435\u0439<\/b>: \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0433\u043e\u043d\u043a\u0438 \u0432 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u043c \u0433\u043e\u0440\u043e\u0434\u0435, \u0433\u0434\u0435 \u0431\u043e\u0442\u044b \u0441\u0430\u043c\u0438 \u0441\u043c\u043e\u0433\u0443\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u043f\u0443\u0442\u044c \u043a \u0447\u0435\u043a\u043f\u043e\u0438\u043d\u0442\u0430\u043c. \u041f\u043e\u0434\u043e\u0431\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0433\u043e\u043d\u043e\u043a \u0432 GTA, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440. \u0421\u0442\u0440\u043e\u0433\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u0441\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435 \u043f\u043e\u0438\u0441\u043a \u043f\u0443\u0442\u0435\u0439 \u2014 \u044d\u0442\u043e \u0442\u043e\u0436\u0435 \u043d\u0430\u0431\u043e\u0440 \u0447\u0435\u043a\u043f\u043e\u0438\u043d\u0442\u043e\u0432 \u0438 \u043f\u0440\u0435\u0433\u0440\u0430\u0434, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 (\u043f\u0443\u0442\u0438 \u0434\u043b\u044f \u0442\u0440\u0430\u0444\u0438\u043a\u0430, \u0441\u0432\u0435\u0442\u043e\u0444\u043e\u0440\u044b \u0438 \u0442. \u043f).<\/li>\n<li> <b>\u0412\u0440\u0443\u0447\u043d\u0443\u044e \u0440\u0430\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b\u0435 \u0432\u0435\u0439\u043f\u043e\u0438\u043d\u0442\u044b<\/b>: \u043a\u043b\u0430\u0441\u0441\u0438\u043a\u0430. \u041b\u0435\u0432\u0435\u043b\u0434\u0438\u0437\u0430\u0439\u043d\u0435\u0440 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0440\u0430\u0441\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u0435\u0439\u043f\u043e\u0438\u043d\u0442\u044b \u0438 \u0437\u0430\u0434\u0430\u0435\u0442 \u0438\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b: \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430 \u044d\u0442\u043e\u043c \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0438\u0442\u043e\u0440\u043c\u043e\u0437\u0438\u0442\u044c, \u0430 \u043d\u0430 \u044d\u0442\u043e\u0439 \u043f\u0440\u044f\u043c\u043e\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0434\u0430\u0442\u044c \u0433\u0430\u0437\u043a\u0443.<\/li>\n<li> <b>\u0417\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u043f\u0443\u0442\u0438<\/b>: \u0441\u043f\u043e\u0441\u043e\u0431 \u0441 \u0432\u0435\u0439\u043f\u043e\u0438\u043d\u0442\u0430\u043c\u0438, \u0433\u0434\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0430\u043c\u0438 \u043a\u0430\u0442\u0430\u044e\u0442\u0441\u044f \u043f\u043e \u0442\u0440\u0430\u0441\u0441\u0435, \u0441\u0442\u0430\u0440\u0430\u044f\u0441\u044c \u0432\u044b\u0431\u0438\u0442\u044c \u043b\u0443\u0447\u0448\u0435\u0435 \u0432\u0440\u0435\u043c\u044f, \u0430 \u0437\u0430\u0442\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0432\u0435\u0439\u043f\u043e\u0438\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u0438\u043a\u043e\u0432.<\/li>\n<\/ul>\n<p>  \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043d\u0435 \u0441\u0442\u0435\u0441\u043d\u044f\u044e\u0442\u0441\u044f \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0445 \u0444\u0435\u0439\u043a\u043e\u0432: \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0440\u0435\u0430\u043b\u0438\u0441\u0442\u0438\u0447\u043d\u043e\u0433\u043e \u0432\u0445\u043e\u0434\u0430 \u0432 \u043f\u043e\u0432\u043e\u0440\u043e\u0442 \u0441 \u043a\u0440\u0443\u0442\u043e\u0439 \u0444\u0438\u0437\u0438\u043a\u043e\u0439 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u043e\u0439, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043a\u043e\u0433\u0434\u0430 \u0431\u043e\u0442\u044b \u00ab\u0442\u0443\u043f\u044b\u0435\u00bb, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u0433\u0440\u0430\u0445 \u0431\u043e\u0442\u0430\u043c \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e \u043f\u043e\u0434\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u043b\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u043e\u0441\u0442\u044c \u0438\u043b\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c. \u041f\u043e\u043c\u043d\u0438\u0442\u0435, \u043a\u0430\u043a \u0431\u044b\u0441\u0442\u0440\u043e \u043d\u0430\u0433\u043e\u043d\u044f\u043b\u0438 \u0441\u043e\u043f\u0435\u0440\u043d\u0438\u043a\u0438 \u0432 NFS Underground? \u0412\u043e\u0442 \u0442\u043e-\u0442\u043e \u0436\u0435. \ud83d\ude42<\/p>\n<div class=\"oembed\">\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/651d4d052fbe8876a6177c9d\" data-style=\"\" id=\"651d4d052fbe8876a6177c9d\" width=\"\"><\/div>\n<\/div>\n<p>\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0432\u043e\u043e\u0431\u0449\u0435 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0444\u0435\u0439\u043a\u043e\u0432\u044b\u0439 \u0442\u0440\u0435\u043a, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u0430\u0448\u0438\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043a\u043e\u043b\u044c\u0437\u0438\u0442\u044c, \u0431\u0435\u0437 \u0443\u0447\u0435\u0442\u0430 \u0444\u0438\u0437\u0438\u043a\u0438 \u0430\u0432\u0442\u043e. \u041d\u043e \u00ab\u0431\u0435\u0441\u043f\u0430\u043b\u0435\u0432\u043d\u044b\u0435\u00bb \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u044d\u0442\u043e\u0433\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u044f \u043f\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u0435\u043b.<br \/>  \u041f\u043e \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u043c\u0443 \u00ab\u0442\u0440\u0443\u0448\u043d\u044b\u0439\u00bb \u0441\u043f\u043e\u0441\u043e\u0431 \u2014 \u044d\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u0438\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0432\u0441\u0451 \u0442\u0435 \u0436\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0438\u0433\u0440\u043e\u043a \u2014 \u0442. \u0435. \u0442\u0430\u043a\u0436\u0435 \u00ab\u043d\u0430\u0436\u0438\u043c\u0430\u044e\u0442\u00bb \u043d\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442 \u043e\u0441\u044f\u043c\u0438 \u0430\u0432\u0442\u043e\u043c\u043e\u0431\u0438\u043b\u044f. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0447\u0430\u0441\u0442\u0435\u043d\u044c\u043a\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0441\u043e\u043f\u0435\u0440\u043d\u0438\u043a\u0443 \u043f\u043e\u0434\u043c\u0435\u0448\u0438\u0432\u0430\u044e\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0444\u0430\u043a\u0442\u043e\u0440, \u043a\u0443\u0434\u0430 \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0435\u0445\u0430\u0442\u044c \u2014 \u0438\u043d\u0430\u0447\u0435 \u043c\u0430\u0448\u0438\u043d\u043a\u0438 \u0431\u0443\u0434\u0443\u0442 \u0442\u043e\u043b\u043f\u0438\u0442\u044c\u0441\u044f \u0434\u0440\u0443\u0433 \u0437\u0430 \u0434\u0440\u0443\u0433\u043e\u043c \u0438 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043d\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e.<br \/>  \u042f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0432\u0435\u0439\u043f\u043e\u0438\u043d\u0442\u044b \u0441 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430\u043c\u0438.<\/p>\n<div class=\"oembed\">\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/651d4f516f566b30a56f72b9\" data-style=\"\" id=\"651d4f516f566b30a56f72b9\" width=\"\"><\/div>\n<\/div>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0443\u0433\u043e\u043b \u043c\u0435\u0436\u0434\u0443 \u043c\u0430\u0448\u0438\u043d\u043a\u043e\u0439 \u0438\u0433\u0440\u043e\u043a\u0430 \u0438 \u0432\u0435\u0439\u043f\u043e\u0438\u043d\u0442\u043e\u043c. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0432\u0435\u0439\u043f\u043e\u0438\u043d\u0442\u0430 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043c\u0430\u0448\u0438\u043d\u043a\u0438 \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u0435\u0451 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 (\u0442. \u0435. \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435\u0451 \u0438 \u0435\u0451 Forward-\u0432\u0435\u043a\u0442\u043e\u0440\u0430). \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u043e\u0432\u043e\u0440\u043e\u0442 \u0430\u0432\u0442\u043e\u043c\u043e\u0431\u0438\u043b\u044f \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0432 \u043a\u0432\u0430\u0442\u0435\u0440\u043d\u0438\u043e\u043d\u0430\u0445, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043c\u043d\u043e\u0436\u0438\u0442\u044c \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u043d\u0430 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043c\u0430\u0448\u0438\u043d\u043a\u0438 \u0432 \u043c\u0438\u0440\u0435 \u0438 \u0443\u043c\u043d\u043e\u0436\u0438\u0442\u044c \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u0435\u0439\u043f\u043e\u0438\u043d\u0442\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0443\u044e \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u043c\u0430\u0442\u0440\u0438\u0446\u0443. \u0417\u0432\u0443\u0447\u0438\u0442 \u0441\u043b\u043e\u0436\u043d\u043e, \u043d\u0430 \u0434\u0435\u043b\u0435 \u043b\u0435\u0433\u043a\u043e:<\/p>\n<pre><code class=\"cs\"> private Vector3 WorldToLocalSpace(Vector3 worldPoint)     {       Matrix transform = Matrix.Invert(Matrix.RotationQuaternion(Rigidbody.Rotation) * Matrix.Translation(Rigidbody.Position));       Vector4 vector4 = Vector4.Transform(new Vector4(worldPoint, 1f), transform);       return new Vector3(vector4.X, vector4.Y, vector4.Z);     } <\/code><\/pre>\n<p>  \u0415\u0441\u043b\u0438 \u043e\u0447\u0435\u043d\u044c \u0443\u0441\u043b\u043e\u0432\u043d\u043e, \u0442\u043e \u044d\u0442\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e a \u2014 b \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u043b\u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0432\u0435\u0439\u043f\u043e\u0438\u043d\u0442\u0430, \u043d\u0430\u043c \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0443\u0433\u043e\u043b \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e atan2 \u0438 \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u0440\u0430\u0434\u0438\u0430\u043d\u044b \u0432 \u0433\u0440\u0430\u0434\u0443\u0441\u044b:<\/p>\n<pre><code class=\"cs\">private float AngleBetween(Vector3 v1)     {       return (float) Math.Atan2((double) v1.X, (double) v1.Z) * 57.29578f;     }<\/code><\/pre>\n<p>  \u041f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043b\u043e\u0433\u0438\u043a\u0430 \u0431\u043e\u0442\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cs\"> RaceManager race = this.race;       if (race.Waypoints.Count &lt; 1)         return;       Vector3 worldPoint = race.Waypoints[this.CurrentWaypoint].Position + this.MixFactor;       Vector3 position = this.Rigidbody.Position;       if ((double) Vector3.Distance(this.Rigidbody.Position, worldPoint) &lt; 15.0)       {         ++this.CurrentWaypoint;         this.MixFactor = new Random().NextFloat(-4.5f, 4.5f);         if (this.CurrentWaypoint == race.Waypoints.Count)         {           if (!race.IsRaceEnded)             race.IsAIComeFirst = true;           this.CurrentWaypoint = 0;         }         Console.WriteLine(\"Reached waypoint\");       }       float gas = 1f;       if (race.Waypoints[this.CurrentWaypoint].Flags.HasFlag((Enum) WaypointFlags.SlowDown))         gas = 0.45f;       this.wv = this.WorldToLocalSpace(worldPoint);       float val = this.AngleBetween(-this.WorldToLocalSpace(worldPoint));       this.Move(gas, Mathf.Clamp(val, -1f, 1f)); <\/code><\/pre>\n<p>  \u041b\u0435\u0433\u043a\u043e \u0438 \u043f\u0440\u043e\u0441\u0442\u043e, \u0434\u0430?<\/p>\n<h2><font color=\"#1c22be\">\u276f<\/font> <font color=\"#454cee\">\u0413\u0430\u0440\u0430\u0436 \u0438 \u0433\u043e\u043d\u043a\u0438<\/font><\/h2>\n<p>  \u041a\u0430\u043a\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441 \u0432 \u0433\u043e\u043d\u043a\u0430\u0445 \u0431\u0435\u0437\u2026 \u0433\u043e\u043d\u043e\u043a? \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0443 \u043c\u0435\u043d\u044f \u043d\u0435 \u0431\u044b\u043b\u043e \u043e\u0441\u043e\u0431\u043e \u0430\u0441\u0441\u0435\u0442\u043e\u0432 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u0433\u043e\u0440\u043e\u0434\u0430, \u044f \u0440\u0435\u0448\u0438\u043b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u043d\u0443\u044e \u043c\u0435\u0441\u0442\u043d\u043e\u0441\u0442\u044c. \u0410 \u043d\u0430 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u043d\u043e\u0439 \u043c\u0435\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043a\u0430\u043a \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u044b\u0435 \u0433\u043e\u043d\u043a\u0438, \u0442\u0430\u043a \u0438 \u0441\u043f\u0440\u0438\u043d\u0442 \u2014 \u043e\u0442 \u0442\u043e\u0447\u043a\u0438 \u0434\u043e \u0442\u043e\u0447\u043a\u0438.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/post_images\/2ae\/d46\/5de\/2aed465ded9f2b6a5cd8f53de34d4ce6.jpg\" alt=\"image\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/2ae\/d46\/5de\/2aed465ded9f2b6a5cd8f53de34d4ce6.jpg\" data-blurred=\"true\"\/><\/p>\n<p>  \u041f\u043e\u043c\u0438\u043c\u043e \u044d\u0442\u043e\u0433\u043e, \u0432 \u0438\u0433\u0440\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0433\u0430\u0440\u0430\u0436, \u0433\u0434\u0435 \u0438\u0433\u0440\u043e\u043a \u043c\u043e\u0433 \u0431\u044b \u043a\u0443\u043f\u0438\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u043c\u0430\u0448\u0438\u043d\u0443 \u0438\u043b\u0438 \u0442\u044e\u043d\u0438\u043d\u0433\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0443\u044e. \u0412 \u043d\u0430\u0447\u0430\u043b\u0435 \u0438\u0433\u0440\u044b \u0432\u044b\u0434\u0430\u0432\u0430\u043b\u0430\u0441\u044c \u0431\u044b \u0441\u0442\u0430\u0440\u0430\u044f \u0434\u0435\u0434\u043e\u0432\u0430 \u043a\u043e\u043f\u0435\u0439\u043a\u0430 (\u043c\u043e\u0434\u0435\u043b\u044c\u043a\u0438 \u041e\u043a\u0438 \u043d\u0435 \u043d\u0430\u0448\u0435\u043b), \u0430 \u0442\u043e \u0438 \u041c\u043e\u0441\u043a\u0432\u0438\u0447, \u0430 \u043f\u043e\u0442\u043e\u043c \u0438\u0433\u0440\u043e\u043a \u0432\u044b\u0438\u0433\u0440\u044b\u0432\u0430\u043b \u0431\u044b \u0432 \u0433\u043e\u043d\u043a\u0430\u0445 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u043b \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u043e \u043f\u0440\u043e\u043a\u0430\u0447\u043a\u0435 \u0442\u0430\u0447\u0435\u043a \u0438 \u043f\u043e\u043a\u0443\u043f\u043a\u0435 \u043d\u043e\u0432\u044b\u0445. \u042d\u044d\u044d\u0445, \u043b\u0430\u0432\u0440\u044b Lada Racing Club \u043d\u0435 \u0434\u0430\u043b\u0438 \u043f\u043e\u043a\u043e\u044f!<\/p>\n<p>  \u041d\u0430\u0447\u0430\u043b \u044f \u0441 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0433\u0430\u0440\u0430\u0436\u0430. \u0421\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435 \u0433\u0430\u0440\u0430\u0436 \u2014 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0432\u043e\u0438\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u043c, \u0442\u0430\u043a\u0436\u0435 \u0432 \u0433\u0430\u0440\u0430\u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u044b\u0439 \u043f\u0435\u0440\u0432\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0439 UI \u0432 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0435 \u2014 \u043c\u0435\u043d\u044e \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u0430\u043c\u0438. \u0421\u0430\u043c \u0433\u0430\u0440\u0430\u0436 \u043f\u043e\u0434\u0435\u043b\u0435\u043d \u043d\u0430 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0434\u043c\u0435\u043d\u044e: \u0442\u044e\u043d\u0438\u043d\u0433, \u0433\u043e\u043d\u043a\u0438 \u0438 \u0430\u0432\u0442\u043e\u0441\u0430\u043b\u043e\u043d.<\/p>\n<pre><code class=\"cs\">this.uiColor = new Color4(0.5f, 0.5f, 1f, 1f);       this.uiRaces = new UIMenu();       for (int index = 0; index &lt; 3; ++index)       {         RaceParameters p = this.GenerateRace();         this.uiRaces.AddItem(p.Name, (Action) (() => this.game.StartRace(p)), this.uiColor);       }       this.uiUpgrades = new UIMenu[7];       for (int index1 = 0; index1 &lt; this.uiUpgrades.Length; ++index1)       {         this.uiUpgrades[index1] = new UIMenu();         for (int index2 = 0; index2 &lt; this.playerCar.CarInfo.Parts.Count; ++index2)         {           if (this.playerCar.CarInfo.Parts[index2].Class == index1)           {             string text = string.Format(\"{0} - {1}\u0440\u0443\u0431.\", (object) this.playerCar.CarInfo.Parts[index2].Name, (object) this.playerCar.CarInfo.Parts[index2].Price);             int partId = index2;             this.uiUpgrades[index1].AddItem(text, (Action) (() => this.OnPurchasePart(partId)), this.uiColor);           }         }         this.uiUpgrades[index1].AddItem(\"\u0412\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f\", (Action) (() => this.currMenu = this.uiUpgrade), this.uiColor);       }       this.uiPaintBooth = new UIMenu();       this.uiUpgrade = new UIMenu();       this.uiUpgrade.AddItem(\"\u0411\u043b\u043e\u043a \u0446\u0438\u043b\u0438\u043d\u0434\u0440\u043e\u0432\", (Action) (() => this.currMenu = this.uiUpgrades[0]), this.uiColor);       this.uiUpgrade.AddItem(\"\u0422\u043e\u043f\u043b\u0438\u0432\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430\", (Action) (() => this.currMenu = this.uiUpgrades[1]), this.uiColor);       this.uiUpgrade.AddItem(\"\u0412\u0430\u043b\u044b\", (Action) (() => this.currMenu = this.uiUpgrades[2]), this.uiColor);       this.uiUpgrade.AddItem(\"\u0417\u0430\u0436\u0438\u0433\u0430\u043d\u0438\u0435\", (Action) (() => this.currMenu = this.uiUpgrades[3]), this.uiColor);       this.uiUpgrade.AddItem(\"\u0422\u0443\u0440\u0431\u043e\u043d\u0430\u0434\u0434\u0443\u0432\", (Action) (() => this.currMenu = this.uiUpgrades[4]), this.uiColor);       this.uiUpgrade.AddItem(\"\u0422\u0440\u0430\u043d\u0441\u043c\u0438\u0441\u0441\u0438\u044f\", (Action) (() => this.currMenu = this.uiUpgrades[5]), this.uiColor);       this.uiUpgrade.AddItem(\"\u0428\u0438\u043d\u044b\", (Action) (() => this.currMenu = this.uiUpgrades[6]), this.uiColor);       this.uiUpgrade.AddItem(\"\u0412\u044b\u0441\u043e\u0442\u0430 \u043f\u0440\u0443\u0436\u0438\u043d\", (Action) (() => { }), this.uiColor);       this.uiUpgrade.AddItem(\"\u041f\u043e\u043a\u0440\u0430\u0441\u043a\u0430\", (Action) (() => this.currentState = GarageState.PaintBooth), this.uiColor);       this.uiUpgrade.AddItem(\"\u0412\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f\", (Action) (() => this.currMenu = this.uiMain), this.uiColor);       this.InitCarDealer();       this.uiMain = new UIMenu();       this.uiMain.AddItem(\"\u0421\u043e\u0431\u044b\u0442\u0438\u044f\", (Action) (() => this.currMenu = this.uiRaces), this.uiColor);       this.uiMain.AddItem(\"\u0422\u044e\u043d\u0438\u043d\u0433\", (Action) (() => this.currMenu = this.uiUpgrade), this.uiColor);       this.uiMain.AddItem(\"\u0410\u0432\u0442\u043e\u0441\u0430\u043b\u043e\u043d\", (Action) (() =>       {         this.currMenu = this.uiCarDealer;         this.playerCar.Destroy();         this.playerCar = (Car) null;       }), this.uiColor);       this.uiMain.AddItem(\"\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430\", (Action) (() => { }), this.uiColor);       this.uiMain.AddItem(\"\u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u043c\u0435\u043d\u044e\", (Action) (() => { }), this.uiColor);       this.currMenu = this.uiMain;<\/code><\/pre>\n<p>  \u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0441 \u0433\u0430\u0440\u0430\u0436\u043e\u043c, \u0431\u044b\u043b\u0430 \u043f\u0440\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0442\u044e\u043d\u044f\u0447\u0435\u043a \u2014 \u043e\u043d\u0438 \u0442\u043e\u0436\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u043b\u0438\u0441\u044c \u0432 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0445 \u0444\u0430\u0439\u043b\u0430\u0445 \u0438 \u0442\u0430\u043a \u0438\u043b\u0438 \u0438\u043d\u0430\u0447\u0435 \u0432\u043b\u0438\u044f\u043b\u0438 \u043d\u0430 \u0445\u043e\u0434\u043e\u0432\u044b\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u043c\u0430\u0448\u0438\u043d\u044b. \u041f\u0440\u0430\u0432\u0434\u0430, \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0442\u044e\u043d\u0438\u043d\u0433\u0430 \u043d\u0435 \u0431\u044b\u043b\u043e \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0430 \u2014 \u043d\u0435\u043a\u043e\u043c\u0443 \u043c\u043e\u0434\u0435\u043b\u043b\u0438\u0442\u044c \u0430\u043f\u0433\u0440\u0435\u0439\u0434\u044b. \ud83d\ude41<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/591\/b94\/407\/591b944072f06a07f69b5a789945686f.png\" alt=\"image\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/591\/b94\/407\/591b944072f06a07f69b5a789945686f.png\"\/><\/p>\n<p>  \u0421\u0430\u043c\u0438 \u0433\u043e\u043d\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043d\u0430\u0447\u0430\u0442\u044c, \u043e\u0431\u0440\u0430\u0442\u0438\u0432\u0448\u0438\u0441\u044c \u043a RaceManager \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 RaceParameters:<\/p>\n<pre><code class=\"cs\">public struct RaceParameters   {     public string Name;     public string Mode;     public int NumOpponents;     public int Difficulty;     public int Prize;     public int ProgressAffection;   }<\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e, \u0438\u0433\u0440\u0430 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u043b\u0430 \u0443\u0440\u043e\u0432\u0435\u043d\u044c, \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0430 \u0431\u043e\u0442\u043e\u0432 \u043d\u0430 \u043c\u0435\u0441\u0442\u0435 spawnPoint (\u0438\u0433\u0440\u043e\u043a \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0441\u044f, \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e, \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c) \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u0430 \u0433\u043e\u043d\u043a\u0443. <\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/f85\/ec4\/a51\/f85ec4a51b9bbc93269b0c5f9dea3b2f.png\" alt=\"image\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/f85\/ec4\/a51\/f85ec4a51b9bbc93269b0c5f9dea3b2f.png\"\/><\/p>\n<pre><code class=\"cs\">public void Begin(RaceParameters param)     {       this.Parameters = param;       this.Cars = new Car[8];       this.game.track.Load(param.Name);       foreach (PhysicsEntity entity in this.game.track.FindEntities(\"waypoint\", true))       {         Prop prop = (Prop) entity;         this.Waypoints.Add(new Waypoint()         {           Position = entity.Rigidbody.Position,           Flags = (WaypointFlags) prop.Flags         });       }       PhysicsEntity playerStart = this.FindPlayerStart();       if (playerStart == null)         Game.Current.Log.Print(\"Warning: No player start!\");       this.Cars[0] = new Car(this.game, this.game.PlayerProfile.Car.Name, false);       this.Cars[0].Rigidbody.Position = playerStart.Rigidbody.Position;       this.Cars[0].Rigidbody.Rotation = playerStart.Rigidbody.Rotation;       PhysicsEntity[] entities = this.game.track.FindEntities(\"startMark\");       string[] carList = Car.GetCarList();       this.carPositions = new int[entities.Length + 1];       for (int index = 0; index &lt; entities.Length; ++index)       {         this.carPositions[index] = index + 1;         this.Cars[index + 1] = (Car) new AICar(this.game, this, carList[new Random(DateTime.Now.Millisecond).Next(0, carList.Length - 1)], false);         this.Cars[index + 1].SetColor(Car.Colors[new Random(DateTime.Now.Millisecond + index).Next(0, Car.Colors.Length - 2)]);         this.Cars[index + 1].Rigidbody.Position = entities[index].Rigidbody.Position;         this.Cars[index + 1].Rigidbody.Rotation = entities[index].Rigidbody.Rotation;         this.Cars[index + 1].PlayerName = RaceManager.Names[index];       }       this.isPlayerCarControllable = true;     }<\/code><\/pre>\n<p>  \u0410 \u0437\u0430\u0442\u0435\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u0430\u0434\u0440 \u043f\u0440\u043e\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043b\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0430 \u0433\u043e\u043d\u043a\u0438:<\/p>\n<pre><code class=\"cs\">private void CalculateCarPlaces()     {       Array.Sort&lt;int>(this.carPositions, (Comparison&lt;int>) ((a, b) =>       {         int index;         if (this.Cars[a] is AICar)           index = ((AICar) this.Cars[a]).CurrentWaypoint;         else           index = this.CurrentCheckpoint;         int num1;         if (this.Cars[b] is AICar)           num1 = ((AICar) this.Cars[b]).CurrentWaypoint;         else           num1 = this.CurrentCheckpoint;         float num2 = Vector3.Distance(this.Cars[a].Rigidbody.Position, this.Waypoints[index].Position);         float num3 = Vector3.Distance(this.Cars[b].Rigidbody.Position, this.Waypoints[index].Position);         if (index > num1)           return 1;         if (index &lt; num1)           return -1;         if ((double) num2 > (double) num3)           return 1;         if ((double) num2 &lt; (double) num3)           return -1;         return 0;       }));     }<\/code><\/pre>\n<p>  \u0412\u0441\u0451! \u041b\u043e\u0433\u0438\u043a\u043e\u0439 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u0438 \u0432\u0441\u0435\u043c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c \u0437\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u043b\u0438 \u0443\u0436\u0435 \u0431\u043e\u0442\u044b. \u0425\u043e\u0442\u044f, \u0442\u0430\u043c \u0438 \u0431\u044b\u043b \u043a\u043e\u0441\u0442\u044b\u043b\u044c \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0445 \u044d\u0442\u0430\u043f\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043c\u0435\u0447\u0430\u0435\u0442 \u0444\u043b\u0430\u0433 \u043a\u043e\u043d\u0446\u0430 \u0433\u043e\u043d\u043a\u0438, \u0432 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u043c \u2014 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0433\u043e\u043d\u043e\u0447\u0435\u043a \u0440\u0430\u0431\u043e\u0447\u0438\u0439. \ud83d\ude42<\/p>\n<p>  \u0412\u043e\u0442 \u043c\u044b \u0438 \u0434\u043e\u0448\u043b\u0438 \u0434\u043e \u044d\u0442\u0430\u043f\u0430, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u0430\u044f, \u043d\u043e \u0440\u0430\u0431\u043e\u0447\u0430\u044f \u0434\u0435\u043c\u043a\u0430 \u0438\u0433\u0440\u044b \u0443 \u043d\u0430\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c! \u0418\u0433\u0440\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043d\u0430 GF4, \u043e\u0434\u043d\u0430\u043a\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u2014 \u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0451 \u043f\u043e\u0434 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u044b \u0442\u0435\u0445 \u043b\u0435\u0442 \u043d\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u0442 \u0442\u0440\u0443\u0434\u0430 (\u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u2014 \u043f\u0435\u0440\u0435\u0436\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b, \u0443\u0431\u0440\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0435\u0445\u043d\u0438\u043a\u0438 \u043d\u0430 \u043a\u043e\u043c\u0431\u0430\u0439\u043d\u0435\u0440\u0430\u0445 \u0438 \u0437\u0430\u043f\u0435\u0447\u044c \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0440\u043e\u043f\u044b \u0432 \u0431\u0430\u0442\u0447\u0438).<\/p>\n<h2><font color=\"#1c22be\">\u276f<\/font> <font color=\"#454cee\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/font><\/h2>\n<p>  \u0412\u043e\u0442 \u0442\u0430\u043a \u044f \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0433\u043e\u043d\u043e\u0447\u043a\u0438 \u0437\u0430 \u043d\u0435\u0434\u0435\u043b\u044e. \u0412\u0440\u0435\u043c\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0435\u043c\u043a\u0438 \u0441 \u043d\u0443\u043b\u044f \u0434\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u044b \u0432\u0438\u0434\u0438\u0442\u0435 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u2014 \u0432\u0441\u0435\u0433\u043e \u043d\u0435\u0434\u0435\u043b\u044e. \u0414\u0430, \u0437\u0430 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u0433\u043e\u043d\u043e\u0447\u043d\u043e\u0439 \u0438\u0433\u0440\u044b. \u0418 \u044f \u0432\u0435\u0434\u044c \u0437\u043d\u0430\u044e, \u0447\u0442\u043e \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445 \u0438\u0433\u0440\u0443 \u0431\u0443\u0434\u0443\u0442 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0441 Lada Racing Club \u0438 \u0448\u0443\u0442\u0438\u0442\u044c \u043e \u0441\u0440\u043e\u043a\u0430\u0445 \u0435\u0451 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u2014 \u0432\u0435\u0434\u044c \u0432 \u044d\u0442\u043e\u043c \u0438 \u0441\u0443\u0442\u044c! \u0421\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u0430\u043b\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u0438\u043a\u043e\u043b\u044c\u043d\u044b\u0445 \u043b\u0430\u043c\u043f\u043e\u0432\u044b\u0445 \u0433\u043e\u043d\u043e\u0447\u0435\u043a \u043d\u0430 \u0436\u0438\u0433\u0443\u043b\u044f\u0445. \u0412\u043e\u0442 \u0447\u0442\u043e \u0443 \u043c\u0435\u043d\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0432 \u0438\u0442\u043e\u0433\u0435:<\/p>\n<div class=\"oembed\">\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/651d54f8962d8d30c121302e\" data-style=\"\" id=\"651d54f8962d8d30c121302e\" width=\"\"><\/div>\n<\/div>\n<p>  \u0418\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u043c\u0438 \u0438\u0433\u0440\u044b \u044f \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435 \u043f\u043e\u0434\u0435\u043b\u044e\u0441\u044c: \u0442\u044b\u043a \u043d\u0430 GitHub.<br \/>  \u0410 \u0432\u043e\u0442 \u043b\u0438\u043d\u043a\u0438 \u043d\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0434\u0435\u043c\u043a\u0438:<\/p>\n<p>  <a href=\"https:\/\/disk.yandex.ru\/d\/6znB5UdBq3XqRA\">\u0413\u043e\u043d\u043e\u0447\u043a\u0438<\/a><\/p>\n<p>  <a href=\"https:\/\/disk.yandex.ru\/d\/m2yemH3wx04NfQ\">\u0428\u0443\u0442\u0430\u043d<\/a><\/p>\n<p>  \u041d\u0443 \u0430 \u0434\u043b\u044f \u043c\u0435\u043d\u044f \u044d\u0442\u043e \u0431\u044b\u043b \u0441\u0432\u043e\u0435\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0439 \u0447\u0435\u043b\u043b\u0435\u043d\u0434\u0436. \u0418 \u044f \u0435\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b \u2014 \u0443 \u043c\u0435\u043d\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u0440\u0430\u0431\u043e\u0447\u0430\u044f \u0434\u0435\u043c\u043a\u0430 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435! \u042f \u0432\u0438\u0436\u0443 \u0447\u0442\u043e \u0432\u0430\u043c, \u043c\u043e\u0438\u043c \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f\u043c, \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430 \u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0430 \u0441\u0430\u043c\u043e\u043f\u0430\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438\u0433\u0440. \u0421\u0443\u0434\u044f \u043f\u043e \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u043c, \u0432\u0430\u043c \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0430 \u0433\u0435\u0439\u043c\u0434\u0435\u0432\u0430, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0438\u043a\u0438 \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438\u0433\u0440. \u0422\u0435\u043c\u043e\u0439 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 \u043c\u043e\u0436\u0435\u0442 \u0441\u0442\u0430\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u0435\u043b\u0435\u0439 \u043a\u043e\u043d\u0446\u0430 90\u0445, \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u0438\u0445 API (\u0431\u0435\u0437 D3D) \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 3D-\u0438\u0433\u0440\u044b \u0434\u043b\u044f 3dfx Voodoo \u0441 \u043d\u0443\u043b\u044f, \u043d\u0430 \u0431\u0430\u0437\u0435 Glide!<\/p>\n<p>  \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u043c API \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0433\u043e \u043c\u043d\u043e\u0433\u0438\u043c \u00ab3D \u0434\u0435\u043a\u0441\u0435\u043b\u0435\u0440\u0430\u0442\u043e\u0440\u0430\u00bb S3 Virge. \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430 \u043b\u0438 \u0432\u0430\u043c \u0442\u0430\u043a\u0430\u044f \u0440\u0443\u0431\u0440\u0438\u043a\u0430? \u041f\u0438\u0448\u0438\u0442\u0435 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445!<\/p>\n<hr\/>\n<p>  <\/p>\n<h4><font color=\"#454cee\">\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0437\u0430\u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0438 \u044d\u0442\u043e:<\/font><\/p>\n<ul>\n<li>\u27a4 <a href=\"https:\/\/habr.com\/ru\/companies\/timeweb\/articles\/754588\/\">\u0421\u0430\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u043b, \u0441\u0430\u043c \u043f\u043e\u0438\u0433\u0440\u0430\u043b: \u043a\u0430\u043a \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b 2D-\u0438\u0433\u0440\u0443 \u0434\u043b\u044f Android \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0441 \u043d\u0443\u043b\u044f, \u0432\u0435\u0441\u043e\u043c \u043c\u0435\u043d\u0435\u0435 1\u043c\u0431?<\/a><\/li>\n<li>\u27a4 <a href=\"https:\/\/habr.com\/ru\/companies\/timeweb\/articles\/751606\/\">\u041f\u0435\u0440\u0435\u0434\u0435\u043b\u044b\u0432\u0430\u0435\u043c \u043d\u0430\u0441\u0442\u0435\u043d\u043d\u043e\u0435 \u0437\u0435\u0440\u043a\u0430\u043b\u043e \u0432\u043e \u043c\u043d\u043e\u0433\u043e\u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e<\/a><\/li>\n<li>\u27a4 <a href=\"https:\/\/habr.com\/ru\/companies\/timeweb\/articles\/760800\/\">\u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u043c\u0435\u0441\u0442\u043e \u0440\u0435\u043c\u0430\u0441\u0442\u0435\u0440\u0438\u043d\u0433\u0430. \u041a\u0430\u043a \u0441\u043f\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0440\u044b\u0435 \u041f\u041a-\u0438\u0433\u0440\u044b \u043d\u0430 \u043d\u043e\u0432\u043e\u0439 \u041e\u0421<\/a><\/li>\n<li>\u27a4<a href=\"https:\/\/habr.com\/ru\/companies\/timeweb\/articles\/751604\/\"> \u0418\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u044b, \u043d\u043e \u043c\u044b \u043d\u0435 \u0441\u0434\u0430\u0434\u0438\u043c\u0441\u044f: \u041f\u0438\u0448\u0435\u043c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0435 GUI-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u0434 No-Name \u0441\u043c\u0430\u0440\u0442\u0444\u043e\u043d \u0431\u0435\u0437 Android<\/a><\/li>\n<li>\u27a4 <a href=\"https:\/\/habr.com\/ru\/companies\/timeweb\/articles\/764232\/\">\u041a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0430\u0441\u044c System Shock<\/a><\/li>\n<\/ul>\n<p>  <a href=\"https:\/\/timeweb.cloud\/vds-vps?utm_source=habr&amp;utm_medium=banner&amp;utm_campaign\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/b5\/pj\/of\/b5pjofdoxth14ro-rjsrn7sbmiy.png\" data-src=\"https:\/\/habrastorage.org\/webt\/b5\/pj\/of\/b5pjofdoxth14ro-rjsrn7sbmiy.png\"\/><\/a><\/h4>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><\/p>\n<div class=\"tm-article-poll-container\"><!--[--><\/p>\n<div class=\"tm-article-poll tm-article-poll_variant-bordered\">\n<div class=\"tm-notice tm-notice_positive tm-article-poll__notice\"><!----><\/p>\n<div class=\"tm-notice__inner\"><!----><\/p>\n<div class=\"tm-notice__content\" data-test-id=\"notice-content\"><!--[--><span>\u0422\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u043c\u043e\u0433\u0443\u0442 \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432 \u043e\u043f\u0440\u043e\u0441\u0435. <a rel=\"nofollow\" href=\"\/kek\/v1\/auth\/habrahabr\/?back=\/ru\/companies\/timeweb\/articles\/764526\/&#038;hl=ru\">\u0412\u043e\u0439\u0434\u0438\u0442\u0435<\/a>, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430.<\/span><!--]--><\/div>\n<\/div>\n<\/div>\n<p><!--[--><\/p>\n<div class=\"tm-article-poll__header\">\u0425\u0430\u0431\u0440\u0430\u0442\u043e\u0440\u043d\u043e?<\/div>\n<div class=\"tm-article-poll__answers\"><!--[--><\/p>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent tm-article-poll__answer-percent_winning\">83.27% <\/span><span class=\"tm-article-poll__answer-label\">\u0423\u0443\u0443\u0445, \u0445\u0430\u0431\u0440\u0430\u0442\u043e\u0440\u043d\u043e!!! \u041a\u0430\u043a \u043d\u0430 \u0441\u0442\u0430\u0440\u044b\u0439 \u0425\u0430\u0431\u0440 \u043f\u043e\u043f\u0430\u043b.<\/span><span class=\"tm-article-poll__answer-votes\">219<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress tm-article-poll__answer-progress_winning\" style=\"width: 83.27%\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">12.55% <\/span><span class=\"tm-article-poll__answer-label\">\u041f\u043e\u0447\u0442\u0438 \u0445\u0430\u0431\u0440\u0430\u0442\u043e\u0440\u043d\u043e. \u041d\u0443\u0436\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0445\u0430\u0431\u0440\u0430\u0442\u043e\u0440\u043d\u043e\u0441\u0442\u0438.<\/span><span class=\"tm-article-poll__answer-votes\">33<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width: 12.55%\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">4.18% <\/span><span class=\"tm-article-poll__answer-label\">\u041d\u0435\u0442, \u0438 \u0431\u043b\u0438\u0437\u043a\u043e \u043d\u0435 \u0445\u0430\u0431\u0440\u0430\u0442\u043e\u0440\u043d\u043e!!!<\/span><span class=\"tm-article-poll__answer-votes\">11<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width: 4.18%\"><\/div>\n<\/div>\n<\/div>\n<p><!--]--><\/div>\n<div class=\"tm-article-poll__stats\"> \u041f\u0440\u043e\u0433\u043e\u043b\u043e\u0441\u043e\u0432\u0430\u043b\u0438 263 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.    \u0412\u043e\u0437\u0434\u0435\u0440\u0436\u0430\u043b\u0438\u0441\u044c 76 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439. <\/div>\n<p><!--]--><\/div>\n<div class=\"tm-article-poll tm-article-poll_variant-bordered\">\n<div class=\"tm-notice tm-notice_positive tm-article-poll__notice\"><!----><\/p>\n<div class=\"tm-notice__inner\"><!----><\/p>\n<div class=\"tm-notice__content\" data-test-id=\"notice-content\"><!--[--><span>\u0422\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u043c\u043e\u0433\u0443\u0442 \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432 \u043e\u043f\u0440\u043e\u0441\u0435. <a rel=\"nofollow\" href=\"\/kek\/v1\/auth\/habrahabr\/?back=\/ru\/companies\/timeweb\/articles\/764526\/&#038;hl=ru\">\u0412\u043e\u0439\u0434\u0438\u0442\u0435<\/a>, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430.<\/span><!--]--><\/div>\n<\/div>\n<\/div>\n<p><!--[--><\/p>\n<div class=\"tm-article-poll__header\">\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430 \u043b\u0438 \u0432\u0430\u043c \u0440\u0443\u0431\u0440\u0438\u043a\u0430 \u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0438\u0433\u0440 \u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0433\u0440\u0430\u0444\u0438\u043a\u0438?<\/div>\n<div class=\"tm-article-poll__answers\"><!--[--><\/p>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent tm-article-poll__answer-percent_winning\">96.46% <\/span><span class=\"tm-article-poll__answer-label\">\u0414\u0430! \u0421 \u0443\u0434\u043e\u0432\u043e\u043b\u044c\u0441\u0442\u0432\u0438\u0435\u043c \u043f\u043e\u0447\u0438\u0442\u0430\u044e!<\/span><span class=\"tm-article-poll__answer-votes\">245<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress tm-article-poll__answer-progress_winning\" style=\"width: 96.46%\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">3.54% <\/span><span class=\"tm-article-poll__answer-label\">\u041d\u0435\u0442. \u041d\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430 \u0441\u043e\u0432\u0441\u0435\u043c.<\/span><span class=\"tm-article-poll__answer-votes\">9<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width: 3.54%\"><\/div>\n<\/div>\n<\/div>\n<p><!--]--><\/div>\n<div class=\"tm-article-poll__stats\"> \u041f\u0440\u043e\u0433\u043e\u043b\u043e\u0441\u043e\u0432\u0430\u043b\u0438 254 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.    \u0412\u043e\u0437\u0434\u0435\u0440\u0436\u0430\u043b\u0438\u0441\u044c 59 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439. <\/div>\n<p><!--]--><\/div>\n<p><!--]--><\/div>\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:\/\/habr.com\/ru\/articles\/764526\/\"> https:\/\/habr.com\/ru\/articles\/764526\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/vz\/cw\/ag\/vzcwagsxhxidoafivthxxwegds8.png\" alt=\"image\" data-src=\"https:\/\/habrastorage.org\/webt\/vz\/cw\/ag\/vzcwagsxhxidoafivthxxwegds8.png\"\/><\/p>\n<p>  \u0421\u0442\u0430\u0442\u044c\u0438 \u043f\u0440\u043e \u0438\u043d\u0434\u0438-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0438\u0433\u0440 \u2014 \u044d\u0442\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e. \u041d\u043e \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u0440\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0438\u0433\u0440 \u0441 \u043d\u0443\u043b\u044f, \u0431\u0435\u0437 \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u0438\u0433\u0440\u043e\u0432\u044b\u0445 \u0434\u0432\u0438\u0436\u043a\u043e\u0432 \u2014 \u0435\u0449\u0451 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435! \u0423 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0444\u0435\u0442\u0438\u0448, \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0438\u0433\u0440\u0430\u0431\u0435\u043b\u044c\u043d\u044b\u0445 3D-\u0434\u0435\u043c\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0431\u044b \u0434\u0430\u0436\u0435 \u043d\u0430 \u0436\u0435\u043b\u0435\u0437\u0435 20-\u043b\u0435\u0442\u043d\u0435\u0439 \u0434\u0430\u0432\u043d\u043e\u0441\u0442\u0438. \u041f\u043e\u043b\u0442\u043e\u0440\u0430 \u0433\u043e\u0434\u0430 \u043d\u0430\u0437\u0430\u0434, \u0432 \u043c\u0430\u0435 2022 \u0433\u043e\u0434\u0430, \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0434\u0435\u043c\u043a\u0443 \u0433\u043e\u043d\u043e\u0447\u043d\u043e\u0439 \u0438\u0433\u0440\u044b \u0441 \u043e\u0447\u0435\u043d\u044c \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u043c \u0432\u0441\u0435\u043c \u043d\u0430\u043c \u0441\u0435\u0442\u0442\u0438\u043d\u0433\u043e\u043c \u2014 \u0436\u0438\u0433\u0443\u043b\u0438, \u0434\u0435\u0432\u044f\u0442\u043a\u0438, \u0434\u0435\u0441\u044f\u0442\u043a\u0438, \u0438 \u0432\u0441\u0451 \u044d\u0442\u043e \u0434\u0430\u0436\u0435 \u0441 \u0442\u044e\u043d\u0438\u043d\u0433\u043e\u043c! \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0432\u0430\u043c \u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 3D-\u0438\u0433\u0440 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441 \u043d\u0443\u043b\u044f: \u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440, \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u0438 \u0433\u0440\u0430\u0444 \u0441\u0446\u0435\u043d\u044b, 3D-\u0437\u0432\u0443\u043a, \u0432\u0432\u043e\u0434 \u0438 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u043a\u0430. \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0439\u0448\u0430\u044f \u0445\u0430\u0431\u0440\u043e\u0442\u043e\u0440\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0438\u0433\u0440\u044b \u0441 \u043d\u0443\u043b\u044f? \u0422\u043e\u0433\u0434\u0430 \u0434\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c!<\/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-356315","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/356315","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=356315"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/356315\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=356315"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=356315"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=356315"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}