{"id":310276,"date":"2020-09-21T21:00:31","date_gmt":"2020-09-21T21:00:31","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=310276"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=310276","title":{"rendered":"\u041e\u0441\u043d\u043e\u0432\u044b \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u043e\u0439 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438. \u041d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e 3D-\u0440\u0435\u043d\u0434\u0435\u0440\u0430"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/520090\/\">\u041f\u0440\u0438\u0432\u0435\u0442 \u043c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0414\u0430\u0432\u0438\u0434, \u0430 \u0432\u043e\u0442 \u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043f\u0435\u0440\u0441\u043e\u043d\u043e\u0439 \u043e\u0442\u0440\u0435\u043d\u0434\u0435\u0440\u0435\u043d\u043d\u044b\u0439 \u0441\u0432\u043e\u0438\u043c \u0441\u0430\u043c\u043e\u043f\u0438\u0441\u043d\u044b\u043c \u0440\u0435\u043d\u0434\u0435\u0440\u043e\u043c:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/5_\/lt\/wr\/5_ltwrycacudb2ueka_kmvulmve.png\" alt=\"image\" \/><\/div>\n<p>  \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e \u044f \u043d\u0435 \u0441\u043c\u043e\u0433 \u043d\u0430\u0439\u0442\u0438 \u0431\u043e\u043b\u0435\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e <i>\u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u0443\u044e<\/i> \u043c\u043e\u0434\u0435\u043b\u044c, \u043d\u043e \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u0432\u044b\u0440\u0430\u0436\u0430\u044e \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u043c\u043e\u0440\u0441\u043a\u043e\u043c\u0443 \u0441\u043a\u0443\u043b\u044c\u043f\u0442\u043e\u0440\u0443 \u0437\u0430\u043f\u0435\u0447\u0430\u0442\u043b\u0435\u0432\u0448\u0435\u043c\u0443 \u043c\u0435\u043d\u044f \u0432 \u0446\u0438\u0444\u0440\u0435! \u0418 \u043a\u0430\u043a \u0432\u044b \u0443\u0436\u0435 \u0434\u043e\u0433\u0430\u0434\u0430\u043b\u0438\u0441\u044c, \u0440\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0435\u0442 \u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 CPU \u2014 \u0440\u0435\u043d\u0434\u0435\u0440\u0430.<br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<h1>\u0418\u0434\u0435\u044f<\/h1>\n<p>  \u0421 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435\u043c \u0448\u0435\u0439\u0434\u0435\u0440\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435\u043c \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u0435\u0439 GPU \u0432\u0441\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u043b\u044e\u0434\u0435\u0439 \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0433\u0440\u0430\u0444\u0438\u043a\u0438. \u041f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u043d\u043e\u0432\u044b\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <b>Ray marching<\/b> \u0441\u043e \u0441\u0442\u0440\u0435\u043c\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0440\u043e\u0441\u0442\u043e\u043c \u0441\u0432\u043e\u0435\u0439 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u0438. <\/p>\n<p>  \u0412 \u043f\u0440\u0435\u0434\u0434\u0432\u0435\u0440\u0438\u0438 \u0432\u044b\u0445\u043e\u0434\u0430 \u043d\u043e\u0432\u043e\u0433\u043e \u043c\u043e\u043d\u0441\u0442\u0440\u0430 \u043e\u0442 NVidia \u044f \u0440\u0435\u0448\u0438\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u044e (\u043b\u0430\u043c\u043f\u043e\u0432\u0443\u044e \u0438 \u043e\u043b\u0434\u0441\u043a\u0443\u043b\u044c\u043d\u0443\u044e) \u0441\u0442\u0430\u0442\u044c\u044e \u043f\u0440\u043e \u043e\u0441\u043d\u043e\u0432\u044b \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u043d\u0430 CPU. \u041e\u043d\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c \u043c\u043e\u0435\u0433\u043e \u043b\u0438\u0447\u043d\u043e\u0433\u043e \u043e\u043f\u044b\u0442\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0430, \u0438 \u0432 \u043d\u0435\u0439 \u044f \u043f\u043e\u043f\u044b\u0442\u0430\u044e\u0441\u044c \u0434\u043e\u0432\u0435\u0441\u0442\u0438 \u043f\u043e\u043d\u044f\u0442\u0438\u044f \u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u044f \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043a\u043e\u0434\u0438\u043d\u0433\u0430. \u0421\u0442\u043e\u0438\u0442 \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u0444\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u0435\u0441\u044c\u043c\u0430 \u043d\u0438\u0437\u043a\u0430\u044f \u0432 \u0441\u0438\u043b\u0443 \u043d\u0435\u043f\u0440\u0438\u0433\u043e\u0434\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447. <\/p>\n<p>  \u0412\u044b\u0431\u043e\u0440 \u044f\u0437\u044b\u043a\u0430 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043f\u0430\u0434\u0430\u043b \u043d\u0430 <b>c++<\/b> \u0438\u043b\u0438 <b>rust<\/b>, \u043d\u043e \u044f \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0441\u044f \u043d\u0430 <b>c#<\/b> \u0438\u0437-\u0437\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u0438 \u0448\u0438\u0440\u043e\u043a\u0438\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0434\u043b\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438. \u0418\u0442\u043e\u0433\u043e\u0432\u044b\u043c \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u043c \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u043d\u0434\u0435\u0440, \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b\u0439 \u0432\u044b\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/l2\/sa\/sw\/l2saswgysqplxg7jjjbxzr7glws.png\" alt=\"image\" \/><\/div>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/fj\/in\/cj\/fjincjpuwa2dyuabemn469vvvxw.png\" alt=\"image\" \/><\/div>\n<p>  <i>\u0412\u0441\u0435 \u043c\u043e\u0434\u0435\u043b\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043c\u043d\u043e\u0439 \u0437\u0434\u0435\u0441\u044c, \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u0435, \u043d\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u0439\u0442\u0435\u0441\u044c \u043f\u0438\u0440\u0430\u0442\u0441\u0442\u0432\u043e\u043c \u0438 \u0443\u0432\u0430\u0436\u0430\u0439\u0442\u0435 \u0442\u0440\u0443\u0434 \u0445\u0443\u0434\u043e\u0436\u043d\u0438\u043a\u043e\u0432!<\/i><\/p>\n<h2>\u041c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0430<\/h2>\n<p>  \u0421\u0430\u043c\u043e \u0441\u043e\u0431\u043e\u0439 \u043a\u0443\u0434\u0430 \u0436\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u043d\u0434\u0435\u0440\u044b \u0431\u0435\u0437 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0438\u0445 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u0441\u043d\u043e\u0432. \u0412 \u044d\u0442\u043e\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u044f \u0438\u0437\u043b\u043e\u0436\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0432 \u043a\u043e\u0434\u0435. \u0422\u0435\u043c \u043a\u0442\u043e \u043d\u0435 \u0443\u0432\u0435\u0440\u0435\u043d \u0432 \u0441\u0432\u043e\u0438\u0445 \u0437\u043d\u0430\u043d\u0438\u044f\u0445 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u0440\u0430\u0437\u0434\u0435\u043b \u043d\u0435 \u0441\u043e\u0432\u0435\u0442\u0443\u044e, \u0431\u0435\u0437 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u043e\u0441\u043d\u043e\u0432 \u0442\u0440\u0443\u0434\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043d\u044f\u0442\u044c \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u0438\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u0422\u0430\u043a \u0436\u0435 \u044f \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u044e, \u0447\u0442\u043e \u0442\u043e\u0442 \u043a\u0442\u043e \u0440\u0435\u0448\u0438\u043b \u0438\u0437\u0443\u0447\u0430\u0442\u044c <i>computation geometry<\/i> \u0431\u0443\u0434\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0437\u043d\u0430\u043d\u0438\u044f \u0432 \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0439 \u0430\u043b\u0433\u0435\u0431\u0440\u0435, \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438, \u0430 \u0442\u0430\u043a \u0436\u0435 \u0442\u0440\u0438\u0433\u043e\u043d\u043e\u043c\u0435\u0442\u0440\u0438\u0438(\u0443\u0433\u043b\u044b, \u0432\u0435\u043a\u0442\u043e\u0440\u0430, \u043c\u0430\u0442\u0440\u0438\u0446\u044b, \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435). \u0414\u043b\u044f \u0442\u0435\u0445 \u043a\u0442\u043e \u0445\u043e\u0447\u0435\u0442 \u043f\u043e\u043d\u044f\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044e \u0433\u043b\u0443\u0431\u0436\u0435, \u043c\u043e\u0433\u0443 \u043f\u043e\u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u0442\u044c \u043a\u043d\u0438\u0433\u0443 \u0415. \u041d\u0438\u043a\u0443\u043b\u0438\u043d\u0430 <i>\u00ab\u041a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u0430\u044f \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f \u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0439 \u0433\u0440\u0430\u0444\u0438\u043a\u0438\u00bb<\/i>. <\/p>\n<h3>\u041f\u043e\u0432\u043e\u0440\u043e\u0442\u044b \u0432\u0435\u043a\u0442\u043e\u0440\u0430. \u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430<\/h3>\n<p>  \u041f\u043e\u0432\u043e\u0440\u043e\u0442 \u2014 \u044d\u0442\u043e \u043e\u0434\u043d\u043e \u0438\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0445 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430. \u0422\u0430\u043a \u0436\u0435 \u043e\u043d\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0435\u0449\u0435 \u0438 \u043e\u0440\u0442\u043e\u0433\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u043c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c, \u0442\u0430\u043a \u043a\u0430\u043a \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0434\u043b\u0438\u043d\u044b \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432. \u0412 \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u0432\u0430 \u0442\u0438\u043f\u0430 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u043e\u0432:<\/p>\n<ul>\n<li>\u041f\u043e\u0432\u043e\u0440\u043e\u0442 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430\u0447\u0430\u043b\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442<\/li>\n<li>\u041f\u043e\u0432\u043e\u0440\u043e\u0442 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0442\u043e\u0447\u043a\u0438<\/li>\n<\/ul>\n<p>  \u0417\u0434\u0435\u0441\u044c \u044f \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u044e \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u0442\u0438\u043f, \u0442.\u043a. \u0432\u0442\u043e\u0440\u043e\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u044b\u043c \u043e\u0442 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0438 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u0441\u043c\u0435\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f (\u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u043c\u044b \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0434\u0430\u043b\u0435\u0435).<\/p>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u044b\u0432\u0435\u0434\u0435\u043c \u0444\u043e\u0440\u043c\u0443\u043b\u044b \u0434\u043b\u044f \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0432 \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435. \u041e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u2014 <b>{x, y}<\/b>. \u041a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043d\u043e\u0432\u043e\u0433\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u0430, \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u043e\u0433\u043e \u043d\u0430 \u0443\u0433\u043e\u043b<b> f<\/b>, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u043c \u043a\u0430\u043a <b>{x\u2019 y\u2019}<\/b>.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/my\/4j\/20\/my4j20nyvpn0pyjem3pyqzfyab8.png\" alt=\"image\" \/><\/div>\n<p>  \u041c\u044b \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u0434\u043b\u0438\u043d\u0430 \u0443 \u044d\u0442\u0438\u0445 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u043e\u0431\u0449\u0430\u044f \u0438 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043d\u044f\u0442\u0438\u044f \u043a\u043e\u0441\u0438\u043d\u0443\u0441\u0430 \u0438 \u0441\u0438\u043d\u0443\u0441\u0430 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u044c \u044d\u0442\u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0447\u0435\u0440\u0435\u0437 \u0434\u043b\u0438\u043d\u0443 \u0438 \u0443\u0433\u043e\u043b \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0441\u0438 <b>OX<\/b>:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ld\/cf\/6d\/ldcf6ddkmi17i1wbux09bgus-2w.png\" alt=\"image\" \/><\/div>\n<p>  \u0417\u0430\u043c\u0435\u0442\u044c\u0442\u0435, \u0447\u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u043e\u0440\u043c\u0443\u043b\u044b \u043a\u043e\u0441\u0438\u043d\u0443\u0441\u0430 \u0438 \u0441\u0438\u043d\u0443\u0441\u0430 \u0441\u0443\u043c\u043c\u044b \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u043b\u043e\u0436\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f <b>x&#8217;<\/b> \u0438 <b>y&#8217;<\/b>. \u0414\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u043f\u043e\u0434\u0437\u0430\u0431\u044b\u043b \u044f \u043d\u0430\u043f\u043e\u043c\u043d\u044e \u044d\u0442\u0438 \u0444\u043e\u0440\u043c\u0443\u043b\u044b:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ix\/h4\/-h\/ixh4-hemvnaqb7kvbutilllduoc.png\" alt=\"image\" \/><\/div>\n<p>  \u0420\u0430\u0437\u043b\u043e\u0436\u0438\u0432 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u043e\u0433\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0447\u0435\u0440\u0435\u0437 \u043d\u0438\u0445 \u043f\u043e\u043b\u0443\u0447\u0438\u043c:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/mq\/iu\/fq\/mqiufqu_jnpqogmywmjqbnnrpgi.png\" alt=\"image\" \/><\/div>\n<p>  \u0417\u0434\u0435\u0441\u044c \u043d\u0435\u0442\u0440\u0443\u0434\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u0438 <b>l * cos a<\/b> \u0438<b> l * sin a<\/b> \u2013 \u044d\u0442\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u0430: <b>x = l * cos a, y = l * sin a<\/b>. \u0417\u0430\u043c\u0435\u043d\u0438\u043c \u0438\u0445 \u043d\u0430 <b>x<\/b> \u0438 <b>y<\/b>:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ca\/nt\/uu\/cantuuvihgdgta4jqu2u9ma5b7e.png\" alt=\"image\" \/><\/div>\n<p>  \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u0432\u044b\u0440\u0430\u0437\u0438\u043b\u0438 \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0438 \u0443\u0433\u043e\u043b \u0435\u0433\u043e \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430. \u0412 \u0432\u0438\u0434\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u044d\u0442\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/tz\/fy\/ip\/tzfyipdmxdbpnra7qp5qju-ghci.png\" alt=\"image\" \/><\/div>\n<p>  \u0423\u043c\u043d\u043e\u0436\u044c\u0442\u0435 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u0447\u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u0435\u043d \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043c\u044b \u0432\u044b\u0432\u0435\u043b\u0438.<\/p>\n<h3>\u041f\u043e\u0432\u043e\u0440\u043e\u0442 \u0432 \u0442\u0440\u0435\u0445\u043c\u0435\u0440\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435<\/h3>\n<p>  \u041c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u043f\u043e\u0432\u043e\u0440\u043e\u0442 \u0432 \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435, \u0430 \u0442\u0430\u043a \u0436\u0435 \u0432\u044b\u0432\u0435\u043b\u0438 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0434\u043b\u044f \u043d\u0435\u0433\u043e. \u0422\u0435\u043f\u0435\u0440\u044c \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0432\u043e\u043f\u0440\u043e\u0441, \u0430 \u043a\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u0442\u0440\u0435\u0445 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0439? \u0412 \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u0432\u0440\u0430\u0449\u0430\u043b\u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u043d\u0430 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438, \u0437\u0434\u0435\u0441\u044c \u0436\u0435 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0435\u0439 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c. \u041e\u0434\u043d\u0430\u043a\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0442\u0440\u0438 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u0430 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0439, \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u043f\u043e\u0432\u043e\u0440\u043e\u0442 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0432 \u0442\u0440\u0435\u0445\u043c\u0435\u0440\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u2014 \u044d\u0442\u043e <b>XY<\/b>, <b>XZ<\/b>, <b>YZ<\/b> \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f. <\/p>\n<p>  <b>XY<\/b> \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435.<\/p>\n<p>  \u041f\u0440\u0438 \u0442\u0430\u043a\u043e\u043c \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0435 \u043c\u044b \u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0432\u0435\u043a\u0442\u043e\u0440 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0441\u0438 <b>OZ<\/b> \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435, \u0447\u0442\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u2014 \u044d\u0442\u043e \u0432\u0435\u0440\u0442\u043e\u043b\u0451\u0442\u043d\u044b\u0435 \u043b\u043e\u043f\u0430\u0441\u0442\u0438, \u0430 \u043e\u0441\u044c <b>OZ<\/b> \u2014 \u044d\u0442\u043e \u043c\u0430\u0447\u0442\u0430 \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043e\u043d\u0438 \u0434\u0435\u0440\u0436\u0430\u0442\u044c\u0441\u044f. \u041f\u0440\u0438 <b>XY<\/b> \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0441\u0438 <b>OZ<\/b>, \u043a\u0430\u043a \u043b\u043e\u043f\u0430\u0441\u0442\u0438 \u0432\u0435\u0440\u0442\u043e\u043b\u0435\u0442\u0430 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u0430\u0447\u0442\u044b.<\/p>\n<div style=\"text-align:center;\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/wn\/1g\/b8\/wn1gb8aile_1huh262_6klw2xpq.png\" alt=\"image\" width=\"256\" height=\"256\" \/><\/div>\n<p>  \u0417\u0430\u043c\u0435\u0442\u044c\u0442\u0435, \u0447\u0442\u043e \u043f\u0440\u0438 \u0442\u0430\u043a\u043e\u043c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0438 <b>z<\/b> \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u043d\u0435 \u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f, \u0430 \u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f <b>x<\/b> \u0438 <b>x<\/b> \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u2014 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044d\u0442\u043e \u0438 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <b>XY<\/b> \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435\u043c.<\/p>\n<div style=\"text-align:center;\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/4v\/du\/wt\/4vduwtjkzmdrvjdjpvojqajrtdu.png\" alt=\"image\" width=\"256\" height=\"256\" \/><\/div>\n<p>  \u041d\u0435\u0442\u0440\u0443\u0434\u043d\u043e \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0438 \u0444\u043e\u0440\u043c\u0443\u043b\u044b \u0434\u043b\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f: <b>z<\/b> \u2014 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u0436\u043d\u0435\u0439, \u0430 <b>x<\/b> \u0438 <b>y<\/b> \u0438\u0437\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u043f\u043e \u0442\u0435\u043c \u0436\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0430\u043c, \u0447\u0442\u043e \u0438 \u0432 2\u0434 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0438. <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/mp\/1m\/e2\/mp1me21i7zmfimemoov9rp-2ilm.png\" alt=\"image\" \/><\/div>\n<p>  \u0422\u043e \u0436\u0435 \u0432 \u0432\u0438\u0434\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u044b:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/rx\/f9\/ma\/rxf9maf9i57so6rgmbsnakt-wd8.png\" alt=\"image\" \/><\/div>\n<p>  \u0414\u043b\u044f <b>XZ<\/b> \u0438 <b>YZ<\/b> \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0439 \u0432\u0441\u0435 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/0l\/sa\/9l\/0lsa9luzznn79aqcx27ueytvgti.png\" alt=\"image\" \/><\/div>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/av\/qy\/nl\/avqynlc1nkksagpn7uyvckeskty.png\" alt=\"image\" \/><\/div>\n<p>  <\/p>\n<h3>\u041f\u0440\u043e\u0435\u043a\u0446\u0438\u044f<\/h3>\n<p>  \u041f\u043e\u043d\u044f\u0442\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u043c\u043e\u0436\u0435\u0442 \u0432\u0430\u0440\u044c\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442. \u041c\u043d\u043e\u0433\u0438\u0435, \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u0441\u043b\u044b\u0448\u0430\u043b\u0438 \u043f\u0440\u043e \u0442\u0430\u043a\u0438\u0435 \u043f\u043e\u043d\u044f\u0442\u0438\u044f, \u043a\u0430\u043a \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044f \u043d\u0430 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c \u0438\u043b\u0438 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044f \u043d\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u043d\u0443\u044e \u043e\u0441\u044c. <\/p>\n<p>  \u0412 \u0442\u043e\u043c \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044f \u043d\u0430 \u0432\u0435\u043a\u0442\u043e\u0440 \u2014 \u044d\u0442\u043e \u0442\u043e\u0436\u0435 \u0432\u0435\u043a\u0442\u043e\u0440. \u0415\u0433\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u2013 \u0442\u043e\u0447\u043a\u0430 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f <b>\u043f\u0435\u0440\u043f\u0435\u043d\u0434\u0438\u043a\u0443\u043b\u044f\u0440\u0430<\/b> \u043e\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u0437 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 <b>a<\/b> \u043d\u0430 <b>b<\/b> \u0441 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u043c <b>b<\/b>.<\/p>\n<div style=\"text-align:center;\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/km\/oc\/qr\/kmocqrbt6da3ezwd74x-slcxmo0.png\" alt=\"image\" width=\"256\" height=\"256\" \/><\/div>\n<p>  \u0414\u043b\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c \u0435\u0433\u043e <b>\u0434\u043b\u0438\u043d\u0443<\/b> \u0438 <b>\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435<\/b>. \u041a\u0430\u043a \u043c\u044b \u0437\u043d\u0430\u0435\u043c \u043f\u0440\u0438\u043b\u0435\u0433\u0430\u044e\u0449\u0438\u0439 \u043a\u0430\u0442\u0435\u0442 \u0438 \u0433\u0438\u043f\u043e\u0442\u0435\u043d\u0443\u0437\u0430 \u0432 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u043e\u043c \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435\u043c \u043a\u043e\u0441\u0438\u043d\u0443\u0441\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0435\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438:<\/p>\n<div style=\"text-align:center;\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/c9\/yp\/d5\/c9ypd5lnjhiukcctd367hta92mq.png\" alt=\"image\" width=\"256\" height=\"256\" \/><\/div>\n<p>  \u041d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u043f\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044e \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u043c <b>b<\/b>, \u0437\u043d\u0430\u0447\u0438\u0442 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u043e\u0440\u043c\u0443\u043b\u043e\u0439:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/lx\/0z\/os\/lx0zosshjuvwxsg5eae3d4xgtn4.png\" alt=\"image\" \/><\/div>\n<p>  \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u0432 \u0432\u0438\u0434\u0435 <b>\u0435\u0434\u0438\u043d\u0438\u0447\u043d\u043e\u0433\u043e<\/b> \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0438 \u0443\u043c\u043d\u043e\u0436\u0430\u0435\u043c \u0435\u0433\u043e \u043d\u0430 \u0434\u043b\u0438\u043d\u0443 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438. \u041d\u0435\u0441\u043b\u043e\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u043a\u0430\u043a \u0440\u0430\u0437-\u0442\u0430\u043a\u0438 \u0442\u043e, \u0447\u0442\u043e \u043c\u044b \u0438\u0449\u0435\u043c.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u0432\u0441\u0435 \u0447\u0435\u0440\u0435\u0437 <b>\u0441\u043a\u0430\u043b\u044f\u0440\u043d\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/b>:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/xi\/ml\/le\/ximlleggdlkh9xtlsgzxq3scd3y.png\" alt=\"image\" \/><\/div>\n<p>  \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0443\u0434\u043e\u0431\u043d\u0443\u044e \u0444\u043e\u0440\u043c\u0443\u043b\u0443 \u0434\u043b\u044f \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/xs\/mq\/4m\/xsmq4murin3o9tqdv7lqhr2c588.png\" alt=\"image\" \/><\/div>\n<p>  <\/p>\n<h3>\u0421\u0438\u0441\u0442\u0435\u043c\u044b \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442. \u0411\u0430\u0437\u0438\u0441\u044b<\/h3>\n<p>  \u041c\u043d\u043e\u0433\u0438\u0435 \u043f\u0440\u0438\u0432\u044b\u043a\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 <b>XYZ<\/b>, \u0432 \u043d\u0435\u0439 \u043b\u044e\u0431\u044b\u0435 2 \u043e\u0441\u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u0435\u0440\u043f\u0435\u043d\u0434\u0438\u043a\u0443\u043b\u044f\u0440\u043d\u044b \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0443, \u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u043d\u044b\u0435 \u043e\u0441\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u0432\u0438\u0434\u0435 \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u044b\u0445 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/y4\/x-\/lt\/y4x-lt0_qqq08itumxmsagcyjr8.png\" alt=\"image\" \/><\/div>\n<p>  \u041d\u0430 \u0434\u0435\u043b\u0435 \u0436\u0435 \u0441\u0438\u0441\u0442\u0435\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e, \u043a\u0430\u0436\u0434\u0430\u044f \u0438\u0437 \u043d\u0438\u0445 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f <b>\u0431\u0430\u0437\u0438\u0441\u043e\u043c<\/b>. \u0411\u0430\u0437\u0438\u0441 <b>n<\/b>-\u043c\u0435\u0440\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 <b>{v1, v2 \u2026\u2026 vn}<\/b> \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432\u0441\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0438 \u043e\u0434\u0438\u043d \u0432\u0435\u043a\u0442\u043e\u0440 \u0438\u0437 \u0431\u0430\u0437\u0438\u0441\u0430 <b>\u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c<\/b> \u0447\u0435\u0440\u0435\u0437 \u0434\u0440\u0443\u0433\u0438\u0435 \u0435\u0433\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u0430. \u041f\u043e \u0441\u0443\u0442\u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0431\u0430\u0437\u0438\u0441 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0431\u0443\u0434\u0443\u0442 \u0438\u043c\u0435\u0442\u044c \u0441\u0432\u043e\u0438, \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b.<\/p>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c, \u0447\u0442\u043e \u0438\u0437 \u0441\u0435\u0431\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0431\u0430\u0437\u0438\u0441 \u0434\u043b\u044f \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430. \u0412\u043e\u0437\u044c\u043c\u0451\u043c \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0432\u0441\u0435\u043c \u0437\u043d\u0430\u043a\u043e\u043c\u0443\u044e <b>\u0434\u0435\u043a\u0430\u0440\u0442\u043e\u0432\u0443<\/b> \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0438\u0437 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 <b>X {1, 0}<\/b>, <b>Y {0, 1}<\/b>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u0431\u0430\u0437\u0438\u0441\u043e\u0432 \u0434\u043b\u044f \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ka\/xi\/gk\/kaxigklzipgcctopgfkqywimeoe.png\" alt=\"image\" \/><\/div>\n<p>  \u041b\u044e\u0431\u043e\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 \u043d\u0430 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u0432\u0438\u0434\u0435 \u0441\u0443\u043c\u043c\u044b \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u044d\u0442\u043e\u0433\u043e \u0431\u0430\u0437\u0438\u0441\u0430 \u0441 \u043d\u0435\u043a\u0438\u043c\u0438 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430\u043c\u0438 \u0438\u043b\u0438 \u0436\u0435 \u0432 \u0432\u0438\u0434\u0435 <b>\u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0439 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0438<\/b>. \u0412\u0441\u043f\u043e\u043c\u043d\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u043b\u0430\u0435\u0442\u0435 \u043a\u043e\u0433\u0434\u0430 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u2014 \u0432\u044b \u043f\u0438\u0448\u0435\u0442\u0435 <b>x<\/b> \u2014 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443, \u0430 \u0434\u0430\u043b\u0435\u0435 \u2014 <b>y<\/b>. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432\u044b \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0435 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u044b \u0440\u0430\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u0430\u043c \u0431\u0430\u0437\u0438\u0441\u0430.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ce\/sx\/tg\/cesxtgscnfqclcr_nsa8qfjm4xw.png\" alt=\"image\" \/><\/div>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0432\u043e\u0437\u044c\u043c\u0451\u043c \u0434\u0440\u0443\u0433\u043e\u0439 \u0431\u0430\u0437\u0438\u0441:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/se\/i2\/rh\/sei2rhtdu2khdv9j5lwrsozvtmq.png\" alt=\"image\" \/><\/div>\n<p>  \u0427\u0435\u0440\u0435\u0437 \u0435\u0433\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043b\u044e\u0431\u043e\u0439 2\u0434 \u0432\u0435\u043a\u0442\u043e\u0440:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/nq\/hl\/he\/nqhlhe5r4dob8oh05hcsbjbceqw.png\" alt=\"image\" \/><\/div>\n<p>  \u0410 \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u043d\u0430\u0431\u043e\u0440 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 <b>\u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u0430\u0437\u0438\u0441\u043e\u043c<\/b> \u0434\u0432\u0443\u0445\u043c\u0435\u0440\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/kj\/bi\/oe\/kjbioewfteyswhhuxpv1hymswac.png\" alt=\"image\" \/><\/div>\n<p>  \u0412 \u043d\u0435\u043c \u0434\u0432\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 <b>{1,1}<\/b> \u0438 <b>{2,2}<\/b> \u043b\u0435\u0436\u0430\u0442 \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u043f\u0440\u044f\u043c\u043e\u0439. \u041a\u0430\u043a\u0438\u0435 \u0431\u044b \u0438\u0445 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0438 \u0432\u044b \u043d\u0435 \u0431\u0440\u0430\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0431\u0443\u0434\u0435\u0442\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u0430, \u043b\u0435\u0436\u0430\u0449\u0438\u0435 \u043d\u0430 \u043e\u0431\u0449\u0435\u0439 \u043f\u0440\u044f\u043c\u043e\u0439 <b>y = x<\/b>. \u0414\u043b\u044f \u043d\u0430\u0448\u0438\u0445 \u0446\u0435\u043b\u0435\u0439 \u0442\u0430\u043a\u0438\u0435 \u0434\u0435\u0444\u0435\u043a\u0442\u043d\u044b\u0435 \u043d\u0435 \u043f\u0440\u0438\u0433\u043e\u0434\u044f\u0442\u0441\u044f, \u043e\u0434\u043d\u0430\u043a\u043e, \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u0438\u0446\u0443, \u044f \u0441\u0447\u0438\u0442\u0430\u044e, \u0441\u0442\u043e\u0438\u0442. \u041f\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044e \u0432\u0441\u0435 \u0431\u0430\u0437\u0438\u0441\u044b \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u0442 \u043e\u0434\u043d\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u2013 \u043d\u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u0431\u0430\u0437\u0438\u0441\u0430 \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u0432\u0438\u0434\u0435 \u0441\u0443\u043c\u043c\u044b \u0434\u0440\u0443\u0433\u0438\u0445 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u0431\u0430\u0437\u0438\u0441\u0430 \u0441 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430\u043c\u0438 \u0438\u043b\u0438 \u0436\u0435 \u043d\u0438 \u043e\u0434\u0438\u043d \u0432\u0435\u043a\u0442\u043e\u0440 \u0431\u0430\u0437\u0438\u0441\u0430 <b>\u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0439 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0435\u0439 <\/b>\u0434\u0440\u0443\u0433\u0438\u0445. \u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043d\u0430\u0431\u043e\u0440\u0430 \u0438\u0437 3-\u0445 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0430\u043a \u0436\u0435 <b>\u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u0430\u0437\u0438\u0441\u043e\u043c<\/b>:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ld\/w7\/5h\/ldw75h0wsefhuakakm3hn1nduz4.png\" alt=\"image\" \/><\/div>\n<p>  \u0427\u0435\u0440\u0435\u0437 \u043d\u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u043e\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438, \u043e\u0434\u043d\u0430\u043a\u043e \u0432\u0435\u043a\u0442\u043e\u0440 <b>{1, 1}<\/b> \u0432 \u043d\u0435\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438\u0448\u043d\u0438\u043c \u0442\u0430\u043a \u043a\u0430\u043a \u0441\u0430\u043c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u044b\u0440\u0430\u0436\u0435\u043d \u0447\u0435\u0440\u0435\u0437 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 <b>{1, 0}<\/b> \u0438 <b>{0,1}<\/b> \u043a\u0430\u043a <b>{1,0} + {0,1}<\/b>. <\/p>\n<p>  \u0412\u043e\u043e\u0431\u0449\u0435 \u043b\u044e\u0431\u043e\u0439 \u0431\u0430\u0437\u0438\u0441 <b>n<\/b>-\u043c\u0435\u0440\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0440\u043e\u0432\u043d\u043e <b>n<\/b> \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432, \u0434\u043b\u044f 2\u0434 \u044d\u0442\u043e <b>n<\/b> \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0440\u0430\u0432\u043d\u043e 2.<\/p>\n<p>  \u041f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a 3\u0434. <b>\u0422\u0440\u0435\u0445\u043c\u0435\u0440\u043d\u044b\u0439 \u0431\u0430\u0437\u0438\u0441<\/b> \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0432 \u0441\u0435\u0431\u0435 3 \u0432\u0435\u043a\u0442\u043e\u0440\u0430:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/yd\/fg\/xi\/ydfgxipwwqqerpovrhpaeu9ndf8.png\" alt=\"image\" \/><\/div>\n<p>  \u0415\u0441\u043b\u0438 \u0434\u043b\u044f \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u043e\u0433\u043e \u0431\u0430\u0437\u0438\u0441\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u044b\u043b\u043e \u0434\u0432\u0443\u0445 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u043d\u0435 \u043b\u0435\u0436\u0430\u0449\u0438\u0445 \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u043f\u0440\u044f\u043c\u043e\u0439, \u0442\u043e \u0432 \u0442\u0440\u0435\u0445\u043c\u0435\u0440\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u043d\u0430\u0431\u043e\u0440 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u0431\u0430\u0437\u0438\u0441\u043e\u043c \u0435\u0441\u043b\u0438:<\/p>\n<ul>\n<li>1)2 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u043d\u0435 \u043b\u0435\u0436\u0430\u0442 \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u043f\u0440\u044f\u043c\u043e\u0439<\/li>\n<li>2)3-\u0439 \u043d\u0435 \u043b\u0435\u0436\u0438\u0442 \u043d\u0430 <b>\u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438<\/b> \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0434\u0432\u0443\u043c\u044f \u0434\u0440\u0443\u0433\u0438\u043c\u0438.<\/li>\n<\/ul>\n<p>  \u0421 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0431\u0430\u0437\u0438\u0441\u044b, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0431\u0443\u0434\u0443\u0442 <b>\u043e\u0440\u0442\u043e\u0433\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u043c\u0438<\/b> (\u043b\u044e\u0431\u044b\u0435 \u0438\u0445 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u043f\u0435\u0440\u043f\u0435\u043d\u0434\u0438\u043a\u0443\u043b\u044f\u0440\u043d\u044b) \u0438 <b>\u043d\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438<\/b> (\u0434\u043b\u0438\u043d\u0430 \u043b\u044e\u0431\u043e\u0433\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0431\u0430\u0437\u0438\u0441\u0430 \u2014 1). \u0414\u0440\u0443\u0433\u0438\u0435 \u043d\u0430\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f. \u041a \u043f\u0440\u0438\u043c\u0435\u0440\u0443 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0431\u0430\u0437\u0438\u0441<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/y4\/x-\/lt\/y4x-lt0_qqq08itumxmsagcyjr8.png\" alt=\"image\" \/><\/div>\n<p>  \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u0435\u0442 \u044d\u0442\u0438\u043c \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u044f\u043c.<\/p>\n<h3>\u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0431\u0430\u0437\u0438\u0441<\/h3>\n<p>  \u0414\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u043c\u044b \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u043b\u0438 \u0440\u0430\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u043a\u0430\u043a \u0441\u0443\u043c\u043c\u0443 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u0431\u0430\u0437\u0438\u0441\u0430 \u0441 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430\u043c\u0438:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/os\/me\/k2\/osmek2ucgd2f6-c0fzfsrseozvy.png\" alt=\"image\" \/><\/div>\n<p>  \u0421\u043d\u043e\u0432\u0430 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0431\u0430\u0437\u0438\u0441 \u2013 \u0432\u0435\u043a\u0442\u043e\u0440 <b>{1, 3, 6}<\/b> \u0432 \u043d\u0435\u043c \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043a: <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ti\/sn\/gq\/tisngqx8sgbzpxvb-giagmwmx9i.png\" alt=\"image\" \/><\/div>\n<p>  \u041a\u0430\u043a \u0432\u0438\u0434\u0438\u0442\u0435 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u044b \u0440\u0430\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0432 \u0431\u0430\u0437\u0438\u0441\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f <b>\u0435\u0433\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438 \u0432 \u044d\u0442\u043e\u043c \u0431\u0430\u0437\u0438\u0441\u0435<\/b>. \u0420\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/bx\/5r\/xo\/bx5rxoup1sekqes_tdw5vlsyagm.png\" alt=\"image\" \/><\/div>\n<p>  \u042d\u0442\u043e\u0442 \u0431\u0430\u0437\u0438\u0441 \u043f\u043e\u043b\u0443\u0447\u0435\u043d \u0438\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u043a \u043d\u0435\u043c\u0443 <b>XY<\/b> \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043d\u0430 45 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432. \u0412\u043e\u0437\u044c\u043c\u0435\u043c \u0432\u0435\u043a\u0442\u043e\u0440 <b>a<\/b> \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0438\u043c\u0435\u044e\u0449\u0438\u0439 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b <b>{0 ,1, 1}<\/b><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/vi\/xh\/yl\/vixhylx3wzsiv2ouiwz3pkooaak.png\" alt=\"image\" \/><\/div>\n<p>  \u0427\u0435\u0440\u0435\u0437 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u043d\u043e\u0432\u043e\u0433\u043e \u0431\u0430\u0437\u0438\u0441\u0430 \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u043b\u043e\u0436\u0438\u0442\u044c \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/pg\/fl\/0k\/pgfl0kbwik5fyvohusgwtjs8if4.png\" alt=\"image\" \/><\/div>\n<p>  \u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0435 \u044d\u0442\u0443 \u0441\u0443\u043c\u043c\u0443, \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 <b>{0, 1, 1}<\/b> \u2013 \u0432\u0435\u043a\u0442\u043e\u0440 <b>\u0430<\/b> \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u043c \u0431\u0430\u0437\u0438\u0441\u0435. \u0418\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u043d\u043e\u0432\u043e\u043c \u0431\u0430\u0437\u0438\u0441\u0435 \u0432\u0435\u043a\u0442\u043e\u0440 <b>\u0430<\/b> \u0438\u043c\u0435\u0435\u0442 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b <b>{0.7, 0.7, 1}<\/b> \u2013 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u044b \u0440\u0430\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u042d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u0438\u0434\u043d\u0435\u0435 \u0435\u0441\u043b\u0438 \u0432\u0437\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u0441 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0440\u0430\u043a\u0443\u0440\u0441\u0430:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/q4\/-m\/s2\/q4-ms2riixntkqbs1kvniyjj0us.png\" alt=\"image\" \/><\/div>\n<p>  \u041d\u043e \u043a\u0430\u043a \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u044d\u0442\u0438 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u044b? \u0412\u043e\u043e\u0431\u0449\u0435 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u2014 \u044d\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0445 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0439. \u041e\u0434\u043d\u0430\u043a\u043e \u043a\u0430\u043a \u044f \u0441\u043a\u0430\u0437\u0430\u043b \u0440\u0430\u043d\u0435\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e <b>\u043e\u0440\u0442\u043e\u0433\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435<\/b> \u0438 <b>\u043d\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435<\/b> \u0431\u0430\u0437\u0438\u0441\u044b, \u0430 \u0434\u043b\u044f \u043d\u0438\u0445 \u0435\u0441\u0442\u044c \u0432\u0435\u0441\u044c\u043c\u0430 \u0447\u0438\u0442\u0435\u0440\u0441\u043a\u0438\u0439 \u0441\u043f\u043e\u0441\u043e\u0431. \u0417\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u043d \u0432 \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0438 <b>\u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0439<\/b> \u043d\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0431\u0430\u0437\u0438\u0441\u0430. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441 \u0435\u0433\u043e \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0430\u0439\u0434\u0435\u043c \u0440\u0430\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 <b>a<\/b> \u0432 \u0431\u0430\u0437\u0438\u0441\u0435 <b>X{0.7, 0.7, 0} Y{-0.7, 0.7, 0} Z{0, 0, 1}<\/b><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/vi\/xh\/yl\/vixhylx3wzsiv2ouiwz3pkooaak.png\" alt=\"image\" \/><\/div>\n<p>  \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0439\u0434\u0435\u043c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0434\u043b\u044f <b>y\u2019<\/b>. \u041f\u0435\u0440\u0432\u044b\u043c \u0448\u0430\u0433\u043e\u043c \u043c\u044b \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044e \u0432\u0435\u043a\u0442\u043e\u0440\u0430 <b>a<\/b> \u043d\u0430 \u0432\u0435\u043a\u0442\u043e\u0440 <b>y\u2019<\/b> (\u043a\u0430\u043a \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u044f \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u043b \u0432\u044b\u0448\u0435):<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/vf\/3t\/sb\/vf3tsbqf0ndbipxh_grkechdij8.png\" alt=\"image\" \/><\/div>\n<p>  \u0412\u0442\u043e\u0440\u043e\u0439 \u0448\u0430\u0433: \u0434\u0435\u043b\u0438\u043c \u0434\u043b\u0438\u043d\u0443 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u043d\u0430 \u0434\u043b\u0438\u043d\u0443 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 <b>y\u2019<\/b>, \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u043c\u044b \u0443\u0437\u043d\u0430\u0435\u043c \u201c\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 y\u2019 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0432\u0435\u043a\u0442\u043e\u0440\u0435 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438\u201d \u2013 \u044d\u0442\u043e \u0447\u0438\u0441\u043b\u043e \u0438 \u0431\u0443\u0434\u0435\u0442 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u043e\u043c \u0434\u043b\u044f <b>y\u2019<\/b>, \u0430 \u0442\u0430\u043a\u0436\u0435 <b>y<\/b> \u2014 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u043e\u0439 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 <b>a<\/b> \u0432 \u043d\u043e\u0432\u043e\u043c \u0431\u0430\u0437\u0438\u0441\u0435! \u0414\u043b\u044f<b> x\u2019<\/b> \u0438 <b>z\u2019<\/b> \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u043c \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/rt\/ea\/ex\/rteaexkz5weboqacmc5knv9xvo0.png\" alt=\"image\" \/><\/div>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0438\u043c\u0435\u0435\u043c \u0444\u043e\u0440\u043c\u0443\u043b\u044b \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u0438\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e \u0431\u0430\u0437\u0438\u0441\u0430 \u0432 \u043d\u043e\u0432\u044b\u0439:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/gh\/5w\/r7\/gh5wr79vjy-wdy27yfwrupojfea.png\" alt=\"image\" \/><\/div>\n<p>  \u041d\u0443 \u0430 \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e <b>\u043d\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435<\/b> \u0431\u0430\u0437\u0438\u0441\u044b \u0438 \u0434\u043b\u0438\u043d\u044b \u0438\u0445 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u0440\u0430\u0432\u043d\u044b 1 \u043e\u0442\u043f\u0430\u0434\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430 \u0434\u043b\u0438\u043d\u0443 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0432 \u0444\u043e\u0440\u043c\u0443\u043b\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/9x\/zf\/3h\/9xzf3hmrkjxeoigegdepjfdquyc.png\" alt=\"image\" \/><\/div>\n<p>  \u0420\u0430\u0441\u043a\u0440\u043e\u0435\u043c <b>x<\/b>-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443 \u0447\u0435\u0440\u0435\u0437 \u0444\u043e\u0440\u043c\u0443\u043b\u0443 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/wv\/_n\/a_\/wv_na_bfxpb2gv6e9yc8inefbxk.png\" alt=\"image\" \/><\/div>\n<p>  \u0417\u0430\u043c\u0435\u0442\u044c\u0442\u0435, \u0447\u0442\u043e \u0437\u043d\u0430\u043c\u0435\u043d\u0430\u0442\u0435\u043b\u044c <b>(x&#8217;, x&#8217;)<\/b> \u0438 \u0432\u0435\u043a\u0442\u043e\u0440 <b>x&#8217; <\/b> \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0431\u0430\u0437\u0438\u0441\u0430 \u0442\u0430\u043a \u0436\u0435 \u0440\u0430\u0432\u0435\u043d 1 \u0438 \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u0431\u0440\u043e\u0441\u0438\u0442\u044c. \u041f\u043e\u043b\u0443\u0447\u0438\u043c:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/b9\/q3\/8s\/b9q38sbp2_w-qgfuihjr0idbizk.png\" alt=\"image\" \/><\/div>\n<p>  \u041c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 <b>x<\/b> \u0431\u0430\u0437\u0438\u0441\u0435 \u0432\u044b\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435<b> (a, x\u2019)<\/b>, \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 <b>y<\/b> \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u2013 \u043a\u0430\u043a <b>(a, y\u2019)<\/b>, \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 <b>z \u2013 (a, z\u2019)<\/b>. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c <b>\u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430<\/b> \u043a \u043d\u043e\u0432\u044b\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/mh\/2t\/8x\/mh2t8xie6ax8hdok4p3wwjftlao.png\" alt=\"image\" \/><\/div>\n<h3>\u0421\u0438\u0441\u0442\u0435\u043c\u044b \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0441\u043e \u0441\u043c\u0435\u0449\u0435\u043d\u043d\u044b\u043c \u0446\u0435\u043d\u0442\u0440\u043e\u043c<\/h3>\n<p>  \u0423 \u0432\u0441\u0435\u0445 \u0441\u0438\u0441\u0442\u0435\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0432\u044b\u0448\u0435 \u043d\u0430\u0447\u0430\u043b\u043e\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0431\u044b\u043b\u0430 \u0442\u043e\u0447\u043a\u0430<b> {0,0,0}<\/b>. \u041f\u043e\u043c\u0438\u043c\u043e \u044d\u0442\u043e\u0433\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0435\u0449\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0441\u043e \u0441\u043c\u0435\u0449\u0435\u043d\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 \u043d\u0430\u0447\u0430\u043b\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442: <\/p>\n<div style=\"text-align:center;\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/zb\/9s\/vr\/zb9svrpc8qermajppft0t8nmkrc.png\" alt=\"image\"  width=\"512\" height=\"512\"\/><\/div>\n<p>  \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u0432\u0435\u043a\u0442\u043e\u0440 \u0432 \u0442\u0430\u043a\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u044c \u0435\u0433\u043e \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u043e\u0432\u043e\u0433\u043e \u0446\u0435\u043d\u0442\u0440\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442. \u0421\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u2014 \u0432\u044b\u0447\u0435\u0441\u0442\u044c \u0438\u0437 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u044d\u0442\u043e\u0442 \u0446\u0435\u043d\u0442\u0440. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432\u044b \u043a\u0430\u043a \u0431\u044b \u00ab\u043f\u0435\u0440\u0435\u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0435\u00bb \u0441\u0430\u043c\u0443 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u043a \u043d\u043e\u0432\u043e\u043c\u0443 \u0446\u0435\u043d\u0442\u0443, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u0435\u043a\u0442\u043e\u0440 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043c\u0435\u0441\u0442\u0435. \u0414\u0430\u043b\u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u0436\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u0443\u044e \u043d\u0430\u043c \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430.<\/p>\n<h2><anchor>\u041f\u0438\u0448\u0435\u043c \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0434\u0432\u0438\u0436\u043e\u043a. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0432\u043e\u043b\u043e\u0447\u043d\u043e\u0433\u043e \u0440\u0435\u043d\u0434\u0435\u0440\u0430.<\/anchor><\/h2>\n<p>  \u041d\u0443 \u0432\u043e\u0442, \u0434\u0443\u043c\u0430\u044e \u0442\u043e\u043c\u0443 \u043a\u0442\u043e \u043f\u0440\u043e\u0448\u0435\u043b \u0440\u0430\u0437\u0434\u0435\u043b \u0441 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u043e\u0439 \u0438 \u043d\u0435 \u0437\u0430\u043a\u0440\u044b\u043b \u0441\u0442\u0430\u0442\u044c\u044e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043c\u044b\u0432\u0430\u0442\u044c \u043c\u043e\u0437\u0433\u0438 \u0431\u043e\u043b\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c\u0438 \u0432\u0435\u0449\u0430\u043c\u0438! \u0412 \u044d\u0442\u043e\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u043c\u044b \u043d\u0430\u0447\u043d\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u044b 3\u0434 \u0434\u0432\u0438\u0436\u043a\u0430 \u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430. \u0412\u043e\u043e\u0431\u0449\u0435 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 \u2014 \u044d\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439: \u043e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u044b\u0445 \u0433\u0440\u0430\u043d\u0435\u0439, \u0440\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044f, \u0440\u0430\u0441\u0447\u0435\u0442 \u0441\u0432\u0435\u0442\u0430, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432, \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432(\u0438\u043d\u043e\u0433\u0434\u0430 \u0434\u0430\u0436\u0435 \u0444\u0438\u0437\u0438\u043a\u0443). \u0412\u0441\u0435 \u044d\u0442\u043e \u043c\u044b \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c, \u0430 \u0441\u0435\u0439\u0447\u0430\u0441 \u043c\u044b \u0437\u0430\u0439\u043c\u0435\u043c\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u0432\u0435\u0449\u0430\u043c\u0438 \u2014 \u043d\u0430\u043f\u0438\u0448\u0435\u043c <b>\u043f\u0440\u043e\u0432\u043e\u043b\u043e\u0447\u043d\u044b\u0439<\/b> \u0440\u0435\u043d\u0434\u0435\u0440. \u0421\u0443\u0442\u044c \u0435\u0433\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d \u0440\u0438\u0441\u0443\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u0432 \u0432\u0438\u0434\u0435 \u043b\u0438\u043d\u0438\u0439, \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u044e\u0449\u0438\u0445 \u0435\u0433\u043e \u0432\u0435\u0440\u0448\u0438\u043d\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u043e\u0445\u043e\u0436\u0438\u043c \u043d\u0430 \u0441\u0435\u0442\u044c \u0438\u0437 \u043f\u0440\u043e\u0432\u043e\u043b\u043e\u043a:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/nb\/u3\/x8\/nbu3x8fh7-lzuoiyuc5fqdtd5l8.png\" alt=\"image\" \/><\/div>\n<h3>\u041f\u043e\u043b\u0438\u0433\u043e\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0433\u0440\u0430\u0444\u0438\u043a\u0430<\/h3>\n<p>  \u0422\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e \u0432 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u043e\u0439 \u0433\u0440\u0430\u0444\u0438\u043a\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0440\u0435\u0445\u043c\u0435\u0440\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0430\u0445 OBJ, 3DS, FBX \u0438 \u043c\u043d\u043e\u0433\u0438\u0445 \u0434\u0440\u0443\u0433\u0438\u0445. \u0412 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435 \u0442\u0430\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0435 \u0434\u0432\u0443\u0445 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432: \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0432\u0435\u0440\u0448\u0438\u043d \u0438 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0433\u0440\u0430\u043d\u0435\u0439(\u043f\u043e\u043b\u0438\u0433\u043e\u043d\u043e\u0432). \u041a\u0430\u0436\u0434\u0430\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0441\u0432\u043e\u0435\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0435\u0439 \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u2014 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u043c, \u0430 \u043a\u0430\u0436\u0434\u0430\u044f \u0433\u0440\u0430\u043d\u044c(\u043f\u043e\u043b\u0438\u0433\u043e\u043d) \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0442\u0440\u043e\u0439\u043a\u043e\u0439 \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\u0438 \u0432\u0435\u0440\u0448\u0438\u043d \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430. \u041f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b(\u043a\u0443\u0431\u044b, \u0441\u0444\u0435\u0440\u044b \u0438 \u0442.\u0434.) \u0441\u043e\u0441\u0442\u043e\u044f\u0442 \u0438\u0437 \u0442\u0430\u043a\u0438\u0445 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u043e\u0432 \u0438 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u0430\u043c\u0438. <\/p>\n<p>  \u0412 \u043d\u0430\u0448\u0435\u043c \u0434\u0432\u0438\u0436\u043a\u0435 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432 \u0431\u0443\u0434\u0435\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c \u0442\u0440\u0435\u0445\u043c\u0435\u0440\u043d\u043e\u0439 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u2014 \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0431\u0443\u0434\u0443\u0442 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u043d\u0435\u0433\u043e. \u041e\u043f\u0438\u0448\u0435\u043c \u043a\u043b\u0430\u0441\u0441 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u0430:<\/p>\n<pre><code class=\"cs\">    abstract class Primitive     {         public Vector3[] Vertices { get; protected set; }         public int[] Indexes { get; protected set; }     } <\/code><\/pre>\n<p>  \u041f\u043e\u043a\u0430 \u0432\u0441\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u2014 \u0435\u0441\u0442\u044c \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u0430 \u0438 \u0435\u0441\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0434\u043b\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u043e\u0432. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u0443\u0431:<\/p>\n<pre><code class=\"cs\">   public class Cube : Primitive       {         public Cube(Vector3 center, float sideLen)         {             var d = sideLen \/ 2;             Vertices = new Vector3[]                 {                     new Vector3(center.X - d , center.Y - d, center.Z - d) ,                     new Vector3(center.X - d , center.Y - d, center.Z) ,                     new Vector3(center.X - d , center.Y , center.Z - d) ,                     new Vector3(center.X - d , center.Y , center.Z) ,                     new Vector3(center.X + d , center.Y - d, center.Z - d) ,                     new Vector3(center.X + d , center.Y - d, center.Z) ,                     new Vector3(center.X + d , center.Y + d, center.Z - d) ,                     new Vector3(center.X + d , center.Y + d, center.Z + d) ,                 };              Indexes = new int[]                 {                     1,2,4 ,                     1,3,4 ,                     1,2,6 ,                     1,5,6 ,                     5,6,8 ,                     5,7,8 ,                     8,4,3 ,                     8,7,3 ,                     4,2,8 ,                     2,8,6 ,                     3,1,7 ,                     1,7,5                 };         }     }  int Main() {         var cube = new Cube(new Vector3(0, 0, 0), 2); } <\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/1h\/bv\/kv\/1hbvkvvkhb3dlpsgcinc8jzzfgm.jpeg\" alt=\"image\" \/><\/div>\n<p>  <\/p>\n<h3>\u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442<\/h3>\n<p>  \u041c\u0430\u043b\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u043e\u0432, \u0434\u043b\u044f \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0441\u0446\u0435\u043d \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043c\u0435\u0441\u0442\u0430\u0445, \u043f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0438\u0445, \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0442\u044c \u0438\u043b\u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0442\u044c \u0438\u0445 \u0432 \u0440\u0430\u0437\u043c\u0435\u0440\u0435. \u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u044d\u0442\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \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 <b>\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435<\/b> \u0438 <b>\u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0430\u044f<\/b> \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442. \u041a\u0430\u0436\u0434\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043d\u0430 \u0441\u0446\u0435\u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0438 \u0441\u0432\u043e\u044e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u2014 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e, \u0430 \u0442\u0430\u043a \u0436\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0442\u043e\u0447\u043a\u0443 \u0446\u0435\u043d\u0442\u0440\u0430.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/xz\/9k\/hl\/xz9khlwaj9fhmois0iaa1zbobcc.png\" alt=\"image\" \/><\/div>\n<p>  \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u0445 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043b\u0435\u0433\u043a\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c \u043b\u044e\u0431\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441 \u043d\u0438\u043c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043d\u0430 \u0432\u0435\u043a\u0442\u043e\u0440 <b>a<\/b> \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u0434\u0432\u0438\u043d\u0443\u0442\u044c <b>\u0446\u0435\u043d\u0442\u0440 \u0435\u0433\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442<\/b> \u043d\u0430 \u044d\u0442\u043e\u0442 \u0432\u0435\u043a\u0442\u043e\u0440, \u0434\u043b\u044f \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u2014 \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b. <\/p>\n<p>  \u041f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441 \u0435\u0433\u043e \u0432\u0435\u0440\u0448\u0438\u043d\u0430\u043c\u0438 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442, \u043f\u0440\u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0435 \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u044c \u0432\u0441\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0441\u0446\u0435\u043d\u044b \u0432 \u0435\u0434\u0438\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u2014 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0443\u044e. \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0432 \u043a\u043e\u0434. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 Pivot (\u0441\u0442\u0435\u0440\u0436\u0435\u043d\u044c, \u0442\u043e\u0447\u043a\u0430 \u043e\u043f\u043e\u0440\u044b) \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0431\u0430\u0437\u0438\u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438 \u0435\u0433\u043e \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u0443\u044e \u0442\u043e\u0447\u043a\u0443. \u041f\u0435\u0440\u0435\u0432\u043e\u0434 \u0442\u043e\u0447\u043a\u0438 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u0443\u044e Pivot \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432 2 \u0448\u0430\u0433\u0430:<\/p>\n<ul>\n<li>1)\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u043e\u0447\u043a\u0438 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0446\u0435\u043d\u0442\u0440\u0430 \u043d\u043e\u0432\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442<\/li>\n<li>2)\u0420\u0430\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u0430\u043c \u043d\u043e\u0432\u043e\u0433\u043e \u0431\u0430\u0437\u0438\u0441\u0430<\/li>\n<\/ul>\n<p>  \u041d\u0430\u043e\u0431\u043e\u0440\u043e\u0442 \u0436\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u0445 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u044d\u0442\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435:<\/p>\n<ul>\n<li>1)\u0420\u0430\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u0430\u043c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0431\u0430\u0437\u0438\u0441\u0430<\/li>\n<li>2)\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0446\u0435\u043d\u0442\u0440\u0430<\/li>\n<\/ul>\n<p>  \u041d\u0430\u043f\u0438\u0448\u0435\u043c \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0438\u0441\u0442\u0435\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442:<\/p>\n<pre><code class=\"cs\">    public class Pivot     {         \/\/\u0442\u043e\u0447\u043a\u0430 \u0446\u0435\u043d\u0442\u0440\u0430         public Vector3 Center { get; private set; }         \/\/\u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0431\u0430\u0437\u0438\u0441\u0430 - \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u043d\u044b\u0435 \u043e\u0441\u0438         public Vector3 XAxis { get; private set; }         public Vector3 YAxis { get; private set; }         public Vector3 ZAxis { get; private set; }          \/\/\u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b         public Matrix3x3 LocalCoordsMatrix =&gt; new Matrix3x3             (                 XAxis.X, YAxis.X, ZAxis.X,                 XAxis.Y, YAxis.Y, ZAxis.Y,                 XAxis.Z, YAxis.Z, ZAxis.Z             );          \/\/\u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b         public Matrix3x3 GlobalCoordsMatrix =&gt; new Matrix3x3             (                 XAxis.X , XAxis.Y , XAxis.Z,                 YAxis.X , YAxis.Y , YAxis.Z,                 ZAxis.X , ZAxis.Y , ZAxis.Z             );          public Vector3 ToLocalCoords(Vector3 global)         {             \/\/\u041d\u0430\u0445\u043e\u0434\u0438\u043c \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0442\u043e\u0447\u043a\u0438 \u0446\u0435\u043d\u0442\u0440\u0430 \u0438 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u043c \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c \u0431\u0430\u0437\u0438\u0441\u0435             return LocalCoordsMatrix * (global - Center);         }         public Vector3 ToGlobalCoords(Vector3 local)         {             \/\/\u0412 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0434\u0430 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442 - \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u043c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 \u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u043c \u0431\u0430\u0437\u0438\u0441\u0435 \u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0446\u0435\u043d\u0442\u0440\u0430             return (GlobalCoordsMatrix * local)  + Center;         }          public void Move(Vector3 v)         {             Center += v;         }          public void Rotate(float angle, Axis axis)         {             XAxis = XAxis.Rotate(angle, axis);             YAxis = YAxis.Rotate(angle, axis);             ZAxis = ZAxis.Rotate(angle, axis);         }     } <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0434\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f, \u043f\u0435\u0440\u0435\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"cs\">    public abstract class Primitive     {         \/\/\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0431\u0430\u0437\u0438\u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u0430         public Pivot Pivot { get; protected set; }         \/\/\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b         public Vector3[] LocalVertices { get; protected set; }         \/\/\u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b         public Vector3[] GlobalVertices { get; protected set; }         \/\/\u0418\u043d\u0434\u0435\u043a\u0441\u044b \u0432\u0435\u0440\u0448\u0438\u043d         public int[] Indexes { get; protected set; }          public void Move(Vector3 v)         {             Pivot.Move(v);              for (int i = 0; i &lt; LocalVertices.Length; i++)                 GlobalVertices[i] += v;         }          public void Rotate(float angle, Axis axis)         {             Pivot.Rotate(angle , axis);              for (int i = 0; i &lt; LocalVertices.Length; i++)                 GlobalVertices[i] = Pivot.ToGlobalCoords(LocalVertices[i]);         }          public void Scale(float k)         {             for (int i = 0; i &lt; LocalVertices.Length; i++)                 LocalVertices[i] *= k;              for (int i = 0; i &lt; LocalVertices.Length; i++)                 GlobalVertices[i] = Pivot.ToGlobalCoords(LocalVertices[i]);         }     } <\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/fe\/oh\/-w\/feoh-wgnliwkw94x2eb8i4lx6wa.gif\" alt=\"image\" \/><\/div>\n<p>  <i>\u0412\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442<\/i><\/p>\n<h3>\u0420\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u043e\u0432. \u041a\u0430\u043c\u0435\u0440\u0430<\/h3>\n<p>  \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c \u0441\u0446\u0435\u043d\u044b \u0431\u0443\u0434\u0435\u0442 \u043a\u0430\u043c\u0435\u0440\u0430 \u2014 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0435\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0431\u0443\u0434\u0443\u0442 \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435. \u041a\u0430\u043c\u0435\u0440\u0430, \u043a\u0430\u043a \u0438 \u0432\u0441\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0441\u0446\u0435\u043d\u044b, \u0431\u0443\u0434\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0432 \u0432\u0438\u0434\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 Pivot \u2014 \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0433\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0434\u0432\u0438\u0433\u0430\u0442\u044c \u0438 \u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043a\u0430\u043c\u0435\u0440\u0443:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/t_\/ji\/zr\/t_jizrix9tbtrxcstbgr3whxp9e.png\" alt=\"image\" \/><\/div>\n<p>  \u0414\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u043c\u0443\u0434\u0440\u0435\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 <b>\u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438<\/b>. \u041f\u0440\u0438\u043d\u0446\u0438\u043f \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u0441\u043d\u043e\u0432\u0430\u043d \u044d\u0442\u043e\u043c \u043c\u0435\u0442\u043e\u0434 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0447\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435 \u043e\u0442 \u043d\u0430\u0441 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d \u043e\u0431\u044a\u0435\u043a\u0442 \u0442\u0435\u043c <b>\u043c\u0435\u043d\u044c\u0448\u0435<\/b> \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f. \u041d\u0430\u0432\u0435\u0440\u043d\u043e\u0435 \u043c\u043d\u043e\u0433\u0438\u0435 \u0440\u0435\u0448\u0430\u043b\u0438 \u043a\u043e\u0433\u0434\u0430-\u0442\u043e \u0432 \u0448\u043a\u043e\u043b\u0435 \u0437\u0430\u0434\u0430\u0447\u0443 \u043f\u0440\u043e \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0435 \u0432\u044b\u0441\u043e\u0442\u044b \u0434\u0435\u0440\u0435\u0432\u0430 \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u043c\u0441\u044f \u043d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u043e\u0442 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044f:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/du\/xg\/yi\/duxgyihm5is2vldrcnwbt6dznpw.gif\" alt=\"image\" \/><\/div>\n<p>  \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435, \u0447\u0442\u043e \u043b\u0443\u0447 \u043e\u0442 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u0442\u043e\u0447\u043a\u0438 \u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u0430\u0434\u0430\u0435\u0442 \u043d\u0430 \u043d\u0435\u043a\u0443\u044e <b>\u043f\u0440\u043e\u0435\u043a\u0446\u0438\u043e\u043d\u043d\u0443\u044e \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c<\/b> \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0443\u044e\u0441\u044f \u043d\u0430 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0438 <b>C1<\/b> \u043e\u0442 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044f \u0438 \u0440\u0438\u0441\u0443\u0435\u0442 \u043d\u0430 \u043d\u0435\u0439 \u0442\u043e\u0447\u043a\u0443. \u041d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044c \u0432\u0438\u0434\u0438\u0442 \u044d\u0442\u0443 \u0442\u043e\u0447\u043a\u0443 \u0438 \u0445\u043e\u0447\u0435\u0442 \u043f\u043e \u043d\u0435\u0439 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0434\u0435\u0440\u0435\u0432\u0430. \u041a\u0430\u043a \u0432\u044b \u043c\u043e\u0433\u043b\u0438 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0430 \u0434\u0435\u0440\u0435\u0432\u0430 \u0438 \u0432\u044b\u0441\u043e\u0442\u0430 \u0442\u043e\u0447\u043a\u0438 \u043d\u0430 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435\u043c \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432. \u0422\u043e\u0433\u0434\u0430 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0442\u043e\u0447\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u044d\u0442\u043e \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/5m\/3m\/3a\/5m3m3asp2tp38fdwe2nttl1i7fu.png\" alt=\"image\" \/><\/div>\n<p>  \u041d\u0430\u043e\u0431\u043e\u0440\u043e\u0442 \u0436\u0435, \u0437\u043d\u0430\u044f \u0432\u044b\u0441\u043e\u0442\u0443 \u0434\u0435\u0440\u0435\u0432\u0430 \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0439\u0442\u0438 \u0432\u044b\u0441\u043e\u0442\u0443 \u0442\u043e\u0447\u043a\u0438 \u043d\u0430 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/fu\/ch\/va\/fuchvawtbmsgp_nxlqap6icbs6u.png\" alt=\"image\" \/><\/div>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a \u043d\u0430\u0448\u0435\u0439 \u043a\u0430\u043c\u0435\u0440\u0435. \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435, \u0447\u0442\u043e \u043a \u043e\u0441\u0438 <b>z<\/b> \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u043a\u0430\u043c\u0435\u0440\u044b \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u0430 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c \u043d\u0430 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0438 <b>z&#8217;<\/b> \u043e\u0442 \u043d\u0430\u0447\u0430\u043b\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442. \u0424\u043e\u0440\u043c\u0443\u043b\u0430 \u0442\u0430\u043a\u043e\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 <b>z = z&#8217;<\/b>, \u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u043e\u0434\u043d\u0438\u043c \u0447\u0438\u0441\u043b\u043e\u043c \u2014 <b>z&#8217;<\/b>. \u041d\u0430 \u044d\u0442\u0443 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c \u043f\u0430\u0434\u0430\u044e\u0442 \u043b\u0443\u0447\u0438 \u043e\u0442 \u0432\u0435\u0440\u0448\u0438\u043d \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u041f\u043e\u043f\u0430\u0434\u0430\u044f \u043d\u0430 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c \u043b\u0443\u0447 \u0431\u0443\u0434\u0435\u0442 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u0430 \u043d\u0435\u0439 \u0442\u043e\u0447\u043a\u0443. \u0421\u043e\u0435\u0434\u0438\u043d\u044f\u044f \u0442\u0430\u043a\u0438\u0435 \u0442\u043e\u0447\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/-v\/dv\/oe\/-vdvoenlxuocmkm9xgvftdmqmyc.png\" alt=\"image\" \/><\/div>\n<p>  \u0422\u0430\u043a\u0430\u044f \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u044d\u043a\u0440\u0430\u043d. \u041a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u0431\u0443\u0434\u0435\u043c \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u0432 2 \u044d\u0442\u0430\u043f\u0430:<\/p>\n<ul>\n<li>1)\u041f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u043c \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0432 <b>\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b<\/b> \u043a\u0430\u043c\u0435\u0440\u044b<\/li>\n<li>2)\u041d\u0430\u0445\u043e\u0434\u0438\u043c \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044e \u0442\u043e\u0447\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432<\/li>\n<\/ul>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/yr\/sp\/g_\/yrspg_t7fohghmcmw0y_xnfduvq.png\" alt=\"image\" \/><\/div>\n<p>  \u041f\u0440\u043e\u0435\u043a\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 2-\u043c\u0435\u0440\u043d\u044b\u043c \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u043c, \u0435\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b <b>x&#8217; \u0438 y&#8217;<\/b> \u0438 \u0431\u0443\u0434\u0443\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0442\u043e\u0447\u043a\u0438 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430. <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041a\u043b\u0430\u0441\u0441 \u043a\u0430\u043c\u0435\u0440\u044b 1<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">public class Camera {     \/\/\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043a\u0430\u043c\u0435\u0440\u044b     public Pivot Pivot { get; private set; }     \/\/\u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0434\u043e \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438     public float ScreenDist { get; private set; }      public Camera(Vector3 center, float screenDist)     {         Pivot = new Pivot(center);         ScreenDist = screenDist;     }     public void Move(Vector3 v)     {         Pivot.Move(v);     }     public void Rotate(float angle, Axis axis)     {         Pivot.Rotate(angle, axis);     }     public Vector2 ScreenProection(Vector3 v)     {         var local = Pivot.ToLocalCoords(v);         \/\/\u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044e         var delta = ScreenDist \/ local.Z;         var proection = new Vector2(local.X, local.Y) * delta;         return proection;     } } <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u0414\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0438\u043c\u0435\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0448\u0438\u0431\u043e\u043a, \u043e \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u0434\u0430\u043b\u0435\u0435.<\/p>\n<h4>\u041e\u0442\u0441\u0435\u043a\u0430\u0435\u043c \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u044b\u0435 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u044b<\/h4>\n<p>  \u0421\u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u0432 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u0442\u0440\u0438 \u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044e \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435. \u041d\u043e \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043a\u0430\u043c\u0435\u0440\u0430 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c <b>\u043b\u044e\u0431\u044b\u0435<\/b> \u0432\u0435\u0440\u0448\u0438\u043d\u044b, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0442\u0435, \u0447\u044c\u0438 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u0437\u0430 \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u044d\u043a\u0440\u0430\u043d\u0430, \u0435\u0441\u043b\u0438 \u043f\u043e\u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0432\u0435\u043b\u0438\u043a\u0430 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0441\u043b\u043e\u0432\u0438\u0442\u044c \u043e\u0448\u0438\u0431\u043e\u043a. \u041a\u0430\u043c\u0435\u0440\u0430 \u0442\u0430\u043a \u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u044b \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u043f\u043e\u0437\u0430\u0434\u0438 \u043d\u0435\u0435 (\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b <b>z<\/b> \u0438\u0445 \u0442\u043e\u0447\u0435\u043a \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c \u0431\u0430\u0437\u0438\u0441\u0435 \u043a\u0430\u043c\u0435\u0440\u044b \u043c\u0435\u043d\u044c\u0448\u0435 <b>z&#8217;<\/b>) \u2014 \u0442\u0430\u043a\u043e\u0435 \u00ab\u0437\u0430\u0442\u044b\u043b\u043a\u043e\u0432\u043e\u0435\u00bb \u0437\u0440\u0435\u043d\u0438\u0435 \u043d\u0430\u043c \u0442\u043e\u0436\u0435 \u043d\u0438 \u043a \u0447\u0435\u043c\u0443.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/cp\/8r\/0x\/cp8r0xiptk7bo_nalx6ci0cb-bg.png\" alt=\"image\" \/><\/div>\n<p>  \u0414\u043b\u044f \u043e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u044b\u0445 \u0432\u0435\u0440\u0448\u0438\u043d \u0432 open gl \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 \u0443\u0441\u0435\u043a\u0430\u044e\u0449\u0435\u0439 \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u044b. \u0417\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u043d \u0432 \u0437\u0430\u0434\u0430\u043d\u0438\u0438 \u0434\u0432\u0443\u0445 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0435\u0439 \u2014 <b>\u0431\u043b\u0438\u0436\u043d\u0435\u0439<\/b>(near plane) \u0438 <b>\u0434\u0430\u043b\u044c\u043d\u0435\u0439<\/b>(far plane). \u0412\u0441\u0435, \u0447\u0442\u043e \u043b\u0435\u0436\u0438\u0442 \u043c\u0435\u0436\u0434\u0443 \u044d\u0442\u0438\u043c\u0438 \u0434\u0432\u0443\u043c\u044f \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044f\u043c\u0438 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u043b\u0435\u0436\u0430\u0442\u044c \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435. \u042f \u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 \u043e\u0434\u043d\u043e\u0439 \u0443\u0441\u0435\u043a\u0430\u044e\u0449\u0435\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c\u044e \u2014 <b>z&#8217;<\/b>. \u0412\u0441\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b, \u043b\u0435\u0436\u0430\u0449\u0438\u0435 \u043f\u043e\u0437\u0430\u0434\u0438 \u043d\u0435\u0435 \u0431\u0443\u0434\u0443\u0442 \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u044b\u043c\u0438.<\/p>\n<p>  \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u043a\u0430\u043c\u0435\u0440\u0443 \u0434\u0432\u0430 \u043d\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u044f \u2014 \u0448\u0438\u0440\u0438\u043d\u0443 \u0438 \u0432\u044b\u0441\u043e\u0442\u0443 \u044d\u043a\u0440\u0430\u043d\u0430. <br \/>  \u0422\u0435\u043f\u0435\u0440\u044c \u043a\u0430\u0436\u0434\u0443\u044e \u0441\u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0442\u043e\u0447\u043a\u0443 \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043d\u0430 \u043f\u043e\u043f\u0430\u0434\u0430\u043d\u0438\u0435 \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u044d\u043a\u0440\u0430\u043d\u0430. \u0422\u0430\u043a \u0436\u0435 \u043e\u0442\u0441\u0435\u0447\u0435\u043c \u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u0437\u0430\u0434\u0438 \u043a\u0430\u043c\u0435\u0440\u044b. \u0415\u0441\u043b\u0438 \u0442\u043e\u0447\u043a\u0430 \u043b\u0435\u0436\u0438\u0442 \u0441\u0437\u0430\u0434\u0438 \u0438\u043b\u0438 \u0435\u0435 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044f \u043d\u0435 \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u0442\u043e \u043c\u0435\u0442\u043e\u0434 \u0432\u0435\u0440\u043d\u0435\u0442 \u0442\u043e\u0447\u043a\u0443 <b>{float.NaN, float.NaN}<\/b>.<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041a\u043e\u0434 \u043a\u0430\u043c\u0435\u0440\u044b 2<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">public Vector2 ScreenProection(Vector3 v) {     var local = Pivot.ToLocalCoords(v);     \/\/\u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u043c \u0442\u043e\u0447\u043a\u0438 \u0441\u0437\u0430\u0434\u0438 \u043a\u0430\u043c\u0435\u0440\u044b     if (local.Z &lt; ScreenDist)     {         return new Vector2(float.NaN, float.NaN);     }     \/\/\u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044e     var delta = ScreenDist \/ local.Z;     var proection = new Vector2(local.X, local.Y) * delta;     \/\/\u0435\u0441\u043b\u0438 \u0442\u043e\u0447\u043a\u0430 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 \u044d\u043a\u0440\u0430\u043d\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 - \u0432\u0435\u0440\u043d\u0435\u043c \u0435\u0435     if (proection.X &gt;= 0 && proection.X &lt; ScreenWidth && proection.Y &gt;= 0 && proection.Y &lt; ScreenHeight)     {         return proection;     }     return new Vector2(float.NaN, float.NaN); } <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  <\/p>\n<h4>\u041f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u043c \u0432 \u044d\u043a\u0440\u0430\u043d\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b<\/h4>\n<p>  \u0417\u0434\u0435\u0441\u044c \u044f \u0440\u0430\u0437\u044a\u044f\u0441\u043d\u044e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442. C\u0432\u044f\u0437\u0430\u043d \u043e\u043d \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u0445 \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u044d\u043a\u0440\u0430\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442, \u0432 \u0442\u0430\u043a\u0438\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u0445 \u043d\u0430\u0447\u0430\u043b\u043e \u2014 \u044d\u0442\u043e \u0432\u0435\u0440\u0445\u043d\u044f\u044f \u043b\u0435\u0432\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u044d\u043a\u0440\u0430\u043d\u0430, <b>x<\/b> \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0438 \u0432\u043f\u0440\u0430\u0432\u043e, \u0430 <b>y<\/b> \u2014 \u043f\u0440\u0438 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0438 \u0432\u043d\u0438\u0437. \u0412 \u043d\u0430\u0448\u0435\u0439 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u0442\u043e\u0447\u043a\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u0432 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 <b>\u0434\u0435\u043a\u0430\u0440\u0442\u043e\u0432\u044b\u0445<\/b> \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u0445 \u0438 \u043f\u0435\u0440\u0435\u0434 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u043e\u0439 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u044c \u044d\u0442\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0432 \u044d\u043a\u0440\u0430\u043d\u043d\u044b\u0435. \u0421\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043d\u0435\u0442\u0440\u0443\u0434\u043d\u043e, \u043d\u0443\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e <b>\u0441\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043d\u0430\u0447\u0430\u043b\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0432 \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u043b\u0435\u0432\u044b\u0439 \u0443\u0433\u043e\u043b \u0438 \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c y<\/b>:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/po\/sn\/2v\/posn2vegzurdqke4pq7dhfcy67s.png\" alt=\"image\" \/><\/div>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041a\u043e\u0434 \u043a\u0430\u043c\u0435\u0440\u044b 3<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">public Vector2 ScreenProection(Vector3 v) {     var local = Pivot.ToLocalCoords(v);     \/\/\u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u043c \u0442\u043e\u0447\u043a\u0438 \u0441\u0437\u0430\u0434\u0438 \u043a\u0430\u043c\u0435\u0440\u044b     if (local.Z &lt; ScreenDist)     {         return new Vector2(float.NaN, float.NaN);     }     \/\/\u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044e     var delta = ScreenDist \/ local.Z;     var proection = new Vector2(local.X, local.Y) * delta;     \/\/\u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u0432 \u044d\u043a\u0440\u0430\u043d\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b     var screen = proection + new Vector2(ScreenWidth \/ 2, -ScreenHeight \/ 2);     var screenCoords = new Vector2(screen.X, -screen.Y);     \/\/\u0435\u0441\u043b\u0438 \u0442\u043e\u0447\u043a\u0430 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 \u044d\u043a\u0440\u0430\u043d\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 - \u0432\u0435\u0440\u043d\u0435\u043c \u0435\u0435     if (screenCoords.X &gt;= 0 && screenCoords.X &lt; ScreenWidth && screenCoords.Y &gt;= 0 && screenCoords.Y &lt; ScreenHeight)     {         return screenCoords;     }     return new Vector2(float.NaN, float.NaN); } <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  <\/p>\n<h4>\u041a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u0443\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f<\/h4>\n<p>  \u0415\u0441\u043b\u0438 \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 \u044d\u0442\u043e\u0433\u043e:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/sq\/qe\/gq\/sqqegqrjqvzv3xzooh8qzkaeyqa.png\" alt=\"image\" \/><\/div>\n<p>  \u041f\u043e\u0447\u0435\u043c\u0443 \u2014 \u0442\u043e \u0432\u0441\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0440\u0438\u0441\u0443\u044e\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u043c\u0438. \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c \u043f\u0440\u0438\u0447\u0438\u043d\u0443 \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u0442\u0435 \u043a\u0430\u043a \u043c\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u043b\u0438 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044e \u2014 \u0443\u043c\u043d\u043e\u0436\u0430\u043b\u0438 <b>x<\/b> \u0438 <b>y<\/b> \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043d\u0430 \u0434\u0435\u043b\u044c\u0442\u0443 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f <b>z&#8217; \/ z<\/b>. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0434\u043e \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 <b>z&#8217;<\/b>. \u0410 \u0432\u0435\u0434\u044c <b>z&#8217;<\/b> \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u0434\u0430\u0442\u044c \u0441\u043a\u043e\u043b\u044c \u0443\u0433\u043e\u0434\u043d\u043e \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c. \u0417\u043d\u0430\u0447\u0438\u0442 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f <b>z&#8217;<\/b>. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u043a\u0430\u043c\u0435\u0440\u0443 \u0435\u0449\u0435 \u043e\u0434\u043d\u043e \u043f\u043e\u043b\u0435 \u2014 <b>\u0443\u0433\u043e\u043b \u0435\u0435 \u043e\u0431\u0437\u043e\u0440\u0430<\/b>.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ko\/or\/uv\/kooruvwbxdq6-2lgnxsqgtxga60.png\" alt=\"image\" \/><\/div>\n<p>  \u041e\u043d \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f <b>\u0443\u0433\u043b\u043e\u0432\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430<\/b> \u044d\u043a\u0440\u0430\u043d\u0430 \u0441 \u0435\u0433\u043e \u0448\u0438\u0440\u0438\u043d\u043e\u0439. \u0423\u0433\u043e\u043b \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0441 \u0448\u0438\u0440\u0438\u043d\u043e\u0439 \u044d\u043a\u0440\u0430\u043d\u0430 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c: <b>\u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0443\u0433\u043e\u043b<\/b> \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u043c\u043e\u0442\u0440\u0438\u0442 \u043a\u0430\u043c\u0435\u0440\u0430 \u2014 \u044d\u0442\u043e \u043b\u0435\u0432\u044b\u0439 \u0438\u043b\u0438 \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u0440\u0430\u0439 \u044d\u043a\u0440\u0430\u043d\u0430. \u0422\u043e\u0433\u0434\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0443\u0433\u043e\u043b \u043e\u0442 \u043e\u0441\u0438 <b>z<\/b> \u043a\u0430\u043c\u0435\u0440\u044b \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 <b>o \/ 2<\/b>. \u041f\u0440\u043e\u0435\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043f\u0430\u043b\u0430 \u043d\u0430 \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u0440\u0430\u0439 \u044d\u043a\u0440\u0430\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0438\u043c\u0435\u0442\u044c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443 <b>x = width \/ 2<\/b>, \u0430 \u043d\u0430 \u043b\u0435\u0432\u044b\u0439: <b>x = -width \/ 2<\/b>. \u0417\u043d\u0430\u044f \u044d\u0442\u043e \u0432\u044b\u0432\u0435\u0434\u0435\u043c \u0444\u043e\u0440\u043c\u0443\u043b\u0443 \u0434\u043b\u044f \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430 \u0440\u0430\u0441\u0442\u044f\u0436\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/vg\/d4\/ch\/vgd4chnot9iywqzyvtt4mh4v-wu.png\" alt=\"image\" \/><\/div>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041a\u043e\u0434 \u043a\u0430\u043c\u0435\u0440\u044b 4<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">public float ObserveRange { get; private set; } public float Scale =&gt; ScreenWidth \/ (float)(2 * ScreenDist * Math.Tan(ObserveRange \/ 2)); public Vector2 ScreenProection(Vector3 v) {     var local = Pivot.ToLocalCoords(v);     \/\/\u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u043c \u0442\u043e\u0447\u043a\u0438 \u0441\u0437\u0430\u0434\u0438 \u043a\u0430\u043c\u0435\u0440\u044b     if (local.Z &lt; ScreenDist)     {         return new Vector2(float.NaN, float.NaN);     }     \/\/\u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044e \u0438 \u0443\u043c\u043d\u043e\u0436\u0430\u0435\u043c \u0435\u0435 \u043d\u0430 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0440\u0430\u0441\u0442\u044f\u0436\u0435\u043d\u0438\u044f     var delta = ScreenDist \/ local.Z * Scale;     var proection = new Vector2(local.X, local.Y) * delta;     \/\/\u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u0432 \u044d\u043a\u0440\u0430\u043d\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b     var screen = proection + new Vector2(ScreenWidth \/ 2, -ScreenHeight \/ 2);     var screenCoords = new Vector2(screen.X, -screen.Y);     \/\/\u0435\u0441\u043b\u0438 \u0442\u043e\u0447\u043a\u0430 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 \u044d\u043a\u0440\u0430\u043d\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 - \u0432\u0435\u0440\u043d\u0435\u043c \u0435\u0435     if (screenCoords.X &gt;= 0 && screenCoords.X &lt; ScreenWidth && screenCoords.Y &gt;= 0 && screenCoords.Y &lt; ScreenHeight)     {         return screenCoords;     }     return new Vector2(float.NaN, float.NaN); } <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u0412\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043a\u043e\u0434 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0430:<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041a\u043e\u0434 \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">public DrawObject(Primitive primitive , Camera camera) {     for (int i = 0; i &lt; primitive.Indexes.Length; i+=3)     {         var color = randomColor();         \/\/ \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0432\u0435\u0440\u0448\u0438\u043d \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430         var i1 = primitive.Indexes[i];         var i2 = primitive.Indexes[i+ 1];         var i3 = primitive.Indexes[i+ 2];         \/\/ \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430         var v1 = primitive.GlobalVertices[i1];         var v2 = primitive.GlobalVertices[i2];         var v3 = primitive.GlobalVertices[i3];         \/\/ \u0440\u0438\u0441\u0443\u0435\u043c \u043f\u043e\u043b\u0438\u0433\u043e\u043d         DrawPolygon(v1,v2,v3 , camera , color);     } }  public void DrawPolygon(Vector3 v1, Vector3 v2, Vector3 v3, Camera camera , color) {     \/\/\u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u0432\u0435\u0440\u0448\u0438\u043d     var p1 = camera.ScreenProection(v1);     var p2 = camera.ScreenProection(v2);     var p3 = camera.ScreenProection(v3);     \/\/\u0440\u0438\u0441\u0443\u0435\u043c \u043f\u043e\u043b\u0438\u0433\u043e\u043d     DrawLine(p1, p2 , color);     DrawLine(p2, p3 , color);     DrawLine(p3, p2 , color); } <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0440\u0435\u043d\u0434\u0435\u0440 \u043d\u0430 \u0441\u0446\u0435\u043d\u0435 \u0438 \u043a\u0443\u0431\u043e\u0432:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ff\/ac\/8z\/ffac8zfbhjk3gblwnkefa9xir1y.png\" alt=\"image\" \/><\/div>\n<p>  \u0418 \u0434\u0430, \u0432\u0441\u0435 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0414\u043b\u044f \u0442\u0435\u0445, \u043a\u043e\u043c\u0443 \u0440\u0430\u0437\u043d\u043e\u0446\u0432\u0435\u0442\u043d\u044b\u0435 \u043a\u0443\u0431\u0438\u043a\u0438 \u043d\u0435 \u043a\u0430\u0436\u0443\u0442\u0441\u044f \u043f\u0430\u0444\u043e\u0441\u043d\u044b\u043c\u0438 \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 OBJ \u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0442\u0438\u043f\u0430 Primitive, \u0437\u0430\u043b\u0438\u043b \u0444\u043e\u043d \u0447\u0435\u0440\u043d\u044b\u043c \u0438 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u043b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0434\u0435\u043b\u0435\u0439:<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0440\u0435\u043d\u0434\u0435\u0440\u0430<\/b>                         <\/p>\n<div class=\"spoiler_text\">  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/dc\/wv\/qi\/dcwvqi0_otuiwgwo8uugnoxypvo.png\" alt=\"image\"\/><\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/5l\/xy\/jq\/5lxyjquyk4sbsa1zspscx1ptr3q.png\" alt=\"image\"\/>  <\/div>\n<\/p><\/div>\n<h2><anchor>\u0420\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u043e\u0432. \u041d\u0430\u0432\u043e\u0434\u0438\u043c \u043a\u0440\u0430\u0441\u043e\u0442\u0443.<\/anchor><\/h2>\n<p>  \u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u043c\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u043f\u0440\u043e\u0432\u043e\u043b\u043e\u0447\u043d\u044b\u0439 \u0440\u0435\u043d\u0434\u0435\u0440. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0437\u0430\u0439\u043c\u0435\u043c\u0441\u044f \u0435\u0433\u043e \u043c\u043e\u0434\u0435\u0440\u043d\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u2014 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0440\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u043e\u0432.<\/p>\n<p>  \u041f\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u043c\u0443 <b>\u0440\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u0438\u0433\u043e\u043d<\/b> \u2014 \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442 \u0437\u0430\u043a\u0440\u0430\u0441\u0438\u0442\u044c \u0435\u0433\u043e. \u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b \u0437\u0430\u0447\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434, \u043a\u043e\u0433\u0434\u0430 \u0435\u0441\u0442\u044c \u0443\u0436\u0435 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0440\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430. \u0412\u043e\u0442 \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0435\u0441\u043b\u0438 \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u043c\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ae\/ap\/-q\/aeap-qm55km7hqfdvf3rai0nzow.png\" alt=\"image\" \/><\/div>\n<p>  \u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0435 \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u043e, \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u044b \u0441\u0437\u0430\u0434\u0438 \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u043f\u043e\u0432\u0435\u0440\u0445 \u043f\u0435\u0440\u0435\u0434\u043d\u0438\u0445, \u043e\u0434\u043d\u0438\u043c \u0441\u043b\u043e\u0432\u043e\u043c \u2014 \u043a\u0430\u0448\u0430. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435 \u043a\u0430\u043a \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b? \u0414\u0430, \u043d\u0438\u043a\u0430\u043a. \u0417\u043d\u0430\u0447\u0438\u0442 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0438\u043c\u0431\u0430-\u0440\u0430\u0441\u0442\u0435\u0440\u0430\u0439\u0437\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0443\u043c\u0435\u0442\u044c \u0432 <b>\u043e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u044b\u0445 \u0442\u043e\u0447\u0435\u043a<\/b>, \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u0438 \u0434\u0430\u0436\u0435 \u0432 \u0448\u0435\u0439\u0434\u0435\u0440\u044b! \u041d\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u043d\u044f\u0442\u044c \u043a\u0430\u043a \u0432\u043e\u043e\u0431\u0449\u0435 \u043a\u0440\u0430\u0441\u0438\u0442\u044c \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0438.<\/p>\n<h3>\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0411\u0440\u0435\u0437\u0435\u043d\u0445\u0435\u043c\u0430 \u0434\u043b\u044f \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u043b\u0438\u043d\u0438\u0438.<\/h3>\n<p>  \u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u043b\u0438\u043d\u0438\u0439. \u0415\u0441\u043b\u0438 \u043a\u0442\u043e \u043d\u0435 \u0437\u043d\u0430\u043b \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0411\u0440\u0435\u0437\u0435\u043d\u0445\u0435\u043c\u0430 \u2014 \u044d\u0442\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u044f\u043c\u044b\u0445 \u0432 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u043e\u0439 \u0433\u0440\u0430\u0444\u0438\u043a\u0435. \u041e\u043d \u0438\u043b\u0438 \u0435\u0433\u043e \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u0432\u0435\u0437\u0434\u0435: \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u044f\u043c\u044b\u0445, \u043e\u0442\u0440\u0435\u0437\u043a\u043e\u0432, \u043e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0438 \u0442.\u043f. \u041a\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u2014 \u0447\u0438\u0442\u0430\u0439\u0442\u0435 \u0432\u0438\u043a\u0438. <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D1%80%D0%B5%D0%B7%D0%B5%D0%BD%D1%85%D1%8D%D0%BC%D0%B0#:~:text=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%20%D0%91%D1%80%D0%B5%D0%B7%D0%B5%D0%BD%D1%85%D0%B5%CC%81%D0%BC%D0%B0%20(%D0%B0%D0%BD%D0%B3%D0%BB.,%D0%BB%D0%B8%D0%BD%D0%B8%D0%B8%20%D0%BC%D0%B5%D0%B6%D0%B4%D1%83%20%D0%B4%D0%B2%D1%83%D0%BC%D1%8F%20%D0%B7%D0%B0%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%BC%D0%B8%20%D1%82%D0%BE%D1%87%D0%BA%D0%B0%D0%BC%D0%B8.&amp;text=%D0%A1%D1%83%D1%89%D0%B5%D1%81%D1%82%D0%B2%D1%83%D0%B5%D1%82%20%D0%BE%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B0%20%D0%91%D1%80%D0%B5%D0%B7%D0%B5%D0%BD%D1%85%D1%8D%D0%BC%D0%B0%20%D0%B4%D0%BB%D1%8F%20%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%BA%D1%80%D0%B8%D0%B2%D1%8B%D1%85%202%2D%D0%B3%D0%BE%20%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0.\">\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0411\u0440\u0435\u0437\u0435\u043d\u0445\u0435\u043c\u0430<\/a><\/p>\n<p>  \u0418\u043c\u0435\u0435\u0442\u0441\u044f \u043e\u0442\u0440\u0435\u0437\u043e\u043a \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u044e\u0449\u0438\u0439 \u0442\u043e\u0447\u043a\u0438 <b>{x1, y1}<\/b> \u0438 <b>{x2, y2}<\/b>. \u0427\u0442\u043e\u0431\u044b \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u0440\u0435\u0437\u043e\u043a \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043a\u0440\u0430\u0441\u0438\u0442\u044c \u0432\u0441\u0435 \u043f\u0438\u043a\u0441\u0435\u043b\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0442 \u043d\u0430 \u043d\u0435\u0433\u043e. \u0414\u043b\u044f \u0434\u0432\u0443\u0445 \u0442\u043e\u0447\u0435\u043a \u043e\u0442\u0440\u0435\u0437\u043a\u0430 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 <b>x<\/b>-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u043d\u0438 \u043b\u0435\u0436\u0430\u0442: \u043d\u0443\u0436\u043d\u043e \u043b\u0438\u0448\u044c <b>\u0432\u0437\u044f\u0442\u044c \u0446\u0435\u043b\u044b\u0435 \u0447\u0430\u0441\u0442\u0438 \u043e\u0442 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 x1 \u0438 x2<\/b>. \u0427\u0442\u043e\u0431\u044b \u0437\u0430\u043a\u0440\u0430\u0441\u0438\u0442\u044c \u043f\u0438\u043a\u0441\u0435\u043b\u0438 \u043d\u0430 \u043e\u0442\u0440\u0435\u0437\u043a\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0446\u0438\u043a\u043b \u043e\u0442 <b>x1<\/b> \u0434\u043e <b>x2<\/b> \u0438 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c <b>y<\/b> \u2014 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443 \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u043d\u0430 \u043f\u0440\u044f\u043c\u0443\u044e. \u0412\u043e\u0442 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"cs\">void Brezenkhem(Vector2 p1 , Vector2 p2) {     int x1 = Floor(p1.X);     int x2 = Floor(p2.X);     if (x1 &gt; x2) {Swap(x1, x2); Swap(p1 , p2);}     float d = (p2.Y - p1.Y) \/ (x2 - x1);     float y = p1.Y;     for (int i = x1; i &lt;= x2; i++)     {         int pixelY = Floor(y);         FillPixel(i , pixelY);         y += d;     } } <\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/bn\/sy\/gb\/bnsygbfuynrxw_kbfsgvfklzxjs.gif\" alt=\"image\" \/><\/div>\n<p>  <i>\u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0438\u0437 \u0432\u0438\u043a\u0438<\/i><\/p>\n<h3>\u0420\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430. \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0437\u0430\u043b\u0438\u0432\u043a\u0438<\/h3>\n<p>  \u041b\u0438\u043d\u0438\u0438 \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043c\u044b \u0443\u043c\u0435\u0435\u043c, \u0430 \u0432\u043e\u0442 \u0441 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430\u043c\u0438 \u0431\u0443\u0434\u0435\u0442 \u0447\u0443\u0442\u044c \u043f\u043e\u0441\u043b\u043e\u0436\u043d\u0435\u0435(\u043d\u0435 \u043d\u0430\u043c\u043d\u043e\u0433\u043e)! \u0417\u0430\u0434\u0430\u0447\u0430 \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430 \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c \u0437\u0430\u0434\u0430\u0447\u0430\u043c \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u043b\u0438\u043d\u0438\u0439. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0437\u043e\u0431\u044c\u0435\u043c \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a \u043d\u0430 \u0434\u0432\u0435 \u0447\u0430\u0441\u0442\u0438 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0432 \u0442\u043e\u0447\u043a\u0438 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u043d\u0438\u044f <b>x<\/b>:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ed\/ky\/6f\/edky6f6df_hm3vancgj9rjiw2o0.png\" alt=\"image\" \/><\/div>\n<p>  \u0417\u0430\u043c\u0435\u0442\u044c\u0442\u0435 \u2014 \u0442\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0434\u0432\u0435 \u0447\u0430\u0441\u0442\u0438 \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u044f\u0432\u043d\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u044b <b>\u043d\u0438\u0436\u043d\u044f\u044f<\/b> \u0438 <b>\u0432\u0435\u0440\u0445\u043d\u044f\u044f<\/b> \u0433\u0440\u0430\u043d\u0438\u0446\u044b. \u0432\u0441\u0435 \u0447\u0442\u043e \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u2014 \u044d\u0442\u043e \u0437\u0430\u043b\u0438\u0442\u044c \u0432\u0441\u0435 \u043f\u0438\u043a\u0441\u0435\u043b\u0438 \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0435\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438! \u0421\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0432 2 \u0446\u0438\u043a\u043b\u0430: \u043e\u0442 <b>x1<\/b> \u0434\u043e <b>x2<\/b> \u0438 \u043e\u0442 <b>x3<\/b> \u0434\u043e <b>x2<\/b>.<\/p>\n<pre><code class=\"cs\">void Triangle(Vector2 v1 , Vector2 v2 , Vector2 v3) {     \/\/\u0445\u0430\u0440\u0434\u043a\u043e\u0434\u0438\u043c BubbleSort \u0434\u043b\u044f \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u043f\u043e x     if (v1.X &gt; v2.X) { Swap(v1, v2); }     if (v2.X &gt; v3.X) { Swap(v2, v3); }     if (v1.X &gt; v2.X) { Swap(v1, v2); }      \/\/\u0443\u0437\u043d\u0430\u0435\u043c \u043d\u0430 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f y \u0433\u0440\u0430\u043d\u0438\u0446 \u043f\u0440\u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0438 x     \/\/\u0438\u0437\u0431\u0435\u0433\u0430\u0435\u043c \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430 0: \u0435\u0441\u043b\u0438 x1 == x2 \u0437\u043d\u0430\u0447\u0438\u0442 \u044d\u0442\u0430 \u0447\u0430\u0441\u0442\u044c \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430 - \u043b\u0438\u043d\u0438\u044f     var steps12 = max(v2.X - v1.X , 1);     var steps13 = max(v3.X - v1.X , 1);     var upDelta = (v2.Y - v1.Y) \/ steps12;     var downDelta = (v3.Y - v1.Y) \/ steps13;      \/\/\u0432\u0435\u0440\u0445\u043d\u044f\u044f \u0433\u0440\u0430\u043d\u0438\u0446\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0432\u044b\u0448\u0435 \u043d\u0438\u0436\u043d\u0435\u0439     if (upDelta &lt; downDelta) Swap(upDelta , downDelta);      \/\/\u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0443 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0433\u0440\u0430\u043d\u0438\u0446 \u0440\u0430\u0432\u043d\u044b y1     var up = v1.Y;     var down = v1.Y;      for (int i = (int)v1.X; i &lt;= (int)v2.X; i++)     {         for (int g = (int)down; g &lt;= (int)up; g++)         {             FillPixel(i , g);         }         up += upDelta;         down += downDelta;     }      \/\/\u0432\u0441\u0435 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430     var steps32 = max(v2.X - v3.X , 1);     var steps31 = max(v1.X - v3.X , 1);     upDelta = (v2.Y - v3.Y) \/ steps32;     downDelta = (v1.Y - v3.Y) \/ steps31;      if (upDelta &lt; downDelta) Swap(upDelta, downDelta);      up = v3.Y;     down = v3.Y;      for (int i = (int)v3.X; i &gt;=(int)v2.X; i--)     {         for (int g = (int)down; g &lt;= (int)up; g++)         {             FillPixel(i, g);         }         up += upDelta;         down += downDelta;     } } <\/code><\/pre>\n<p>  \u041d\u0435\u0441\u043e\u043c\u043d\u0435\u043d\u043d\u043e \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0442\u044c \u0438 \u043d\u0435 \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0446\u0438\u043a\u043b:<\/p>\n<pre><code class=\"cs\">void Triangle(Vector2 v1 , Vector2 v2 , Vector2 v3) {     if (v1.X &gt; v2.X) { Swap(v1, v2); }     if (v2.X &gt; v3.X) { Swap(v2, v3); }     if (v1.X &gt; v2.X) { Swap(v1, v2); }      var steps12 = max(v2.X - v1.X , 1);     var steps13 = max(v3.X - v1.X , 1);     var steps32 = max(v2.X - v3.X , 1);     var steps31 = max(v1.X - v3.X , 1);      var upDelta = (v2.Y - v1.Y) \/ steps12;     var downDelta = (v3.Y - v1.Y) \/ steps13;     if (upDelta &lt; downDelta) Swap(upDelta , downDelta);      TrianglePart(v1.X , v2.X , v1.Y , upDelta , downDelta);      upDelta = (v2.Y - v3.Y) \/ steps32;     downDelta = (v1.Y - v3.Y) \/ steps31;     if (upDelta &lt; downDelta) Swap(upDelta, downDelta);      TrianglePart(v3.X, v2.X, v3.Y, upDelta, downDelta); }  void TrianglePart(float x1 , float x2 , float y1  , float upDelta , float downDelta) {     float up = y1, down = y1;     for (int i = (int)x1; i &lt;= (int)x2; i++)     {         for (int g = (int)down; g &lt;= (int)up; g++)         {             FillPixel(i , g);         }         up += upDelta; down += downDelta;     } } <\/code><\/pre>\n<p>  <\/p>\n<h3>\u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u044b\u0445 \u0442\u043e\u0447\u0435\u043a.<\/h3>\n<p>  \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u0434\u0443\u043c\u0430\u0439\u0442\u0435 \u043a\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432\u044b \u0432\u0438\u0434\u0438\u0442\u0435. \u0421\u0435\u0439\u0447\u0430\u0441 \u043f\u0435\u0440\u0435\u0434 \u0432\u0430\u043c\u0438 \u044d\u043a\u0440\u0430\u043d, \u0430 \u0442\u043e \u0447\u0442\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e\u0437\u0430\u0434\u0438 \u043d\u0435\u0433\u043e \u0441\u043a\u0440\u044b\u0442\u043e \u043e\u0442 \u0432\u0430\u0448\u0438\u0445 \u0433\u043b\u0430\u0437. \u0412 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u2014 \u0435\u0441\u043b\u0438 \u043e\u0434\u0438\u043d \u043f\u043e\u043b\u0438\u0433\u043e\u043d \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0434\u0440\u0443\u0433\u043e\u0439 \u0440\u0435\u043d\u0434\u0435\u0440 \u043d\u0430\u0440\u0438\u0441\u0443\u0435\u0442 \u0435\u0433\u043e \u043f\u043e\u0432\u0435\u0440\u0445 \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0442\u043e\u0433\u043e. \u041d\u0430\u043e\u0431\u043e\u0440\u043e\u0442 \u0436\u0435, \u0437\u0430\u043a\u0440\u044b\u0442\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043e\u043d \u043d\u0435 \u0431\u0443\u0434\u0435\u0442:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/yo\/gy\/sy\/yogysysotfxrcm4axcqdprbezv4.png\" alt=\"image\" \/><\/div>\n<p>  \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c \u0432\u0438\u0434\u0438\u043c\u0430 \u0442\u043e\u0447\u043a\u0438 \u0438\u043b\u0438 \u043d\u0435\u0442, \u0432 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c <b>zbuffer<\/b>-\u0430(\u0431\u0443\u0444\u0435\u0440\u0430 \u0433\u043b\u0443\u0431\u0438\u043d\u044b). <b>zbuffer<\/b> \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u043a \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 (\u043c\u043e\u0436\u043d\u043e \u0441\u0436\u0430\u0442\u044c \u0432 \u043e\u0434\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0439) \u0441 \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u044c\u044e <b>width * height<\/b>. \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u043e\u043d \u0445\u0440\u0430\u043d\u0438\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <b>z<\/b> \u2014 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043d\u0430 <b>\u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0435<\/b> \u043e\u0442\u043a\u0443\u0434\u0430 \u044d\u0442\u0430 \u0442\u043e\u0447\u043a\u0430 \u0431\u044b\u043b\u0430 \u0441\u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0430. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0447\u0435\u043c \u0431\u043b\u0438\u0436\u0435 \u0442\u043e\u0447\u043a\u0430 \u043a \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044e, \u0442\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435 \u0435\u0435 <b>z<\/b> \u2014 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430. \u0412 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0438\u0442\u043e\u0433\u0435 \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0442\u043e\u0447\u0435\u043a \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442 \u0440\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u043e \u0442\u043e\u0447\u043a\u0443 \u0441 <b>\u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 z \u2014 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u043e\u0439<\/b>:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/yw\/ob\/cm\/ywobcml9dol_ftvwx3dqmyrgaum.png\" alt=\"image\" \/><\/div>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0432\u043e\u043f\u0440\u043e\u0441 \u2014 \u043a\u0430\u043a \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c <b>z<\/b>-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0442\u043e\u0447\u0435\u043a \u043d\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0435? \u042d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043c\u043e\u0436\u043d\u043e \u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043b\u0443\u0447 \u0438\u0437 \u043d\u0430\u0447\u0430\u043b\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u043a\u0430\u043c\u0435\u0440\u044b, \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0447\u0435\u0440\u0435\u0437 \u0442\u043e\u0447\u043a\u0443 \u043d\u0430 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 <b>{x, y, z&#8217;}<\/b>, \u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u0435\u0433\u043e \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0435 \u0441 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u043e\u043c. \u041d\u043e \u0438\u0441\u043a\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u043a\u0440\u0430\u0439\u043d\u0435 \u0437\u0430\u0442\u0440\u0430\u0442\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431. \u0414\u043b\u044f \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430 \u043c\u044b <b>\u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0439<\/b>, \u0442\u0435\u043f\u0435\u0440\u044c, \u043f\u043e\u043c\u0438\u043c\u043e \u044d\u0442\u043e\u0433\u043e, \u043c\u044b \u0431\u0443\u0434\u0435\u043c <b>\u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u0436\u0435 \u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430<\/b>. \u0414\u043b\u044f \u043e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u044b\u0445 \u0442\u043e\u0447\u0435\u043a \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 \u0440\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 <b>zbuffer<\/b>-\u0430 \u0434\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0444\u0440\u0435\u0439\u043c\u0430. <\/p>\n<p>  \u041c\u043e\u0439 <b>zbuffer<\/b> \u0431\u0443\u0434\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0432\u0438\u0434 <b>Vector3[]<\/b> \u2014 <b>\u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e z \u2014 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b<\/b>, \u043d\u043e \u0438 \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0442\u043e\u0447\u0435\u043a \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430(\u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u044b) \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u044d\u043a\u0440\u0430\u043d\u0430. \u042d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0432 \u0446\u0435\u043b\u044f\u0445 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u0442\u0430\u043a \u043a\u0430\u043a \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u043d\u0430\u043c \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u043f\u0440\u0438\u0433\u043e\u0434\u044f\u0442\u0441\u044f \u044d\u0442\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f <b>\u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432<\/b>! \u0410 \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u0438\u043c\u0435\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434 <b>\u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0432\u0438\u0434\u0438\u043c\u044b\u0445 \u0432\u0435\u0440\u0448\u0438\u043d(\u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043e\u0432)<\/b>:<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041a\u043e\u0434<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">public void ComputePoly(Vector3 v1, Vector3 v2, Vector3 v3 , Vector3[] zbuffer) {     \/\/\u043d\u0430\u0445\u043e\u0434\u0438\u043c \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044e \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430     var v1p = Camera.ScreenProection(v1);     var v2p = Camera.ScreenProection(v2);     var v3p = Camera.ScreenProection(v3);      \/\/\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u0435\u043c \u0442\u043e\u0447\u043a\u0438 \u043f\u043e x - \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0435     \/\/\u0417\u0430\u043c\u0435\u0442\u044c\u0442\u0435, \u0442\u0430\u043a\u0436\u0435 \u043c\u0435\u043d\u044f\u0435\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 - \u043e\u043d\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044f\u043c     if (v1p.X &gt; v2p.X) { Swap(v1p, v2p); Swap(v1p, v2p); }     if (v2p.X &gt; v3p.X) { Swap(v2p, v3p); Swap(v2p, v3p); }     if (v1p.X &gt; v2p.X) { Swap(v1p, v2p); Swap(v1p, v2p); }      \/\/\u0441\u0447\u0438\u0442\u0430\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0448\u0430\u0433\u043e\u0432 \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043b\u0438\u043d\u0438\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c \u0411\u0440\u0435\u0437\u0435\u043d\u0445\u0435\u043c\u0430     int x12 = Math.Max((int)v2p.X - (int)v1p.X, 1);     int x13 = Math.Max((int)v3p.X - (int)v1p.X, 1);      \/\/\u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043c\u0438\u043c\u043e \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0439 \u0431\u0443\u0434\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438     float dy12 = (v2p.Y - v1p.Y) \/ x12; var dr12 = (v2 - v1) \/ x12;     float dy13 = (v3p.Y - v1p.Y) \/ x13; var dr13 = (v3 - v1) \/ x13;      Vector3 deltaUp, deltaDown; float deltaUpY, deltaDownY;     if (dy12 &gt; dy13) { deltaUp = dr12; deltaDown = dr13; deltaUpY = dy12; deltaDownY = dy13;}     else { deltaUp = dr13; deltaDown = dr12; deltaUpY = dy13; deltaDownY = dy12;}      TrianglePart(v1 , deltaUp , deltaDown , x12 , 1 , v1p , deltaUpY , deltaDownY , zbuffer);     \/\/\u0432\u0442\u043e\u0440\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e - \u0434\u0443\u043c\u0430\u044e \u0432\u044b \u043f\u043e\u043d\u044f\u043b\u0438 } public void ComputePolyPart(Vector3 start, Vector3 deltaUp, Vector3 deltaDown,     int xSteps, int xDir, Vector2 pixelStart, float deltaUpPixel, float deltaDownPixel , Vector3[] zbuffer) {     int pixelStartX = (int)pixelStart.X;     Vector3 up = start - deltaUp, down = start - deltaDown;     float pixelUp = pixelStart.Y - deltaUpPixel, pixelDown = pixelStart.Y - deltaDownPixel;     for (int i = 0; i &lt;= xSteps; i++)     {         up += deltaUp; pixelUp += deltaUpPixel;         down += deltaDown; pixelDown += deltaDownPixel;         int steps = ((int)pixelUp - (int)pixelDown);         var delta = steps == 0 ? Vector3.Zero : (up - down) \/ steps;         Vector3 position = down - delta;         for (int g = 0; g &lt;= steps; g++)         {             position += delta;             var proection = new Point(pixelStartX + i * xDir, (int)pixelDown + g);             int index = proection.Y * Width + proection.X;             \/\/\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u0433\u043b\u0443\u0431\u0438\u043d\u0443             if (zbuffer[index].Z == 0 || zbuffer[index].Z &gt; position.Z)             {                 zbuffer[index] = position;             }         }     } } <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/6o\/sf\/oh\/6osfohfuvx_ypkqhovlqd4cw44y.gif\" alt=\"image\" \/><\/div>\n<p>  <i>\u0410\u043d\u0438\u043c\u0430\u0446\u0438\u044f \u0448\u0430\u0433\u043e\u0432 \u0440\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0442\u043e\u0440\u0430(\u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0438 \u0433\u043b\u0443\u0431\u0438\u043d\u044b \u0432 zbuffer-\u0435 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0440\u0430\u0441\u043d\u044b\u043c):<\/i><\/p>\n<p>  \u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u044f \u0432\u044b\u043d\u0435\u0441 \u0432\u0435\u0441\u044c \u043a\u043e\u0434 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c Rasterizer:<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041a\u043b\u0430\u0441\u0441 \u0440\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0442\u043e\u0440\u0430<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">    public class Rasterizer     {         public Vertex[] ZBuffer;         public int[] VisibleIndexes;         public int VisibleCount;         public int Width;         public int Height;         public Camera Camera;          public Rasterizer(Camera camera)         {             Shaders = shaders;             Width = camera.ScreenWidth;             Height = camera.ScreenHeight;             Camera = camera;          }         public Bitmap Rasterize(IEnumerable&lt;Primitive&gt; primitives)         {             var buffer = new Bitmap(Width , Height);             ComputeVisibleVertices(primitives);             for (int i = 0; i &lt; VisibleCount; i++)             {                 var vec = ZBuffer[index];                 var proec = Camera.ScreenProection(vec);                 buffer.SetPixel(proec.X , proec.Y);             }             return buffer.Bitmap;         }         public void ComputeVisibleVertices(IEnumerable&lt;Primitive&gt; primitives)         {             VisibleCount = 0;             VisibleIndexes = new int[Width * Height];             ZBuffer = new Vertex[Width * Height];             foreach (var prim in primitives)             {                 foreach (var poly in prim.GetPolys())                 {                     MakeLocal(poly);                     ComputePoly(poly.Item1, poly.Item2, poly.Item3);                 }             }         }         public void MakeLocal(Poly poly)         {             poly.Item1.Position = Camera.Pivot.ToLocalCoords(poly.Item1.Position);             poly.Item2.Position = Camera.Pivot.ToLocalCoords(poly.Item2.Position);             poly.Item3.Position = Camera.Pivot.ToLocalCoords(poly.Item3.Position);          }     } <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0443 \u0440\u0435\u043d\u0434\u0435\u0440\u0430. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u0421\u0438\u043b\u044c\u0432\u0430\u043d\u044b \u0438\u0437 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0439 RPG \u00abWOW\u00bb:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/tj\/xj\/jj\/tjxjjjoqgrox8dl2yqiptatfqjy.png\" alt=\"image\" \/><\/div>\n<p>  \u041d\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043f\u0440\u0430\u0432\u0434\u0430? \u0410 \u0432\u0441\u0435 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u043d\u0435\u0442 \u043d\u0438 \u0442\u0435\u043a\u0441\u0442\u0443\u0440 \u043d\u0438 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f. \u041d\u043e \u0432\u0441\u043a\u043e\u0440\u0435 \u043c\u044b \u044d\u0442\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u043c. <\/p>\n<h2><anchor>\u0422\u0435\u043a\u0441\u0442\u0443\u0440\u044b! \u041d\u043e\u0440\u043c\u0430\u043b\u0438! \u041e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u0435! \u041c\u043e\u0442\u043e\u0440!<\/anchor><\/h2>\n<p>  \u041f\u043e\u0447\u0435\u043c\u0443 \u044f \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u043b \u0432\u0441\u0435 \u044d\u0442\u043e \u0432 \u043e\u0434\u0438\u043d \u0440\u0430\u0437\u0434\u0435\u043b? \u0410 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u043e \u0441\u0432\u043e\u0435\u0439 \u0441\u0443\u0442\u0438 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0438 \u0440\u0430\u0441\u0447\u0435\u0442 \u043d\u043e\u0440\u043c\u0430\u043b\u0435\u0439 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b \u0438 \u0441\u043a\u043e\u0440\u043e \u0432\u044b \u044d\u0442\u043e \u043f\u043e\u0439\u043c\u0435\u0442\u0435.<\/p>\n<p>  \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0437\u0430\u0434\u0430\u0447\u0443 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043c\u0438\u043c\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0432\u0435\u0440\u0448\u0438\u043d \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0435\u0449\u0435 \u0438 \u0435\u0433\u043e <b>\u0442\u0435\u043a\u0441\u0442\u0443\u0440\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b<\/b>. \u0422\u0435\u043a\u0441\u0442\u0443\u0440\u043d\u0430\u044f \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u044b\u043c \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u043c \u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b. \u0412 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u044f \u043d\u0430\u0448\u0435\u043b \u0445\u043e\u0440\u043e\u0448\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u044d\u0442\u043e:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/kf\/kw\/t1\/kfkwt1mp0d5xrbzftleljllvwgi.png\" alt=\"image\" \/><\/div>\n<p>  \u0417\u0430\u043c\u0435\u0442\u044c\u0442\u0435, \u0447\u0442\u043e \u043d\u0430\u0447\u0430\u043b\u043e \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b (<b>\u043b\u0435\u0432\u044b\u0439 \u043d\u0438\u0436\u043d\u0438\u0439 \u043f\u0438\u043a\u0441\u0435\u043b\u044c<\/b>) \u0432 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u043d\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u0445 \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <b>{0, 0}<\/b>, \u043a\u043e\u043d\u0435\u0446 (<b>\u043f\u0440\u0430\u0432\u044b\u0439 \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u043f\u0438\u043a\u0441\u0435\u043b\u044c<\/b>) \u2014 <b>{1, 1}<\/b>. \u0423\u0447\u0438\u0442\u044b\u0432\u0430\u0439\u0442\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0445\u043e\u0434\u0430 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u043a\u043e\u0433\u0434\u0430 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u043d\u0430\u044f \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 \u0440\u0430\u0432\u043d\u0430 1.<\/p>\n<p>  \u0421\u0440\u0430\u0437\u0443 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u0435\u0440\u0448\u0438\u043d\u044b:<\/p>\n<pre><code class=\"cs\">  public class Vertex     {         public Vector3 Position { get; set; }         public Color Color { get; set; }         public Vector2 TextureCoord { get; set; }         public Vector3 Normal { get; set; }          public Vertex(Vector3 pos , Color color , Vector2 texCoord , Vector3 normal)         {             Position = pos;             Color = color;             TextureCoord = texCoord;             Normal = normal;         }     } <\/code><\/pre>\n<p>  \u0417\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u043d\u044b \u043d\u043e\u0440\u043c\u0430\u043b\u0438 \u044f \u043e\u0431\u044a\u044f\u0441\u043d\u044e \u043f\u043e\u0437\u0436\u0435, \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u0443\u0434\u0435\u043c \u0437\u043d\u0430\u0442\u044c, \u0447\u0442\u043e \u0443 \u0432\u0435\u0440\u0448\u0438\u043d \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c. \u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043b\u044f \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043a\u0430\u043a\u0438\u043c-\u0442\u043e \u043e\u0431\u0440\u0430\u0437\u043e\u043c <b>\u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c<\/b> \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0446\u0432\u0435\u0442\u0430 \u0438\u0437 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c\u0443 \u043f\u0438\u043a\u0441\u0435\u043b\u044e. \u041f\u043e\u043c\u043d\u0438\u0442\u0435 \u043a\u0430\u043a \u043c\u044b \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0432\u0435\u0440\u0448\u0438\u043d\u044b? \u0417\u0434\u0435\u0441\u044c \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435! \u042f \u043d\u0435 \u0431\u0443\u0434\u0443 \u0435\u0449\u0435 \u0440\u0430\u0437 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0440\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0438, \u0430 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0432\u0430\u043c \u0441\u0430\u043c\u0438\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u0432\u0430\u0448\u0435\u043c \u0440\u0435\u043d\u0434\u0435\u0440\u0435. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0443\u0440 \u043d\u0430 \u043c\u043e\u0434\u0435\u043b\u0438. \u0412\u043e\u0442, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0443 \u043c\u0435\u043d\u044f:<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/kc\/am\/br\/kcambronp9akxsupyexc9yxjbeg.png\" alt=\"image\" \/><\/div>\n<\/div><\/div>\n<p>  \u0412\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u043d\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u0445 \u043c\u043e\u0434\u0435\u043b\u0438 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u0444\u0430\u0439\u043b\u0435 OBJ. \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0438\u0437\u0443\u0447\u0438\u0442\u0435 \u0444\u043e\u0440\u043c\u0430\u0442: <a href=\"https:\/\/ru.wikipedia.org\/wiki\/Obj\">\u0424\u043e\u0440\u043c\u0430\u0442 OBJ.<\/a><\/p>\n<h3>\u041e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u0435<\/h3>\n<p>  \u0421 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430\u043c\u0438 \u0432\u0441\u0435 \u0441\u0442\u0430\u043b\u043e \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0432\u0435\u0441\u0435\u043b\u0435\u0435, \u043d\u043e \u043f\u043e \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u043c\u0443 \u0432\u0435\u0441\u0435\u043b\u043e \u0431\u0443\u0434\u0435\u0442 \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0441\u0446\u0435\u043d\u044b. \u0414\u043b\u044f \u0438\u043c\u0438\u0442\u0430\u0446\u0438\u0438 \u00ab\u0434\u0435\u0448\u0435\u0432\u043e\u0433\u043e\u00bb \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u044f \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <b>\u043c\u043e\u0434\u0435\u043b\u044c \u0424\u043e\u043d\u0433\u0430<\/b>.<\/p>\n<h3>\u041c\u043e\u0434\u0435\u043b\u044c \u0424\u043e\u043d\u0433\u0430<\/h3>\n<p>  \u0412 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0438\u043c\u0438\u0442\u0438\u0440\u0443\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 3\u0445 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0445 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f: <b>\u0444\u043e\u043d\u043e\u0432\u0430\u044f<\/b>(ambient), <b>\u0440\u0430\u0441\u0441\u0435\u044f\u043d\u043d\u0430\u044f<\/b>(diffuse) \u0438 <b>\u0437\u0435\u0440\u043a\u0430\u043b\u044c\u043d\u0430\u044f<\/b>(reflect). \u0421\u0443\u043c\u043c\u0430 \u044d\u0442\u0438\u0445 \u0442\u0440\u0435\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0432 \u0438\u0442\u043e\u0433\u0435 \u0434\u0430\u0441\u0442 \u0438\u043c\u0438\u0442\u0430\u0446\u0438\u044e \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0441\u0432\u0435\u0442\u0430.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/pp\/a9\/ji\/ppa9jicaepzdppf-aasjurssntm.png\" alt=\"image\" \/><\/div>\n<p>  <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%97%D0%B0%D1%82%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%BE_%D0%A4%D0%BE%D0%BD%D0%B3%D1%83\"><i>\u041c\u043e\u0434\u0435\u043b\u044c \u0424\u043e\u043d\u0433\u0430<\/i><\/a><\/p>\n<p>  \u0414\u043b\u044f \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u043f\u043e \u0424\u043e\u043d\u0433\u0443 \u043d\u0430\u043c \u0431\u0443\u0434\u0443\u0442 \u043d\u0443\u0436\u043d\u044b <b>\u043d\u043e\u0440\u043c\u0430\u043b\u0438<\/b> \u043a \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044f\u043c, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u044f \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0438\u0445 \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 Vertex. \u0413\u0434\u0435 \u0436\u0435 \u0431\u0440\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u043d\u043e\u0440\u043c\u0430\u043b\u0435\u0439? \u041d\u0435\u0442, \u043d\u0438\u0447\u0435\u0433\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432\u0435\u043b\u0438\u043a\u043e\u0434\u0443\u0448\u043d\u044b\u0435 3\u0434 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u044b \u0447\u0430\u0441\u0442\u043e <b>\u0441\u0430\u043c\u0438 \u0441\u0447\u0438\u0442\u0430\u044e\u0442 \u0438\u0445<\/b> \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 <b>\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043c\u043e\u0434\u0435\u043b\u0438<\/b> \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 OBJ. \u0420\u0430\u0441\u043f\u0430\u0440\u0441\u0438\u0432 \u0444\u0430\u0439\u043b \u043c\u043e\u0434\u0435\u043b\u0438 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u043e\u0440\u043c\u0430\u043b\u0435\u0439 \u0434\u043b\u044f 3\u0445 \u0432\u0435\u0440\u0448\u0438\u043d \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/tb\/57\/jw\/tb57jwmu53_c07jit2_i4pnpp2i.png\" alt=\"image\" \/><\/div>\n<p>  <i>\u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0438\u0437 \u0432\u0438\u043a\u0438<\/i><\/p>\n<p>  \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043d\u043e\u0440\u043c\u0430\u043b\u044c \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u0442\u043e\u0447\u043a\u0435 \u043d\u0430 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043c\u044b \u0443\u0436\u0435 \u0443\u043c\u0435\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e. \u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0432\u0441\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0424\u043e\u043d\u0433\u0430.<\/p>\n<h4>\u0424\u043e\u043d\u043e\u0432\u044b\u0439 \u0441\u0432\u0435\u0442 (Ambient)<\/h4>\n<p>  \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043c\u044b \u0437\u0430\u0434\u0430\u0435\u043c <b>\u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0435 \u0444\u043e\u043d\u043e\u0432\u043e\u0435 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u0435<\/b>, \u0434\u043b\u044f \u043d\u0435\u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u0446\u0432\u0435\u0442, \u0434\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0441 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430\u043c\u0438 \u044f \u0434\u0435\u043b\u044e \u043a\u0430\u0436\u0434\u0443\u044e \u0438\u0437 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 RGB \u043d\u0430 \u043d\u0435\u043a\u0438\u0439 <b>\u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u0437\u0430\u0442\u0435\u043d\u0435\u043d\u0438\u044f<\/b> (baseShading).<\/p>\n<h4>\u0420\u0430\u0441\u0441\u0435\u044f\u043d\u043d\u044b\u0439 \u0441\u0432\u0435\u0442 (Diffuse)<\/h4>\n<p>  \u041a\u043e\u0433\u0434\u0430 \u0441\u0432\u0435\u0442 \u043f\u0430\u0434\u0430\u0435\u0442 \u043d\u0430 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 \u043e\u043d \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e \u0440\u0430\u0441\u0441\u0435\u0438\u0432\u0430\u0435\u0442\u0441\u044f. \u0414\u043b\u044f \u0440\u0430\u0441\u0447\u0435\u0442\u0430 <b>diffuse<\/b> \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c \u043f\u0438\u043a\u0441\u0435\u043b\u0435 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f <b>\u0443\u0433\u043e\u043b<\/b> \u043f\u043e\u0434 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0441\u0432\u0435\u0442 \u043f\u0430\u0434\u0430\u0435\u0442 \u043d\u0430 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c. \u0427\u0442\u043e\u0431\u044b \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0443\u0433\u043e\u043b \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c <b>\u0441\u043a\u0430\u043b\u044f\u0440\u043d\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/b> \u043f\u0430\u0434\u0430\u044e\u0449\u0435\u0433\u043e \u043b\u0443\u0447\u0430 \u0438 \u043d\u043e\u0440\u043c\u0430\u043b\u0438(\u0441\u0430\u043c\u043e \u0441\u043e\u0431\u043e\u0439 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u043f\u0435\u0440\u0435\u0434 \u044d\u0442\u0438\u043c \u043d\u0443\u0436\u043d\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c). \u042d\u0442\u043e\u0442 \u0443\u0433\u043e\u043b \u0431\u0443\u0434\u0435\u0442 \u0443\u043c\u043d\u043e\u0436\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043d\u0435\u043a\u0438\u0439 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0438\u043d\u0442\u0435\u043d\u0441\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0441\u0432\u0435\u0442\u0430. \u0415\u0441\u043b\u0438 \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u2014 \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0443\u0433\u043e\u043b \u043c\u0435\u0436\u0434\u0443 \u0432\u0435\u043a\u0442\u043e\u0440\u0430\u043c\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 90 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u043d\u0430\u0447\u043d\u0435\u043c \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0443\u0436\u0435 \u043d\u0435 \u043e\u0441\u0432\u0435\u0442\u043b\u0435\u043d\u0438\u0435, \u0430, \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442, \u0437\u0430\u0442\u0435\u043d\u0435\u043d\u0438\u0435. \u0421\u0442\u043e\u0438\u0442 \u0438\u0437\u0431\u0435\u0433\u0430\u0442\u044c \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <b>max<\/b>.<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041a\u043e\u0434<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">public interface IShader     {         void ComputeShader(Vertex vertex, Camera camera);     }      public struct Light     {         public Vector3 Pos;         public float Intensivity;     }  public class PhongModelShader : IShader     {         public static float DiffuseCoef = 0.1f;         public Light[] Lights { get; set; }          public PhongModelShader(params Light[] lights)         {             Lights = lights;         }         public void ComputeShader(Vertex vertex, Camera camera)         {             if (vertex.Normal.X == 0 && vertex.Normal.Y == 0 && vertex.Normal.Z == 0)             {                 return;             }             var gPos = camera.Pivot.ToGlobalCoords(vertex.Position);             foreach (var light in Lights)             {                 var ldir = Vector3.Normalize(light.Pos - gPos);                 var diffuseVal = Math.Max(VectorMath.Cross(ldir, vertex.Normal), 0) * light.Intensivity;                 vertex.Color = Color.FromArgb(vertex.Color.A,                     (int)Math.Min(255, vertex.Color.R * diffuseVal * DiffuseCoef),                     (int)Math.Min(255, vertex.Color.G * diffuseVal * DiffuseCoef,                     (int)Math.Min(255, vertex.Color.B * diffuseVal * DiffuseCoef));             }         }     } <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u0440\u0430\u0441\u0441\u0435\u044f\u043d\u043d\u044b\u0439 \u0441\u0432\u0435\u0442 \u0438 \u0440\u0430\u0441\u0441\u0435\u0435\u043c \u0442\u044c\u043c\u0443:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/bt\/d4\/qt\/btd4qt8i1pyx53w6z6b0zwklutc.png\" alt=\"image\" \/><\/div>\n<p>  <\/p>\n<h4>\u0417\u0435\u0440\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0432\u0435\u0442 (Reflect)<\/h4>\n<p>  \u0414\u043b\u044f \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u0437\u0435\u0440\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u043d\u0443\u0436\u043d\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c <b>\u0442\u043e\u0447\u043a\u0443 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442<\/b>. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0431\u0440\u0430\u0442\u044c \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 <b>\u043b\u0443\u0447\u0430 \u043e\u0442 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044f<\/b> \u0438 <b>\u043e\u0442\u0440\u0430\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u0442 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u043b\u0443\u0447\u0430<\/b> \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u043d\u043e\u0435 \u043d\u0430 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0438\u043d\u0442\u0435\u043d\u0441\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0441\u0432\u0435\u0442\u0430. <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/4z\/xw\/jx\/4zxwjxxjxq8tr0w5kl4xgqldvxe.png\" alt=\"image\" \/><\/div>\n<p>  \u041d\u0430\u0439\u0442\u0438 \u043b\u0443\u0447 \u043e\u0442 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044f \u043a \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u043b\u0435\u0433\u043a\u043e \u2014 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e <b>\u043f\u043e\u0437\u0438\u0446\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u0445<\/b>. \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0439\u0442\u0438 \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u043d\u044b\u0439 \u043b\u0443\u0447 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0441\u043f\u043e\u0441\u043e\u0431. \u041f\u0430\u0434\u0430\u044e\u0449\u0438\u0439 \u043b\u0443\u0447 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u043b\u043e\u0436\u0438\u0442\u044c \u043d\u0430 2 \u0432\u0435\u043a\u0442\u043e\u0440\u0430: \u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044e \u043d\u0430 \u043d\u043e\u0440\u043c\u0430\u043b\u044c \u0438 \u0432\u0442\u043e\u0440\u043e\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432\u044b\u0447\u0438\u0442\u0430\u043d\u0438\u0435\u043c \u0438\u0437 \u043f\u0430\u0434\u0430\u044e\u0449\u0435\u0433\u043e \u043b\u0443\u0447\u0430 \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438. \u0427\u0442\u043e\u0431\u044b \u043d\u0430\u0439\u0442\u0438 \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u043d\u044b\u0439 \u043b\u0443\u0447 \u043d\u0443\u0436\u043d\u043e \u0438\u0437 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u043d\u0430 \u043d\u043e\u0440\u043c\u0430\u043b\u044c \u0432\u044b\u0447\u0435\u0441\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u0430.<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u043a\u043e\u0434<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">    public class PhongModelShader : IShader     {         public static float DiffuseCoef = 0.1f;         public static float ReflectCoef = 0.2f;         public Light[] Lights { get; set; }          public PhongModelShader(params Light[] lights)         {             Lights = lights;         }         public void ComputeShader(Vertex vertex, Camera camera)         {             if (vertex.Normal.X == 0 && vertex.Normal.Y == 0 && vertex.Normal.Z == 0)             {                 return;             }             var gPos = camera.Pivot.ToGlobalCoords(vertex.Position);             foreach (var light in Lights)             {                 var ldir = Vector3.Normalize(light.Pos - gPos);                 \/\/\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0442\u0440\u0438 \u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u043d\u0443\u0436\u043d\u044b \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0439\u0442\u0438 \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u043d\u044b\u0439 \u043e\u0442 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u043b\u0443\u0447                 var proection = VectorMath.Proection(ldir, -vertex.Normal);                 var d = ldir - proection;                 var reflect = proection - d;                 var diffuseVal = Math.Max(VectorMath.Cross(ldir, -vertex.Normal), 0) * light.Intensivity;                 \/\/\u043b\u0443\u0447 \u043e\u0442 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044f                 var eye = Vector3.Normalize(-vertex.Position);                 var reflectVal = Math.Max(VectorMath.Cross(reflect, eye), 0) * light.Intensivity;                 var total = diffuseVal * DiffuseCoef + reflectVal * ReflectCoef;                 vertex.Color = Color.FromArgb(vertex.Color.A,                     (int)Math.Min(255, vertex.Color.R * total),                     (int)Math.Min(255, vertex.Color.G * total),                     (int)Math.Min(255, vertex.Color.B * total));             }         }     } <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/bh\/tc\/i7\/bhtci74nm8ofnabianmzc9egvok.png\" alt=\"image\" \/><\/div>\n<h1><anchor>\u0422\u0435\u043d\u0438<\/anchor><\/h1>\n<p>  \u041a\u043e\u043d\u0435\u0447\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 \u043c\u043e\u0435\u0433\u043e \u0438\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0435\u043d\u0435\u0439 \u0434\u043b\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0430. \u041f\u0435\u0440\u0432\u0430\u044f \u0442\u0443\u043f\u0438\u043a\u043e\u0432\u0430\u044f \u0438\u0434\u0435\u044f \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u0440\u043e\u0434\u0438\u043b\u0430\u0441\u044c \u0443 \u043c\u0435\u043d\u044f \u0432 \u0447\u0435\u0440\u0435\u043f\u0443\u0448\u043a\u0435 \u2014 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c <b>\u043d\u0435 \u043b\u0435\u0436\u0438\u0442 \u043b\u0438 \u043c\u0435\u0436\u0434\u0443 \u043d\u0435\u0439 \u0438 \u0441\u0432\u0435\u0442\u043e\u043c \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u043e\u043b\u0438\u0433\u043e\u043d<\/b>. \u0415\u0441\u043b\u0438 \u043b\u0435\u0436\u0438\u0442 \u2014 \u0437\u043d\u0430\u0447\u0438\u0442 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043e\u0441\u0432\u0435\u0449\u0430\u0442\u044c \u043f\u0438\u043a\u0441\u0435\u043b\u044c. \u041c\u043e\u0434\u0435\u043b\u044c \u0421\u0438\u043b\u044c\u0432\u0430\u043d\u044b \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 <b>220\u043a<\/b> \u0441 \u043b\u0438\u0445\u0432\u043e\u0439 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u043e\u0432. \u0415\u0441\u043b\u0438 \u0442\u0430\u043a \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0435 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u044d\u0442\u0438\u043c\u0438 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430\u043c\u0438, \u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c <b>220000 * 1920 * 1080 * 219999 \u0432\u044b\u0437\u043e\u0432\u043e\u0432<\/b> \u043c\u0435\u0442\u043e\u0434\u0430 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f! \u0417\u0430 10 \u043c\u0438\u043d\u0443\u0442 \u043c\u043e\u0439 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 \u0441\u043c\u043e\u0433 \u043e\u0441\u0438\u043b\u0438\u0442\u044c 10-\u0443 \u0447\u0430\u0441\u0442\u044c \u0432\u0441\u0435\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 (2600 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u043e\u0432 \u0438\u0437 220000), \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0443 \u043c\u0435\u043d\u044f \u0441\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0441\u0434\u0432\u0438\u0433 \u0438 \u044f \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b\u0441\u044f \u043d\u0430 \u043f\u043e\u0438\u0441\u043a\u0438 \u043d\u043e\u0432\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430.<\/p>\n<p>  \u0412 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u043c\u043d\u0435 \u043f\u043e\u043f\u0430\u043b\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438 \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0442\u0435 \u0436\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f <b>\u0432 \u0442\u044b\u0441\u044f\u0447\u0438 \u0440\u0430\u0437 \u0431\u044b\u0441\u0442\u0440\u0435\u0435<\/b>. \u041d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u043d <b>Shadow mapping<\/b>(\u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043a\u0430\u0440\u0442\u044b \u0442\u0435\u043d\u0435\u0439). \u0412\u0441\u043f\u043e\u043c\u043d\u0438\u0442\u0435 \u043a\u0430\u043a \u043c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u043b\u0438 \u0432\u0438\u0434\u0438\u043c\u044b\u0435 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044e \u0442\u043e\u0447\u043a\u0438 \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 <b>zbuffer<\/b>. Shadow mapping \u0434\u0435\u043b\u0430\u0435\u0442 \u0442\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435! \u0412 \u043f\u0435\u0440\u0432\u043e\u043c \u043f\u0440\u043e\u0445\u043e\u0434\u0435 \u043d\u0430\u0448\u0430 <b>\u043a\u0430\u043c\u0435\u0440\u0430 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0441\u0432\u0435\u0442\u0430<\/b> \u0438 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c <b>\u043a\u0430\u0440\u0442\u0443 \u0433\u043b\u0443\u0431\u0438\u043d<\/b> \u0434\u043b\u044f \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0441\u0432\u0435\u0442\u0430. \u041a\u0430\u0440\u0442\u0430 \u0433\u043b\u0443\u0431\u0438\u043d \u2014 \u044d\u0442\u043e \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0439 \u043d\u0430\u043c zbuffer. \u0412\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u043f\u0440\u043e\u0445\u043e\u0434\u0435 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u044d\u0442\u0443 \u043a\u0430\u0440\u0442\u0443, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0441\u0432\u0435\u0449\u0430\u0442\u044c\u0441\u044f. \u0421\u0435\u0439\u0447\u0430\u0441 \u044f \u043d\u0430\u0440\u0443\u0448\u0443 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0445\u043e\u0440\u043e\u0448\u0435\u0433\u043e \u043a\u043e\u0434\u0430 \u0438 \u043f\u043e\u0439\u0434\u0443 \u0447\u0438\u0442\u0435\u0440\u0441\u043a\u0438\u043c \u043f\u0443\u0442\u0435\u043c \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u043c \u0448\u0435\u0439\u0434\u0435\u0440\u0443 \u043d\u043e\u0432\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0440\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0442\u043e\u0440\u0430 \u0438 \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u043d\u0430\u043c \u043a\u0430\u0440\u0442\u0443 \u0433\u043b\u0443\u0431\u0438\u043d.<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041a\u043e\u0434<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">public class ShadowMappingShader : IShader {     public Enviroment Enviroment { get; set; }     public Rasterizer Rasterizer { get; set; }     public Camera Camera =&gt; Rasterizer.Camera;     public Pivot Pivot =&gt; Camera.Pivot;     public Vertex[] ZBuffer =&gt; Rasterizer.ZBuffer;     public float LightIntensivity { get; set; }      public ShadowMappingShader(Enviroment enviroment, Rasterizer rasterizer, float lightIntensivity)     {         Enviroment = enviroment;         LightIntensivity = lightIntensivity;         Rasterizer = rasterizer;         \/\/\u044f \u0434\u043e\u0431\u0432\u0438\u043b \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0440\u0435\u043d\u0434\u0435\u0440\u0430, \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u0432 \u043a \u043d\u0438\u043c \u043f\u0435\u0440\u0435\u0440\u0430\u0441\u0447\u0435\u0442 \u043a\u0430\u0440\u0442\u044b \u0442\u0435\u043d\u0435\u0439         \/\/\u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0438\/\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0438 \u043a\u0430\u043c\u0435\u0440\u044b \u043b\u0438\u0431\u043e \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0441\u0446\u0435\u043d\u044b \u0448\u0435\u0439\u0434\u0435\u0440 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0433\u043b\u0443\u0431\u0438\u043d\u0443         Camera.OnRotate += () =&gt; UpdateDepthMap(Enviroment.Primitives);         Camera.OnMove += () =&gt; UpdateDepthMap(Enviroment.Primitives);         Enviroment.OnChange += () =&gt; UpdateDepthMap(Enviroment.Primitives);         UpdateVisible(Enviroment.Primitives);     }     public void ComputeShader(Vertex vertex, Camera camera)     {         \/\/\u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0432\u0435\u0440\u0448\u0438\u043d\u044b         var gPos = camera.Pivot.ToGlobalCoords(vertex.Position);         \/\/\u0434\u0438\u0441\u0442\u0430\u043d\u0446\u0438\u044f \u0434\u043e \u0441\u0432\u0435\u0442\u0430         var lghDir = Pivot.Center - gPos;         var distance = lghDir.Length();         var local = Pivot.ToLocalCoords(gPos);         var proectToLight = Camera.ScreenProection(local).ToPoint();         if (proectToLight.X &gt;= 0 && proectToLight.X &lt; Camera.ScreenWidth && proectToLight.Y &gt;= 0             && proectToLight.Y &lt; Camera.ScreenHeight)         {             int index = proectToLight.Y * Camera.ScreenWidth + proectToLight.X;             if (ZBuffer[index] == null || ZBuffer[index].Position.Z &gt;= local.Z)             {                 vertex.Color = Color.FromArgb(vertex.Color.A,                     (int)Math.Min(255, vertex.Color.R + LightIntensivity \/ distance),                     (int)Math.Min(255, vertex.Color.G + LightIntensivity \/ distance),                     (int)Math.Min(255, vertex.Color.B + LightIntensivity \/ distance));             }         }         else         {             vertex.Color = Color.FromArgb(vertex.Color.A,                     (int)Math.Min(255, vertex.Color.R + (LightIntensivity \/ distance) \/ 15),                     (int)Math.Min(255, vertex.Color.G + (LightIntensivity \/ distance) \/ 15),                     (int)Math.Min(255, vertex.Color.B + (LightIntensivity \/ distance) \/ 15));         }     }     public void UpdateDepthMap(IEnumerable&lt;Primitive&gt; primitives)     {         Rasterizer.ComputeVisibleVertices(primitives);     } } <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u0414\u043b\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u043e\u0439 \u0441\u0446\u0435\u043d\u044b \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043a\u0430\u0440\u0442\u044b \u0433\u043b\u0443\u0431\u0438\u043d, \u043f\u043e\u0441\u043b\u0435 \u0432\u043e \u0432\u0441\u0435\u0445 \u0444\u0440\u0435\u0439\u043c\u0430\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0435. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0439 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u043c\u0435\u043d\u0435\u0435 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430\u043b\u044c\u043d\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u0443\u0448\u043a\u0438. \u0412\u043e\u0442 \u0442\u0430\u043a\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/le\/_r\/3d\/le_r3ddgv91b0y--fqnjbphcpfo.png\" alt=\"image\" \/><\/div>\n<p>  \u041c\u043d\u043e\u0433\u0438\u0435 \u0438\u0437 \u0432\u0430\u0441 \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435 \u0437\u0430\u043c\u0435\u0442\u0438\u043b\u0438 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0448\u0435\u0439\u0434\u0435\u0440\u0430(\u043d\u0435\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0435 \u0441\u0432\u0435\u0442\u043e\u043c \u0447\u0435\u0440\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438). \u041e\u043f\u044f\u0442\u044c \u0436\u0435 \u043e\u0431\u0440\u0430\u0442\u0438\u0432\u0448\u0438\u0441\u044c \u0432 \u0432\u0441\u0435\u0437\u043d\u0430\u044e\u0449\u0443\u044e \u0441\u0435\u0442\u044c \u044f \u043d\u0430\u0448\u0435\u043b \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0430 \u0441 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u044b\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c <b>\u00abshadow acne\u00bb<\/b>(\u0434\u0430 \u043f\u0440\u043e\u0441\u0442\u044f\u0442 \u043c\u0435\u043d\u044f \u043b\u044e\u0434\u0438 \u0441 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043e\u043c \u0432\u043d\u0435\u0448\u043d\u043e\u0441\u0442\u0438). \u0421\u0443\u0442\u044c \u0442\u0430\u043a\u0438\u0445 \u00ab\u0437\u0430\u0437\u043e\u0440\u043e\u0432\u00bb \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0442\u0435\u043d\u0438 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043a\u0430\u0440\u0442\u044b \u0433\u043b\u0443\u0431\u0438\u043d. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0435\u0440\u0448\u0438\u043d \u043f\u0440\u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442 \u043e\u0434\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u043a\u0430\u0440\u0442\u044b \u0433\u043b\u0443\u0431\u0438\u043d. \u0422\u0430\u043a\u043e\u043c\u0443 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u0443 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0432\u0435\u0440\u0436\u0435\u043d\u044b \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0432\u0435\u0442 \u043f\u0430\u0434\u0430\u0435\u0442 \u043f\u043e\u0434 <b>\u043f\u043e\u043b\u043e\u0433\u0438\u043c<\/b> \u0443\u0433\u043b\u043e\u043c. \u042d\u0444\u0444\u0435\u043a\u0442 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c, \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0440\u0435\u043d\u0434\u0435\u0440\u0430 \u0434\u043b\u044f \u0441\u0432\u0435\u0442\u0430, \u043e\u0434\u043d\u0430\u043a\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 <b>\u0431\u043e\u043b\u0435\u0435 \u044d\u043b\u0435\u0433\u0430\u043d\u0442\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431<\/b>. \u0417\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u043d \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c <b>\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u0441\u0434\u0432\u0438\u0433 \u0434\u043b\u044f \u0433\u043b\u0443\u0431\u0438\u043d\u044b \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0443\u0433\u043b\u0430 \u043c\u0435\u0436\u0434\u0443 \u043b\u0443\u0447\u043e\u043c \u0441\u0432\u0435\u0442\u0430 \u0438 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c\u044e<\/b>. \u042d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f. <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0423\u043b\u0443\u0447\u0448\u0435\u043d\u043d\u044b\u0435 \u0442\u0435\u043d\u0438<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">public class ShadowMappingShader : IShader {     public Enviroment Enviroment { get; set; }     public Rasterizer Rasterizer { get; set; }     public Camera Camera =&gt; Rasterizer.Camera;     public Pivot Pivot =&gt; Camera.Pivot;     public Vertex[] ZBuffer =&gt; Rasterizer.ZBuffer;     public float LightIntensivity { get; set; }      public ShadowMappingShader(Enviroment enviroment, Rasterizer rasterizer, float lightIntensivity)     {         Enviroment = enviroment;         LightIntensivity = lightIntensivity;         Rasterizer = rasterizer;         \/\/\u044f \u0434\u043e\u0431\u0432\u0438\u043b \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0440\u0435\u043d\u0434\u0435\u0440\u0430, \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u0432 \u043a \u043d\u0438\u043c \u043f\u0435\u0440\u0435\u0440\u0430\u0441\u0447\u0435\u0442 \u043a\u0430\u0440\u0442\u044b \u0442\u0435\u043d\u0435\u0439         \/\/\u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0438\/\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0438 \u043a\u0430\u043c\u0435\u0440\u044b \u043b\u0438\u0431\u043e \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0441\u0446\u0435\u043d\u044b \u0448\u0435\u0439\u0434\u0435\u0440 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0433\u043b\u0443\u0431\u0438\u043d\u0443         Camera.OnRotate += () =&gt; UpdateDepthMap(Enviroment.Primitives);         Camera.OnMove += () =&gt; UpdateDepthMap(Enviroment.Primitives);         Enviroment.OnChange += () =&gt; UpdateDepthMap(Enviroment.Primitives);         UpdateVisible(Enviroment.Primitives);     }     public void ComputeShader(Vertex vertex, Camera camera)     {         \/\/\u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0432\u0435\u0440\u0448\u0438\u043d\u044b         var gPos = camera.Pivot.ToGlobalCoords(vertex.Position);         \/\/\u0434\u0438\u0441\u0442\u0430\u043d\u0446\u0438\u044f \u0434\u043e \u0441\u0432\u0435\u0442\u0430         var lghDir = Pivot.Center - gPos;         var distance = lghDir.Length();         var local = Pivot.ToLocalCoords(gPos);         var proectToLight = Camera.ScreenProection(local).ToPoint();         if (proectToLight.X &gt;= 0 && proectToLight.X &lt; Camera.ScreenWidth && proectToLight.Y &gt;= 0             && proectToLight.Y &lt; Camera.ScreenHeight)         {             int index = proectToLight.Y * Camera.ScreenWidth + proectToLight.X;             var n = Vector3.Normalize(vertex.Normal);             var ld = Vector3.Normalize(lghDir);             \/\/\u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0441\u0434\u0432\u0438\u0433 \u0433\u043b\u0443\u0431\u0438\u043d\u044b             float bias = (float)Math.Max(10 * (1.0 - VectorMath.Cross(n, ld)), 0.05);             if (ZBuffer[index] == null || ZBuffer[index].Position.Z + bias &gt;= local.Z)             {                 vertex.Color = Color.FromArgb(vertex.Color.A,                     (int)Math.Min(255, vertex.Color.R + LightIntensivity \/ distance),                     (int)Math.Min(255, vertex.Color.G + LightIntensivity \/ distance),                     (int)Math.Min(255, vertex.Color.B + LightIntensivity \/ distance));             }         }         else         {             vertex.Color = Color.FromArgb(vertex.Color.A,                     (int)Math.Min(255, vertex.Color.R + (LightIntensivity \/ distance) \/ 15),                     (int)Math.Min(255, vertex.Color.G + (LightIntensivity \/ distance) \/ 15),                     (int)Math.Min(255, vertex.Color.B + (LightIntensivity \/ distance) \/ 15));         }     }     public void UpdateDepthMap(IEnumerable&lt;Primitive&gt; primitives)     {         Rasterizer.ComputeVisibleVertices(primitives);     } } <\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/uv\/84\/u1\/uv84u1xbih12oilvuvll_obroa0.png\" alt=\"image\" \/><\/div>\n<p>  <\/div>\n<\/p><\/div>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0411\u043e\u043d\u0443\u0441<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<h3>\u0418\u0433\u0440\u0430\u0435\u043c \u0441 \u043d\u043e\u0440\u043c\u0430\u043b\u044f\u043c\u0438<\/h3>\n<p>  \u042f \u043f\u043e\u0434\u0443\u043c\u0430\u043b, \u0441\u0442\u043e\u0438\u0442 \u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u043e\u0440\u043c\u0430\u043b\u0435\u0439, \u0435\u0441\u043b\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u043c\u0435\u0436\u0434\u0443 3\u043c\u044f \u043d\u043e\u0440\u043c\u0430\u043b\u044f\u043c\u0438 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u0430 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0435\u0433\u043e \u0442\u043e\u0447\u043a\u0438. \u041e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u044f\u0446\u0438\u044f \u0434\u0430\u0435\u0442 \u043a\u0443\u0434\u0430 \u0431\u043e\u043b\u0435\u0435 \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438 \u0433\u043b\u0430\u0434\u043a\u0438\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/x2\/__\/gz\/x2__gzcuutdqk_0e4pndzewjc4a.jpeg\" alt=\"image\" \/><\/div>\n<h3>\u0414\u0432\u0438\u0433\u0430\u0435\u043c \u0441\u0432\u0435\u0442<\/h3>\n<p>  \u0420\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0432 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0446\u0438\u043a\u043b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043d\u0430\u0431\u043e\u0440 \u043e\u0442\u0440\u0435\u043d\u0434\u0435\u0440\u0435\u043d\u043d\u044b\u0445 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u044f\u043c\u0438 \u0441\u0432\u0435\u0442\u0430 \u043d\u0430 \u0441\u0446\u0435\u043d\u0435:<\/p>\n<pre><code class=\"cs\">            float angle = (float)Math.PI \/ 90;             var shader = (preparer.Shaders[0] as PhongModelShader);             for (int i = 0; i &lt; 180; i+=2)             {                 shader.Lights[0] = = new Light()                     {                         Pos = shader.Lights[0].Pos.Rotate(angle , Axis.X) ,                         Intensivity = shader.Lights[0].Intensivity                     };                 Draw();             } <\/code><\/pre>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ib\/wb\/3_\/ibwb3_cyxhev9zjhda5wgmalxys.gif\" alt=\"image\"\/>  <\/p>\n<h3>\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c<\/h3>\n<p>  \u0414\u043b\u044f \u0442\u0435\u0441\u0442\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438:<\/p>\n<ul>\n<li>\u041c\u043e\u0434\u0435\u043b\u044c \u0421\u0438\u043b\u044c\u0432\u0430\u043d\u044b: 220\u043a \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u043e\u0432.  <\/li>\n<li>\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u044d\u043a\u0440\u0430\u043d\u0430: 1920&#215;1080.  <\/li>\n<li>\u0428\u0435\u0439\u0434\u0435\u0440\u044b: Phong model shader  <\/li>\n<li>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430: cpu \u2014 core i7 4790, 8 gb ram  <\/li>\n<\/ul>\n<p>  FPS \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u043b 1-2 \u043a\u0430\u0434\u0440\/\u0441\u0435\u043a. \u042d\u0442\u043e \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 <b>realtime<\/b>. \u041e\u0434\u043d\u0430\u043a\u043e \u0441\u0442\u043e\u0438\u0442 \u0432\u0441\u0435 \u0436\u0435 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u0432\u0441\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u043b\u0430 \u0431\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438, \u0442.\u0435. \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u044f\u0434\u0440\u0435 cpu.   <\/div>\n<\/p><\/div>\n<p>  <\/p>\n<h1>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h1>\n<p>  \u042f \u0441\u0447\u0438\u0442\u0430\u044e \u0441\u0435\u0431\u044f \u043d\u043e\u0432\u0438\u0447\u043a\u043e\u043c \u0432 3\u0434 \u0433\u0440\u0430\u0444\u0438\u043a\u0435 \u043d\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u044e \u043e\u0448\u0438\u0431\u043e\u043a \u0434\u043e\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0445 \u043c\u043d\u043e\u044e \u0432 \u0445\u043e\u0434\u0435 \u0438\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043d\u0430 \u0447\u0442\u043e \u044f \u043e\u043f\u0438\u0440\u0430\u044e\u0441\u044c \u2014 \u044d\u0442\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f. \u0412\u0441\u0435 \u043f\u043e\u043f\u0440\u0430\u0432\u043a\u0438 \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438(\u0435\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0432\u044b\u0435 \u0431\u0443\u0434\u0443\u0442) \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445, \u044f \u0441 \u0440\u0430\u0434\u043e\u0441\u0442\u044c\u044e \u0438\u0445 \u043f\u0440\u043e\u0447\u0442\u0443. <a href=\"https:\/\/github.com\/DatoCenario\/DevilRender\">\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/a>.<\/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\/post\/520090\/\"> https:\/\/habr.com\/ru\/post\/520090\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/520090\/\">\u041f\u0440\u0438\u0432\u0435\u0442 \u043c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0414\u0430\u0432\u0438\u0434, \u0430 \u0432\u043e\u0442 \u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043f\u0435\u0440\u0441\u043e\u043d\u043e\u0439 \u043e\u0442\u0440\u0435\u043d\u0434\u0435\u0440\u0435\u043d\u043d\u044b\u0439 \u0441\u0432\u043e\u0438\u043c \u0441\u0430\u043c\u043e\u043f\u0438\u0441\u043d\u044b\u043c \u0440\u0435\u043d\u0434\u0435\u0440\u043e\u043c:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/5_\/lt\/wr\/5_ltwrycacudb2ueka_kmvulmve.png\" alt=\"image\" \/><\/div>\n<p>  \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e \u044f \u043d\u0435 \u0441\u043c\u043e\u0433 \u043d\u0430\u0439\u0442\u0438 \u0431\u043e\u043b\u0435\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e <i>\u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u0443\u044e<\/i> \u043c\u043e\u0434\u0435\u043b\u044c, \u043d\u043e \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u0432\u044b\u0440\u0430\u0436\u0430\u044e \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u043c\u043e\u0440\u0441\u043a\u043e\u043c\u0443 \u0441\u043a\u0443\u043b\u044c\u043f\u0442\u043e\u0440\u0443 \u0437\u0430\u043f\u0435\u0447\u0430\u0442\u043b\u0435\u0432\u0448\u0435\u043c\u0443 \u043c\u0435\u043d\u044f \u0432 \u0446\u0438\u0444\u0440\u0435! \u0418 \u043a\u0430\u043a \u0432\u044b \u0443\u0436\u0435 \u0434\u043e\u0433\u0430\u0434\u0430\u043b\u0438\u0441\u044c, \u0440\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0435\u0442 \u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 CPU \u2014 \u0440\u0435\u043d\u0434\u0435\u0440\u0430.  <\/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-310276","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/310276","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=310276"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/310276\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=310276"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=310276"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=310276"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}