{"id":326931,"date":"2022-01-10T08:41:40","date_gmt":"2022-01-10T08:41:40","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=326931"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=326931","title":{"rendered":"<span>3D \u0441\u0432\u043e\u0438\u043c\u0438 \u0440\u0443\u043a\u0430\u043c\u0438. \u0427\u0430\u0441\u0442\u044c 3: \u0447\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435 \u0432 \u043b\u0435\u0441, \u0442\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435 \u0434\u043e\u043c<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\" class=\"article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><img decoding=\"async\" src=\"\/img\/image-loader.svg\" alt=\"\" title=\"\" height=\"768\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e54\/601\/b68\/e54601b6859617f271db63f5af261d00.png\" data-width=\"1024\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0443\u0437\u043d\u0430\u0435\u043c \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u043a\u0430\u043c\u0435\u0440\u0430 \u0432 3D \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 (\u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u0432\u0438\u0434\u0430) \u0438 \u043a\u0430\u043a \u043e\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0443\u0437\u043d\u0430\u0435\u043c \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0447\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435 \u2014 \u043c\u0435\u043d\u044c\u0448\u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 (\u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438).\u00a0 <\/p>\n<p>\u041c\u044b \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0443 \u043d\u0430\u0434 \u043a\u043e\u0434\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443 \u043d\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0432 \u0444\u0438\u043d\u0430\u043b\u0435 <a href=\"https:\/\/habr.com\/ru\/post\/497808\/\" rel=\"noopener noreferrer nofollow\">2-\u0439 \u0447\u0430\u0441\u0442\u0438<\/a>.\u00a0 \u0418 \u043d\u0430\u0447\u043d\u0435\u043c \u0441 \u043e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u044f \u043a\u0430\u043c\u0435\u0440\u044b \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 (\u043c.\u0431. \u0432 3D \u0438\u0433\u0440\u0435). <\/p>\n<p>\u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u043e\u043f\u0438\u0441\u0430\u043b\u0438 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 8-\u043c\u0438 \u0432\u0435\u0440\u0448\u0438\u043d \u043a\u0443\u0431, \u0438 \u0432\u0441\u0435 \u0435\u0433\u043e \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0431\u044b\u043b\u0438 \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 <code>[-1, 1]<\/code> \u0438 \u043c\u044b \u0438\u0445 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0438\u043b\u0438 \u0442\u0430\u043a, \u0447\u0442\u043e \u0446\u0435\u043d\u0442\u0440 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 <code>[0, 0, 0]<\/code>, \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0442\u0430\u043a\u0436\u0435 \u0446\u0435\u043d\u0442\u0440\u043e\u043c \u043d\u0430\u0448\u0435\u0433\u043e \u043a\u0443\u0431\u0430. \u042d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0431\u044b\u043b\u043e \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0430\u043a. \u0412\u0441\u043f\u043e\u043c\u043d\u0438\u043c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0441 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0433\u0434\u0435 \u043c\u044b \u0432\u0440\u0430\u0449\u0430\u043b\u0438 \u043a\u0443\u0431 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u043e\u043a\u0440\u0443\u0433 \u043e\u0441\u0438 <code>X<\/code>, \u0430 \u043f\u043e\u0442\u043e\u043c \u0432\u043e\u043a\u0440\u0443\u0433 \u043e\u0441\u0438 <code>Y<\/code>, \u043f\u043e\u0442\u043e\u043c \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u043b\u0438 \u043a\u0443\u0431 \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u043b\u0438, \u0442\u0430\u043c \u043c\u044b \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b\u0438 \u043f\u0440\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438\u00a0 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043c\u0430\u0442\u0440\u0438\u0446\u0430\u043c\u0438 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e, \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0432\u043e\u043a\u0440\u0443\u0433 \u043e\u0441\u0435\u0439 \u0438\u043c\u0435\u0435\u0442\u00a0 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0438 \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0440\u0430\u0437\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u0412\u0441\u0435 \u044d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u043b\u043e \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043a\u0443\u0431, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043e\u043a\u0440\u0443\u0433 \u043e\u0441\u0438 <code>X<\/code>, \u0442\u043e \u0435\u0433\u043e \u043e\u0441\u044c <code>Y<\/code>, \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u043b\u0430 \u0431\u044b \u0441\u043c\u0435\u0441\u0442\u0438\u0442\u044c\u0441\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043a\u0443\u0431\u0438\u043a \u0420\u0443\u0431\u0438\u043a\u0430 \u0432 \u0441\u043e\u0431\u0440\u0430\u043d\u043e\u043c \u0432\u0438\u0434\u0435, \u0438 \u0435\u0433\u043e \u0441\u0438\u043d\u044f\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430 \u0441\u043c\u043e\u0442\u0440\u0438\u0442 \u0432\u0432\u0435\u0440\u0445 \u0438 \u043e\u0441\u044c <code>Y<\/code> \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437\u00a0 \u0435\u0435 \u0446\u0435\u043d\u0442\u0440. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043b\u0435\u0433\u043a\u043e\u00a0 \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u0433\u0434\u0435 \u043e\u0441\u044c <code>Y<\/code> (\u0442\u0430\u043c\u00a0 \u0433\u0434\u0435 \u0441\u0438\u043d\u044f\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430). <\/p>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043d\u0430 90 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432 \u043a\u0443\u0431\u0438\u043a \u0420\u0443\u0431\u0438\u043a\u0430 \u0432\u043e\u043a\u0440\u0443\u0433 \u043e\u0441\u0438 <code>X<\/code>, \u0438 \u0441\u0438\u043d\u044f\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430 \u043a\u0443\u0431\u0438\u043a\u0430 \u0434\u043e\u043b\u0436\u043d\u0430\u00a0 \u0441\u0442\u0430\u0442\u044c \u043b\u0438\u0446\u043e\u043c \u043a \u043d\u0430\u043c \u0438\u043b\u0438 \u043e\u0442 \u043d\u0430\u0441 (\u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u0432 \u043a\u0430\u043a\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u0432\u0440\u0430\u0449\u0430\u043b\u0438), \u043d\u043e \u0432 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u0438\u043d\u044f\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0432\u0432\u0435\u0440\u0445, \u0442.\u0435. \u0432\u00a0 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435\u043c, \u043e\u0441\u044c <code>Y<\/code> \u0442\u0435\u043f\u0435\u0440\u044c \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438, \u0438 \u0435\u0441\u043b\u0438 \u0431\u044b \u043c\u044b \u0432\u0440\u0430\u0449\u0430\u043b\u0438 \u043a\u0443\u0431\u0438\u043a \u0420\u0443\u0431\u0438\u043a\u0430\u00a0 \u0432\u043e\u043a\u0440\u0443\u0433 \u043e\u0441\u0438 <code>Y<\/code>, \u0442\u043e\u00a0 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u043b\u0438 \u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0432\u043e\u043a\u0440\u0443\u0433 \u0432\u0441\u0435 \u0442\u043e\u0439 \u0436\u0435 \u0441\u0438\u043d\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u043d\u043e \u043d\u0435\u0442, \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u043a\u0440\u0443\u0433 \u043d\u043e\u0432\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043a\u0443\u0431\u0438\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u043c\u043e\u0442\u0440\u0438\u0442 \u0432\u0432\u0435\u0440\u0445, \u0432\u043c\u0435\u0441\u0442\u043e \u0441\u0438\u043d\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b. \u0422.\u0435. \u0432 \u043d\u0430\u0448\u0438\u0445 \u043c\u0430\u0442\u0440\u0438\u0446\u0430\u0445 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043e\u0441\u0438 \u043d\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u044b \u043a 3D \u043c\u043e\u0434\u0435\u043b\u044f\u043c \u0438 \u043c\u043e\u0434\u0435\u043b\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u0432\u043e\u043a\u0440\u0443\u0433 \u043e\u0441\u0435\u0439, \u0441\u043c\u043e\u0442\u0440\u044f\u0449\u0438\u043c \u0432\u0432\u0435\u0440\u0445\\\u0432\u043f\u0440\u0430\u0432\u043e\\\u043a \u043d\u0430\u043c, \u0432 \u043d\u0430\u0448\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u00a0 (\u0435\u0449\u0435 \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u044b\u0435 \u043e\u0441\u0438), \u0438\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0432\u043e\u043a\u0440\u0443\u0433 \u0442\u043e\u0447\u043a\u0438 <code>0, 0, 0<\/code>. \u0418\u0437 \u044d\u0442\u043e\u0433\u043e \u0442\u0430\u043a\u0436\u0435 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0435\u0449\u0435 \u043f\u0430\u0440\u0430 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439, \u0435\u0441\u043b\u0438 \u043d\u0430\u0448\u0443 \u0444\u0438\u0433\u0443\u0440\u0443 \u043a\u0443\u0431\u0430, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0432\u043f\u0440\u0430\u0432\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430 10 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439, \u0430 \u043f\u043e\u0442\u043e\u043c \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u043e\u043a\u0440\u0443\u0433 \u043b\u044e\u0431\u043e\u0439 \u043e\u0441\u0438, \u0442\u043e \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u0447\u0442\u043e \u043a\u0443\u0431 \u043d\u0435 \u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432\u043e\u043a\u0440\u0443\u0433 \u0441\u0432\u043e\u0435\u0433\u043e \u0446\u0435\u043d\u0442\u0440\u0430, \u0430 \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0440\u0430\u0434\u0438\u0443\u0441\u043e\u043c \u0432\u043e\u043a\u0440\u0443\u0433 \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u0446\u0435\u043d\u0442\u0440\u0430 <code>0, 0, 0<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b\u043b \u0434\u043e \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u043c\u044b \u043f\u043e\u0434\u0432\u0438\u043d\u0443\u043b\u0438 \u043a\u0443\u0431 \u043d\u0430 10 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0432\u043f\u0440\u0430\u0432\u043e. \u042d\u0442\u043e \u0435\u0449\u0435 \u0440\u0430\u0437 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442 \u0442\u043e, \u0447\u0442\u043e \u0432\u0441\u0435 \u0444\u0438\u0433\u0443\u0440\u044b \u043c\u043e\u0433\u0443\u0442 \u0432\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e, \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043a\u0430 \u043e\u043d\u0438 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442, \u0432\u043e\u043a\u0440\u0443\u0433 \u0442\u043e\u0447\u043a\u0438 <code>0, 0, 0<\/code>. \u042d\u0442\u043e \u043d\u0435\u00a0 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u0430\u0433\u043e\u0439, \u0442.\u043a. \u0443 \u043d\u0430\u0441 \u0432\u043f\u043e\u043b\u043d\u0435\u00a0 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0430 \u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043a\u0443\u0431, \u043d\u0435 \u0432\u043e\u043a\u0440\u0443\u0433 \u0441\u0432\u043e\u0435\u0433\u043e \u0446\u0435\u043d\u0442\u0440\u0430, \u0430 \u0432\u043e\u043a\u0440\u0443\u0433\u00a0 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0442\u043e\u0447\u043a\u0438 \u0432 \u0438\u0433\u0440\u0435:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"\/img\/image-loader.svg\" alt=\"\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u0440\u0430\u0449\u0430\u0435\u043c, \u043f\u043e\u0442\u043e\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c\" title=\"\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u0440\u0430\u0449\u0430\u0435\u043c, \u043f\u043e\u0442\u043e\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c\" height=\"665\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/acc\/b29\/0d3\/accb290d37c47d09b6281ee60ebecb67.gif\" data-width=\"884\"\/><figcaption>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u0440\u0430\u0449\u0430\u0435\u043c, \u043f\u043e\u0442\u043e\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c<\/figcaption><\/figure>\n<figure class=\"bordered full-width\"><img decoding=\"async\" src=\"\/img\/image-loader.svg\" alt=\"\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c, \u043f\u043e\u0442\u043e\u043c \u0432\u0440\u0430\u0449\u0430\u0435\u043c\" title=\"\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c, \u043f\u043e\u0442\u043e\u043c \u0432\u0440\u0430\u0449\u0430\u0435\u043c\" height=\"560\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/74a\/c15\/b76\/74ac15b76b733f6bd992508f31c3ade0.gif\" data-width=\"761\"\/><figcaption>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c, \u043f\u043e\u0442\u043e\u043c \u0432\u0440\u0430\u0449\u0430\u0435\u043c<\/figcaption><\/figure>\n<p> \u0418\u0437 \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0432\u044b\u0432\u043e\u0434: \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0444\u0438\u0433\u0443\u0440\u0443 \u0432 \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0432 \u0438\u0433\u0440\u0435, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0435\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044c, \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044c, \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u00a0 \u0432\u0441\u0435 \u043d\u0443\u0436\u043d\u044b\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f. \u0412\u0441\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0444\u0438\u0433\u0443\u0440\u044b, \u0434\u043e \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u043c\u044b \u0435\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u043b\u0438 \u043a\u0443\u0434\u0430 \u043b\u0438\u0431\u043e \u0432 \u0438\u0433\u0440\u0435, \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435\u00a0 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b. \u0410 \u0435\u0441\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u0438 \u043f\u0435\u0440\u0435\u043c\u043d\u043e\u0436\u0438\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439 \u0432\u0441\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0434\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438, \u0438 \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u043c\u043d\u043e\u0436\u0438\u0442\u044c \u0442\u0443\u0434\u0430 \u043c\u0430\u0442\u0440\u0438\u0446\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u0442 \u043c\u043e\u0434\u0435\u043b\u044c \u0432 \u043d\u0443\u0436\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u0432 \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u0441\u0446\u0435\u043d\u0435, \u0442\u043e \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0435\u0439 \u043c\u043e\u0434\u0435\u043b\u0438, \u0442.\u043a. \u043e\u043d\u0430 \u0434\u0435\u043b\u0430\u0435\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430\u0434 \u043a\u0430\u0436\u0434\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u043e\u0439 \u043e\u0434\u043d\u043e\u0439 3D \u043c\u043e\u0434\u0435\u043b\u0438 \u0442\u0430\u043a, \u0447\u0442\u043e \u0442\u0430 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0443\u0436\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u0432 \u0438\u0433\u0440\u0435. \u0418 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0432\u0435\u0440\u0448\u0438\u043d \u043c\u043e\u0434\u0435\u043b\u0438, \u043f\u043e\u0441\u043b\u0435 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u043c\u0430\u0442\u0440\u0438\u0446\u0435\u0439 \u043c\u043e\u0434\u0435\u043b\u0438, \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u0443\u0436\u0435 \u043d\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u043c\u0438, \u0430 \u043c\u0438\u0440\u043e\u0432\u044b\u043c\u0438 (\u0442\u0430\u043a\u0436\u0435 \u0438\u0445 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u2014 \u043c\u0438\u0440\u043e\u0432\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b). \u041c\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c, \u0447\u0442\u043e \u0443 \u043c\u043e\u0434\u0435\u043b\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0438 \u043c\u0438\u0440\u043e\u0432\u044b\u0435.\u00a0 \u041c\u044b \u0435\u0449\u0435 \u043a \u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u0432\u0441\u0435\u00a0\u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435, \u0430 \u0441\u0435\u0439\u0447\u0430\u0441 \u0436\u0435, \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0432\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435 \u043a \u0435\u0449\u0435 \u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u0442\u0440\u0438\u0446\u0435 &#8212; \u043c\u0430\u0442\u0440\u0438\u0446\u0435 \u0432\u0438\u0434\u0430. <\/p>\n<p>\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0432 API \u043a\u0430\u043d\u0432\u0430\u0441 \u0442\u0430\u043a \u0437\u0430\u043b\u043e\u0436\u0435\u043d\u043e, \u0447\u0442\u043e \u0442\u043e\u0447\u043a\u0430 <code>0, 0<\/code> \u044d\u0442\u043e \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u043b\u0435\u0432\u044b\u0439 \u0443\u0433\u043e\u043b \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0435\u0441\u043b\u0438 \u0431\u044b \u043c\u044b \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u043b\u0438 \u043d\u0430\u0448 \u043a\u0443\u0431 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 (\u043e\u0442 <code>-1<\/code>, \u0434\u043e <code>1<\/code> \u043f\u043e \u0432\u0441\u0435\u043c \u043e\u0441\u044f\u043c) \u0442\u043e \u043c\u044b \u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u044c \u043a\u0443\u0431\u0430 \u0432 \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u043b\u0435\u0432\u043e\u043c \u0443\u0433\u043b\u0443, \u0442.\u043a. \u0432\u0441\u044f \u0435\u0433\u043e \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0431\u044b\u043b\u0430 \u0431\u044b \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 \u044d\u043a\u0440\u0430\u043d\u0430, \u043d\u043e \u0447\u0442\u043e\u0431\u044b \u043a\u0443\u0431 \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043f\u043e \u0446\u0435\u043d\u0442\u0440\u0443 \u044d\u043a\u0440\u0430\u043d\u0430 \u0438 \u043c\u044b \u0435\u0433\u043e \u0432\u0438\u0434\u0435\u043b\u0438 \u0446\u0435\u043b\u0438\u043a\u043e\u043c, \u0435\u0433\u043e \u0443\u043c\u043d\u043e\u0436\u0438\u043b\u0438 \u043d\u0430 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f <code>Matrix.getTranslation(400, -300, 0)<\/code> \u0438 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u043b\u0438 \u043a\u0443\u0431 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0442\u043e\u0447\u043d\u043e \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u043e\u043a\u043d\u0430. \u042d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u043a\u043b\u044e\u0447\u0435\u0432\u0430\u044f \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u0430\u043c\u0435\u0440\u044b \u0432 3D \u0438\u0433\u0440\u0430\u0445 \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445, \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e \u0437\u0430\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0435 \u043d\u0430\u0447\u0430\u043b\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0432 API Canvas (\u044d\u0442\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 <code>0, 0<\/code> \u0432 \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u043b\u0435\u0432\u043e\u043c \u0443\u0433\u043b\u0443) \u043d\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u0432\u0438\u0433\u0430\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0435\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b <code>X, Y<\/code> \u0441\u043e\u0432\u043f\u0430\u043b\u0438 \u0432 \u0432\u0438\u0434\u0438\u043c\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u044c\u044e \u043e\u043a\u043d\u0430 (\u043e\u0442 <code>0<\/code> \u0434\u043e <code>800<\/code> \u043f\u043e <code>X<\/code> \u0438 \u043e\u0442 <code>0<\/code> \u0434\u043e <code>600<\/code> \u043f\u043e <code>Y<\/code> \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435), \u0432\u0435\u0434\u044c \u0435\u0441\u043b\u0438 \u043c\u044b \u043d\u0430\u0440\u0438\u0441\u0443\u0435\u043c \u043c\u043e\u0434\u0435\u043b\u044c \u0432 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u0445 <code>1000, 1000<\/code>, \u0442\u043e \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u0438\u043b\u044c\u043d\u043e \u043d\u0438\u0436\u0435 \u0438 \u043f\u0440\u0430\u0432\u0435\u0435 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f <code>canvas<\/code> \u0438 \u0442\u0430\u043a\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u0432 \u043e\u043a\u043d\u0435 \u043c\u044b\u00a0 \u043d\u0435 \u0443\u0432\u0438\u0434\u0438\u043c. \u0415\u0441\u043b\u0438 \u0445\u043e\u0442\u0438\u043c \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u0445 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f, \u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0435\u0435 \u043f\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0430 \u0431\u044b\u043b\u0430 \u0432 \u0435\u0435 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445, \u0438\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u043c\u044b \u0434\u0432\u0438\u0433\u0430\u0435\u043c \u043d\u0435 \u043a\u0430\u043c\u0435\u0440\u0443, \u0430 \u0441\u0430\u043c \u043e\u0431\u044a\u0435\u043a\u0442. \u0412 \u0438\u0433\u0440\u0430\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u0442\u0430\u043a\u043e\u0435 \u0436\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u2014 \u043c\u044b \u0434\u0432\u0438\u0433\u0430\u0435\u043c \u0432\u0441\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 (\u0432\u0435\u0441\u044c \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u043c\u0438\u0440) \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u043f\u043e\u0434 \u043d\u0443\u0436\u043d\u044b\u043c \u0440\u0430\u043a\u0443\u0440\u0441\u043e\u043c \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u043a\u043d\u0430.<\/p>\n<p>\u0414\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0443\u0436\u0435 \u0438\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u043a\u0430\u043c\u0435\u0440\u0443 (\u0445\u043e\u0442\u044c \u0438 \u043d\u0435 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b\u0438 \u044d\u0442\u043e) \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u043a\u0443\u0431\u043e\u043c, \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f, \u043a\u043e\u0433\u0434\u0430\u00a0 \u0434\u0432\u0438\u0433\u0430\u043b\u0438 \u043a\u0443\u0431 \u043d\u0438\u0436\u0435\\\u043f\u0440\u0430\u0432\u0435\u0435, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043b\u0441\u044f \u0432 \u043e\u043a\u043d\u0435. \u041d\u043e \u044d\u0442\u043e \u043d\u0435 \u0441\u0430\u043c\u044b\u0439 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u0442.\u043a. \u0443 \u043a\u0430\u043c\u0435\u0440\u044b \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0447\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u00a0 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443 \u043a\u0430\u043c\u0435\u0440\u044b \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 (\u043c\u0435\u0441\u0442\u043e\u00a0 \u043e\u0442\u043a\u0443\u0434\u0430 \u043c\u044b \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0438\u043b\u0438 \u043c\u0435\u0441\u0442\u043e, \u0433\u0434\u0435 \u0441\u0435\u0439\u0447\u0430\u0441 \u0441\u0442\u043e\u0438\u0442 \u0438\u0433\u0440\u043e\u043a \u043e\u0442 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043b\u0438\u0446\u0430) \u0430 \u0442\u0430\u043a\u0436\u0435 \u0442\u043e\u0447\u043a\u0430 \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0432\u0435\u0434\u044c, \u0441\u0442\u043e\u044f \u043d\u0430 \u043c\u0435\u0441\u0442\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043a\u0440\u0443\u0442\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043e\u0439 \u043a\u0443\u0434\u0430 \u0437\u0430\u0445\u043e\u0442\u0438\u043c. \u0410 \u0442\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c \u0435\u0449\u0435 \u0442\u0440\u0435\u0442\u0438\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440, \u0432\u0435\u043a\u0442\u043e\u0440 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0432\u0435\u0440\u0445, \u043e\u043d \u043d\u0443\u0436\u0435\u043d \u0447\u0442\u043e\u0431\u044b \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0433\u0434\u0435 \u0432 3D-\u043c\u0438\u0440\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u0435\u0440\u0445, \u0430 \u0433\u0434\u0435 \u043d\u0438\u0437, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0435\u0440\u0435\u0432\u0435\u0440\u043d\u0443\u0442\u044c 3D-\u0441\u0446\u0435\u043d\u0443 \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u043c\u043e\u043c\u0435\u043d\u0442 \u0432 \u0438\u0433\u0440\u0435, \u0433\u0434\u0435 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436 \u0445\u043e\u0434\u0438\u0442 \u043f\u043e \u043f\u043e\u0442\u043e\u043b\u043a\u0443, \u0438\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435, \u043c\u044b \u044d\u0442\u043e \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435.<\/p>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043c\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043c\u0435\u0440\u0443 \u0432 \u0441\u0446\u0435\u043d\u0435, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u0448 \u043a\u0443\u0431, \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043c \u0432 \u0443\u0441\u0435\u0447\u0435\u043d\u043d\u0443\u044e \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0443 (\u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0443, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0440\u043e\u0432\u043d\u043e \u0441\u0440\u0435\u0437\u0430\u043b\u0438 \u0432\u0435\u0440\u0445\u0443\u0448\u043a\u0443, \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0430\u044f \u0447\u0435\u0442\u044b\u0440\u0435\u0445\u0443\u0433\u043e\u043b\u044c\u043d\u0430\u044f \u0443\u0441\u0435\u0447\u0435\u043d\u043d\u0430\u044f \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0430), \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0447\u0442\u043e\u0431\u044b \u0432\u0438\u0434\u0435\u0442\u044c \u0433\u0434\u0435 \u0443 \u043d\u0430\u0448\u0435\u0439 \u0444\u0438\u0433\u0443\u0440\u044b \u0432\u0435\u0440\u0445, \u0432\u0435\u0434\u044c \u0435\u0441\u043b\u0438 \u043a\u0443\u0431 \u043f\u0435\u0440\u0435\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0432\u0435\u0440\u0445-\u043d\u043e\u0433\u0430\u043c\u0438 \u0442\u043e \u0434\u043b\u044f \u043d\u0430\u0441, \u043a\u0430\u043a \u0434\u043b\u044f \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044f \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u043e\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f. \u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0443\u0441\u0435\u0447\u0435\u043d\u043d\u043e\u0439 \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u044b \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443 \u043a\u0443\u0431\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b (\u0442\u0435 \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 <code>Y=1<\/code>) \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0431\u043b\u0438\u0436\u0435 \u043a \u043e\u0441\u0438 <code>Y<\/code>. <code>Y<\/code> \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u043f\u0440\u0435\u0436\u043d\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0430 \u0431\u044b\u043b\u0430 \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u0432\u044b\u0441\u043e\u0442\u044b \u043a\u0430\u043a \u0438 \u043a\u0443\u0431, \u0430 <code>X<\/code> \u0438 <code>Z<\/code> \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0440\u0430\u0432\u043d\u044b\u043c\u0438 <code>0.5<\/code> \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u0432\u0435\u0440\u0448\u0438\u043d:<\/p>\n<pre><code class=\"javascript\">const vertices = [ \u00a0\u00a0new Vector(-0.5, 1, 0.5), \/\/ 0 \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u00a0\u00a0new Vector(-0.5, 1, -0.5), \/\/ 1 \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u00a0\u00a0new Vector(0.5, 1, -0.5), \/\/ 2 \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u00a0\u00a0new Vector(0.5, 1, 0.5), \/\/ 3 \u0432\u0435\u0440\u0448\u0438\u043d\u0430   new Vector(-1, -1, 1), \/\/ 4 \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u00a0\u00a0new Vector(-1, -1, -1), \/\/ 5 \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u00a0\u00a0new Vector(1, -1, -1), \/\/ 6 \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u00a0\u00a0new Vector(1, -1, 1), \/\/ 7 \u0432\u0435\u0440\u0448\u0438\u043d\u0430 ];<\/code><\/pre>\n<p> \u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u044b \u0437\u0430\u043c\u0435\u043d\u0438\u043b\u0438 <code>X<\/code> \u0438 <code>Z<\/code> \u043d\u0430 <code>0.5<\/code> \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0432\u0435\u0440\u0448\u0438\u043d \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 <code>Y = 1<\/code>, \u0442.\u0435. \u0434\u043b\u044f \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043a\u0443\u0431\u0430, \u0438 \u0442\u0430\u043a\u0436\u0435 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0432 \u043c\u0435\u0441\u0442\u0435, \u0433\u0434\u0435 \u043c\u044b \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u0443\u0435\u043c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f (\u043f\u0435\u0440\u0435\u043c\u043d\u043e\u0436\u0430\u0435\u043c \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439) \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e \u0441 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 (\u0441\u0430\u043c <code>setInterval<\/code> \u043e\u0441\u0442\u0430\u0432\u0438\u043c, \u043e\u043d \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0437\u0436\u0435), \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u0433\u0434\u0435 \u043c\u044b \u0437\u0430\u0434\u0430\u0435\u043c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043f\u043e <code>Y<\/code>, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>20<\/code> :<\/p>\n<pre><code class=\"javascript\">matrix = Matrix.multiply(   \/\/ Matrix.getRotationY(angle += 1), - \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435   Matrix.getRotationY(20), \/\/ - \u043d\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 20 (\u0431\u0435\u0437 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438)   matrix );<\/code><\/pre>\n<p> \u0422\u0430\u043a\u0436\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u043e\u0441\u0435\u0439 <code>X\/Y\/Z<\/code> \u0441 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 (\u0445\u043e\u0442\u044f \u044d\u0442\u043e \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043e\u043d \u043d\u0430\u043c \u043c\u0435\u0448\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u0442). \u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u0443 \u0432\u0430\u0441 \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0442\u0430\u043a\u0430\u044f 3D-\u043c\u043e\u0434\u0435\u043b\u044c: <\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"\/img\/image-loader.svg\" height=\"1200\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4fd\/995\/9f9\/4fd9959f94a072cb304e7138fecd1e2a.png\" data-width=\"1600\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043b\u0435\u0433\u0447\u0435 \u0432\u0441\u0435\u0433\u043e \u0431\u044b\u043b\u043e \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043a\u0430\u043c\u0435\u0440\u044b, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e: \u0433\u0434\u0435 \u043c\u044b \u0441\u0442\u043e\u0438\u043c \u0438 \u043a\u0443\u0434\u0430 \u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0430, \u0435\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043c\u0430\u0442\u0440\u0438\u0446\u0435\u0439 \u0432\u0438\u0434\u0430 (view marix), \u0438 \u0435\u0435 \u0441\u0443\u0442\u044c \u043f\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0432\u0435\u0441\u044c \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u043c\u0438\u0440 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u043f\u043e\u0434 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u043c \u0440\u0430\u043a\u0443\u0440\u0441\u043e\u043c \u0438 \u0441\u043e\u0437\u0434\u0430\u043b\u0441\u044f \u044d\u0444\u0444\u0435\u043a\u0442 \u0431\u0443\u0434\u0442\u043e \u043c\u044b \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0441\u0446\u0435\u043d\u0443 \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438, \u0445\u043e\u0442\u044f \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u044d\u0442\u043e \u0441\u0446\u0435\u043d\u0430 \u0442\u0430\u043a \u043f\u043e\u0434\u0432\u0438\u043d\u0443\u043b\u0430\u0441\u044c \u043a \u043d\u0430\u043c. \u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u0443 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c, \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f 2 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430\u0434 \u0432\u0435\u043a\u0442\u043e\u0440\u0430\u043c\u0438, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e, \u0432\u044b\u0447\u0438\u0442\u0430\u043d\u0438\u0435 \u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435. \u0412\u044b\u0447\u0438\u0442\u0430\u043d\u0438\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 (\u043c\u0435\u0442\u043e\u0434 <code>add<\/code>) \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0443\u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u043b\u0438 \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u043a\u043b\u0430\u0441\u0441 \u0432\u0435\u043a\u0442\u043e\u0440 \u0435\u0449\u0435 \u0438 \u0432\u044b\u0447\u0438\u0442\u0430\u043d\u0438\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432: <\/p>\n<pre><code class=\"javascript\">static substruct(v1, v2) { \u00a0\u00a0return new Vector( \u00a0\u00a0\u00a0\u00a0v1.x - v2.x, \u00a0\u00a0\u00a0\u00a0v1.y - v2.y, \u00a0\u00a0\u00a0\u00a0v1.z - v2.z, \u00a0\u00a0) }<\/code><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0432\u044b\u0447\u0438\u0442\u0430\u043d\u0438\u044f \u0434\u0432\u0443\u0445 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 <code>v1<\/code> \u0438 <code>v2<\/code> \u0431\u0443\u0434\u0435\u0442 \u0442\u0440\u0435\u0442\u0438\u0439 \u0432\u0435\u043a\u0442\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u0441\u043b\u043e\u0436\u0438\u0442\u044c \u0441\u043e \u0432\u0442\u043e\u0440\u044b\u043c \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u043c <code>v2<\/code> \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u043e <code>v1<\/code>. \u0421\u0435\u0439\u0447\u0430\u0441 \u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u0432\u043d\u0438\u043a\u0430\u0442\u044c \u0432 \u044d\u0442\u0443 \u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u043a\u0443, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u043a\u0430\u043a \u044d\u0442\u043e \u0432\u044b\u0447\u0438\u0442\u0430\u043d\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f. <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432, \u044d\u0442\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0447\u0443\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0434\u0432\u0443\u0445 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432, \u0431\u0443\u0434\u0435\u0442 \u0442\u0440\u0435\u0442\u0438\u0439 \u0432\u0435\u043a\u0442\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0435\u0440\u043f\u0435\u043d\u0434\u0438\u043a\u0443\u043b\u044f\u0440\u0435\u043d \u043f\u0435\u0440\u0432\u044b\u043c \u0434\u0432\u0443\u043c, \u0438 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043c\u044b \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u044d\u0442\u0443 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u043d\u0430\u0434 \u0432\u0435\u043a\u0442\u043e\u0440\u0430\u043c\u0438 \u043f\u043e\u0437\u0436\u0435, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0447\u043d\u0435\u043c \u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u043d\u043e\u0440\u043c\u0430\u043b\u044f\u043c\u0438, \u0430 \u0441\u0435\u0439\u0447\u0430\u0441 \u0436\u0435 \u043e\u043d \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u043f\u043e \u0444\u043e\u0440\u043c\u0443\u043b\u0435 \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0432\u0438\u0434\u0430. \u041c\u0435\u0442\u043e\u0434 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043c \u0432 \u043a\u043b\u0430\u0441\u0441 <code>Vector<\/code>:<\/p>\n<pre><code class=\"javascript\">static crossProduct(v1, v2) { \u00a0\u00a0return new Vector( \u00a0\u00a0\u00a0\u00a0v1.y * v2.z - v1.z * v2.y, \u00a0\u00a0\u00a0\u00a0v1.z * v2.x - v1.x * v2.z, \u00a0\u00a0\u00a0\u00a0v1.x * v2.y - v1.y * v2.x, \u00a0\u00a0) }<\/code><\/pre>\n<p>\u041c\u0430\u0442\u0440\u0438\u0446\u0443, \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0434\u043b\u044f \u0438\u043c\u0438\u0442\u0430\u0446\u0438\u0438 \u043a\u0430\u043c\u0435\u0440\u044b \u0442\u0430\u043a\u0436\u0435 \u043a\u0430\u043a \u0432\u0441\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043a\u0430\u043a \u043c\u0435\u0442\u043e\u0434 \u0432 \u043a\u043b\u0430\u0441\u0441 <code>Matrix<\/code>: <\/p>\n<pre><code class=\"javascript\">static getLookAt(eye, target, up) { \u00a0\u00a0const vz = Vector.substruct(eye, target).normalize() \u00a0\u00a0const vx = Vector.crossProduct(up, z).normalize() \u00a0\u00a0const vy = Vector.crossProduct(z, x)   return [ \u00a0\u00a0\u00a0\u00a0[vx.x, vy.x, vz.x, -eye.x], \u00a0\u00a0\u00a0\u00a0[vx.y, vy.y, vz.y, -eye.y], \u00a0\u00a0\u00a0\u00a0[vx.z, vy.z, vz.z, -eye.z], \u00a0\u00a0\u00a0\u00a0[0, 0, 0, 1], \u00a0\u00a0] }<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c \u043c\u0435\u0442\u043e\u0434 <code>getLookAt<\/code> \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 3 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430, <code>eye<\/code> \u2014 \u044d\u0442\u043e \u043d\u0430\u0448\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u043c\u043e\u0442\u0440\u0438\u043c (\u0438\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0433\u043b\u0430\u0437\u0430 \u0438\u043b\u0438 \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430 \u0441 \u0432\u0438\u0434\u043e\u043c \u043e\u0442 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043b\u0438\u0446\u0430), <code>target<\/code> &#8212; \u044d\u0442\u043e \u0442\u043e\u0447\u043a\u0430 \u0432 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u0441\u043c\u043e\u0442\u0440\u0438\u043c, <code>up<\/code> &#8212; \u0432\u0435\u043a\u0442\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0433\u0434\u0435 \u0441\u0435\u0439\u0447\u0430\u0441 \u0432\u0435\u0440\u0445, \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0441\u043b\u0438 \u043c\u044b \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u0445\u043e\u0442\u0438\u043c \u043f\u0435\u0440\u0435\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043b\u0438 \u043d\u0430\u043a\u043b\u043e\u043d\u0438\u0442\u044c \u0432\u0441\u044e \u0441\u0446\u0435\u043d\u0443 (\u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445). \u0418 \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u0435\u0440\u0435\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0432\u0435\u0440\u0448\u0438\u043d 3D-\u043c\u043e\u0434\u0435\u043b\u0438 \u0441 \u0442\u0430\u043a\u043e\u0439 \u043c\u0430\u0442\u0440\u0438\u0446\u0435\u0439 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043d\u043e\u0432\u044b\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432\u0435\u0440\u0448\u0438\u043d, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044b \u0442\u0430\u043a, \u043a\u0430\u043a \u0435\u0441\u043b\u0438 \u0431\u044b \u043d\u0430 \u043d\u0438\u0445 \u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u043f\u043e\u0434 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438 (<code>eye<\/code>, <code>target<\/code>, <code>up<\/code>) \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0435\u0439\u0447\u0430\u0441 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u044d\u0442\u0443 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0432 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0435 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u041d\u043e \u043f\u0435\u0440\u0435\u0434 \u044d\u0442\u0438\u043c &#8212; \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u043c \u043e\u0434\u043d\u0443 \u043e\u0448\u0438\u0431\u043a\u0443 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u0446\u0435\u043d\u044b. \u0417\u0430\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0439\u0442\u0435 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u0442 \u043a\u0443\u0431 \u043d\u0430 <code>400<\/code> \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0432\u043f\u0440\u0430\u0432\u043e \u0438 \u043d\u0430 <code>300<\/code> \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0432\u043d\u0438\u0437: <\/p>\n<pre><code class=\"javascript\">\/\/ matrix = Matrix.multiply( \/\/ \u00a0 Matrix.getTranslation(400, -300, 0), \/\/ \u00a0 matrix, \/\/ );<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c\u0441\u044f \u0432 \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u043b\u0435\u0432\u044b\u0439 \u0443\u0433\u043e\u043b, \u0442.\u043a. \u0442\u0430\u043c \u043d\u0430\u0447\u0430\u043b\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 <code>canvas<\/code>: <\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"\/img\/image-loader.svg\" height=\"1205\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a5a\/6c7\/88f\/a5a6c788fda721ee1c78ce55ecbb0fdd.png\" data-width=\"1600\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u043d\u0435 \u0434\u0432\u0438\u0433\u0430\u043b\u0438 \u043c\u043e\u0434\u0435\u043b\u044c, \u0432\u0438\u0434\u0438\u043c \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430\u0448\u0435\u0439 \u043a\u0430\u043c\u0435\u0440\u044b. \u041c\u043e\u0434\u0435\u043b\u044c \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u043e\u043a\u0440\u0443\u0433 \u0442\u043e\u0447\u043a\u0438 <code>0, 0, 0<\/code> \u0438 \u0432 3D-\u0433\u0440\u0430\u0444\u0438\u043a\u0435, \u043e\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u043f\u043e \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u044d\u043a\u0440\u0430\u043d\u0430, \u0430 \u0432\u0438\u0434\u0438\u043c \u043c\u044b \u043b\u0438\u0448\u044c \u043a\u0443\u0441\u043e\u0447\u0435\u043a \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u044b, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u043a\u0430\u043d\u0432\u0430\u0441\u0435 \u0442\u043e\u0447\u043a\u0430 <code>0, 0<\/code>, \u044d\u0442\u043e \u043d\u0435 \u0446\u0435\u043d\u0442\u0440, \u0430 \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u043b\u0435\u0432\u044b\u0439 \u0443\u0433\u043e\u043b. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043b\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0445 \u0440\u0430\u0441\u0447\u0435\u0442\u043e\u0432 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043c \u043d\u0430\u0447\u0430\u043b\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0435\u0441\u043b\u0438 \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0430\u0441\u044c \u0432 \u0442\u043e\u0447\u043a\u0435 <code>0, 0, 0<\/code>, (\u044f \u043f\u0438\u0448\u0443 <code>0, 0, 0<\/code> \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f, \u0447\u0442\u043e \u0440\u0435\u0447\u044c \u0438\u0434\u0435\u0442 \u043e 3d-\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0445\u043e\u0442\u044f, \u043c\u044b \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443 <code>Z<\/code> \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043f\u0440\u0438 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0435 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u043c\u043e\u0434\u0435\u043b\u0438) \u0442\u043e \u043e\u043d\u0430 \u0431\u044b\u043b\u0430 \u0431\u044b \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0430 \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u043e\u043a\u043d\u0430, \u0430 \u043d\u0435 \u0432 \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u043b\u0435\u0432\u043e\u043c \u0443\u0433\u043b\u0443, \u0438 \u043d\u0430\u0448\u0435 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043a\u0430\u043c\u0435\u0440\u044b \u0431\u044b\u043b\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043e. \u0412\u0435\u0434\u044c \u0441\u0435\u0439\u0447\u0430\u0441, \u043a\u0430\u043c\u0435\u0440\u0430, \u0435\u0441\u043b\u0438 \u043c\u044b \u043d\u0438\u0447\u0435\u0433\u043e \u0441 \u043d\u0435 \u0434\u0435\u043b\u0430\u043b\u0438, \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0442\u043e\u0447\u043a\u0435 <code>0, 0, 0<\/code> \u0438 \u0444\u0438\u0433\u0443\u0440\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u043e\u043a\u0440\u0443\u0433 \u044d\u0442\u043e \u0442\u043e\u0447\u043a\u0438, \u0438 \u043f\u043e\u044d\u0442\u043e\u043c\u0443, \u0444\u0438\u0433\u0443\u0440\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u043f\u0440\u044f\u043c\u043e \u043f\u0435\u0440\u0435\u0434 \u043d\u0430\u043c\u0438 \u043f\u043e\u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 <em>(\u0445\u043e\u0447\u0443 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0430\u043a\u0446\u0435\u043d\u0442 \u043d\u0430 \u0442\u043e\u043c, \u0447\u0442\u043e \u043a\u0430\u043c\u0435\u0440\u0430 \u044d\u0442\u043e \u043d\u0435 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442 \u0432 \u0438\u0433\u0440\u0435, \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u0441\u0446\u0435\u043d\u0443, \u044d\u0442\u043e \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0441\u0435 3D \u043c\u043e\u0434\u0435\u043b\u0438 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u0438\u0445 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439, \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0431\u044b\u043b\u0438 \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 0 \u2014 800 \u043f\u043e \u0448\u0438\u0440\u0438\u043d\u0435 \u0438 0 &#8212; 600 \u043f\u043e \u0432\u044b\u0441\u043e\u0442\u0435, \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0442.\u043a. \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u043a\u0430\u043d\u0432\u0430\u0441\u0430 \u043c\u044b \u0443\u043a\u0430\u0437\u0430\u043b\u0438 800 \u043d\u0430 600, \u0438 \u0435\u0441\u043b\u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u0431\u0443\u0434\u0435\u0442 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0442\u043e\u0447\u043a\u0435, \u0442\u043e \u043d\u0430 \u043a\u0430\u043d\u0432\u0430\u0441\u0435 \u044d\u0442\u043e\u0442 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u043f\u043e\u043f\u0440\u043e\u0441\u0442\u0443 \u043d\u0435 \u043d\u0430\u0440\u0438\u0441\u0443\u0435\u0442\u0441\u044f)<\/em>. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u043f\u0438\u043a\u0441\u0435\u043b\u044f. \u041f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c \u043a\u0430\u043a \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u043d\u0430 \u043a\u0430\u043d\u0432\u0430\u0441, \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043a <code>X<\/code> \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u0448\u0438\u0440\u0438\u043d\u044b \u043a\u0430\u043d\u0432\u0430\u0441\u0430 \u0438 \u043e\u0442\u043d\u0438\u043c\u0435\u043c \u043e\u0442 <code>Y<\/code> \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u0432\u044b\u0441\u043e\u0442\u044b \u043a\u0430\u043d\u0432\u0430\u0441\u0430 (\u043e\u0442\u043d\u0438\u043c\u0430\u0435\u043c \u0442.\u043a. \u043e\u0441\u044c <code>Y<\/code> \u043d\u0430 \u043a\u0430\u043d\u0432\u0430\u0441\u0435 \u043f\u0435\u0440\u0435\u0432\u0435\u0440\u043d\u0443\u0442\u0430). \u042d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u044b \u0437\u0430\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0432\u044b\u0448\u0435, \u043d\u043e \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043c\u0435\u043d\u044f\u043b\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0432\u0435\u0440\u0448\u0438\u043d, \u0447\u0442\u043e \u043f\u043e\u0432\u043b\u0438\u044f\u043b\u043e \u0431\u044b \u043d\u0430 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0435 \u0440\u0430\u0441\u0447\u0435\u0442\u044b, \u0430 \u0442\u0430\u043a \u043c\u044b \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0431\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u043e \u043a \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u043c <code>X,Y<\/code> \u0432\u044b\u0432\u043e\u0434\u0438\u043c\u043e\u0433\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044f, \u0447\u0442\u043e \u043d\u0438 \u043d\u0430 \u043a\u0430\u043a\u0438\u0435 \u0440\u0430\u0441\u0447\u0435\u0442\u044b \u043d\u0435 \u0432\u043b\u0438\u044f\u0435\u0442, \u0442.\u043a. \u0434\u0430\u043b\u044c\u0448\u0435 \u0443\u0436\u0435 \u0440\u0430\u0441\u0447\u0435\u0442\u043e\u0432 \u0432\u0435\u0440\u0448\u0438\u043d \u043d\u0435\u0442, \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0445 \u0432\u044b\u0432\u043e\u0434: <\/p>\n<pre><code class=\"javascript\">drawPixel(x, y, r, g, b) { \u00a0\u00a0x += this.width \/ 2; \/\/ \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c \u0425 \u0432 \u0446\u0435\u043d\u0442\u0440 \u043a\u0430\u043d\u0432\u0430\u0441\u0430 \u00a0\u00a0y = -(y - this.height \/ 2) \/\/ \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c Y \u0432 \u0446\u0435\u043d\u0442\u0440 \u043a\u0430\u043d\u0432\u0430\u0441\u0430 \u00a0\u00a0const offset = (this.width * y + x) * 4;   if (x >= 0 &amp;&amp; x &lt; this.width &amp;&amp; y >= 0 &amp;&amp; y &lt; this.height) { \u00a0\u00a0\u00a0\u00a0this.surface[offset] = r; \u00a0\u00a0\u00a0\u00a0this.surface[offset + 1] = g; \u00a0\u00a0\u00a0\u00a0this.surface[offset + 2] = b; \u00a0\u00a0\u00a0\u00a0this.surface[offset + 3] = 255; \u00a0\u00a0} }<\/code><\/pre>\n<p> \u0422\u0435\u043f\u0435\u0440\u044c, \u0435\u0441\u043b\u0438 \u0432\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u043a\u043e\u0434, \u0443 \u0432\u0430\u0441 \u0444\u0438\u0433\u0443\u0440\u0430 \u043d\u0438\u043a\u0443\u0434\u0430 \u043d\u0435 \u0441\u043c\u0435\u0449\u0430\u043b\u0430\u0441\u044c, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u043a\u0430\u043d\u0432\u0430\u0441\u0430, \u043a\u0430\u043a \u0438 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c: <\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"\/img\/image-loader.svg\" height=\"1210\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/899\/2b9\/180\/8992b9180134315485598582cc8fdb83.png\" data-width=\"1600\"\/><figcaption><\/figcaption><\/figure>\n<p> \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043a\u0430\u043c\u0435\u0440\u043e\u0439. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e \u043d\u0430\u0448 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436 \u0432\u0441\u0435 \u0442\u0430\u043a\u0436\u0435 \u0441\u043c\u043e\u0442\u0440\u0438\u0442 \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u044b (\u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044f \u043e\u0441\u0438 <code>Z<\/code>), \u043d\u043e \u043e\u0442\u043e\u0448\u0435\u043b \u043d\u0430 <code>200<\/code> \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0432\u043f\u0440\u0430\u0432\u043e, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 <code>eye, target, up<\/code> \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0432\u0438\u0434\u0430 \u0432 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u044f\u043c\u043e \u043f\u0435\u0440\u0435\u0434 \u0446\u0438\u043a\u043b\u043e\u043c \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u0430 \u0432\u0435\u0440\u0448\u0438\u043d (\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435 \u043c\u0430\u0442\u0440\u0438\u0446 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u043e\u0432 \u0432\u0435\u0440\u0448\u0438\u043d \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u044b): <\/p>\n<pre><code class=\"javascript\">matrix = Matrix.multiply( \u00a0\u00a0Matrix.getLookAt( \u00a0\u00a0\u00a0\u00a0new Vector(200, 0, 0), \u00a0\u00a0\u00a0\u00a0new Vector(200, 0, -1), \u00a0\u00a0\u00a0\u00a0new Vector(0, 1, 0), \u00a0\u00a0), \u00a0\u00a0matrix, );<\/code><\/pre>\n<p> \u0412 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0442\u043e\u0447\u043a\u0438 \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u043d\u0430\u0445\u043e\u0434\u0438\u043c\u0441\u044f \u044f \u0443\u043a\u0430\u0437\u0430\u043b <code>X=200<\/code>, \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442 \u0447\u0442\u043e \u0432\u0435\u0441\u044c 3D-\u043c\u0438\u0440 \u0441\u0434\u0432\u0438\u043d\u0435\u0442\u0441\u044f \u043b\u0435\u0432\u0435\u0435, \u043d\u0430 200 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439, \u043f\u043e\u0447\u0435\u043c\u0443 \u043b\u0435\u0432\u0435\u0435? \u0412\u0435\u0434\u044c \u0435\u0441\u043b\u0438 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0436\u0438\u0437\u043d\u0438 \u043c\u044b \u0431\u043e\u043a\u043e\u043c \u043f\u043e\u0439\u0434\u0435\u043c \u0432\u043f\u0440\u0430\u0432\u043e (\u043a\u0430\u043a \u043a\u0440\u0430\u0431) \u0442\u043e \u0432\u0441\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b\u043b\u0438 \u043f\u0435\u0440\u0435\u0434 \u043d\u0430\u043c\u0438 \u0443\u0445\u043e\u0434\u044f\u0442 \u0432\u043b\u0435\u0432\u043e, \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0438 \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u0432\u0438\u0434\u0430, \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0435 \u0434\u0432\u0438\u0433\u0430\u0442\u044c \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044e \u043a\u0430\u043c\u0435\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u0441\u0435\u0433\u0434\u0430 \u043d\u0430 \u043c\u0435\u0441\u0442\u0435. \u0412\u0442\u043e\u0440\u043e\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 (<code>target<\/code>) \u044f \u0442\u043e\u0436\u0435 \u0443\u043a\u0430\u0437\u0430\u043b <code>X=200<\/code>, <code>Y=0<\/code>, \u043d\u043e <code>Z=-1<\/code>, \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0437\u0433\u043b\u044f\u0434\u0430 \u044f \u043d\u0435 \u043c\u0435\u043d\u044f\u043b \u043f\u043e <code>X, Y<\/code>,\u00a0 \u0430 \u0432\u043e\u0442 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <code>Z<\/code>, \u044f \u0443\u043a\u0430\u0437\u0430\u043b \u0447\u0442\u043e \u0441\u043c\u043e\u0442\u0440\u044e \u0432 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443 <code>-1<\/code>, \u0442.\u0435. \u043f\u0440\u043e\u0441\u0442\u043e \u0432 \u0434\u0430\u043b\u044c. \u0415\u0441\u043b\u0438 \u0431\u044b \u044f \u0443\u043a\u0430\u0437\u0430\u043b \u043d\u0435 <code>-1<\/code>, \u0430 <code>-1000<\/code>, \u0442\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u0431\u044b \u043d\u0435 \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u043e\u0441\u044c, \u0442.\u043a. \u0442\u043e\u0447\u043a\u0430 \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u044f \u0441\u043c\u043e\u0442\u0440\u044e \u0445\u043e\u0442\u044c \u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u043b\u0430\u0441\u044c \u0431\u044b \u0434\u0430\u043b\u044c\u0448\u0435, \u043d\u043e \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043c\u043e\u0438\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u043c \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u0438 \u0442\u043e\u0447\u043a\u043e\u0439 \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0441\u043c\u043e\u0442\u0440\u044e \u0431\u044b\u043b\u043e \u0431\u044b \u0442\u0430\u043a\u0438\u043c \u0436\u0435, \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u0435\u043a\u0442\u043e\u0440 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u0431\u044b\u043b \u0431\u044b \u0434\u043b\u0438\u043d\u043d\u0435\u0435. \u0415\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0435\u043a\u0442\u043e\u0440 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u044b \u0441\u0435\u0439\u0447\u0430\u0441 \u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0435\u0433\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438\u00a0 \u043c\u0435\u0442\u043e\u0434\u0430 <code>Vector.substruct(target, eye)<\/code>. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u043c\u044b \u0432 \u0442\u043e\u0447\u043a\u0435 <code>200, 0, 0<\/code> , \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432 \u0442\u043e\u0447\u043a\u0443 <code>200, 0, -1000<\/code>, \u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0447\u0438\u0442\u0430\u043d\u0438\u044f <code>eye<\/code> \u0438\u0437 target \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c <code>[200 \u2014 200, 0 - 0, -1000 - 0]<\/code> = <code>[0, 0, -1000]<\/code> &#8212; \u044d\u0442\u043e \u0432\u0435\u043a\u0442\u043e\u0440 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0437\u0433\u043b\u044f\u0434\u0430, \u043d\u043e \u0435\u0433\u043e \u0434\u043b\u0438\u043d\u0430 <code>1000<\/code>, \u0438 \u0435\u0441\u043b\u0438 \u043c\u044b \u0435\u0433\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0443\u0435\u043c, \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043c <code>0, 0, -1<\/code> \u0438 \u043d\u0435\u0442\u0443 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0440\u0430\u0437\u043d\u0438\u0446\u044b, \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 <code>0, 0, -1<\/code> \u0438\u043b\u0438 \u0432 <code>0, 0, -1000<\/code>. \u041d\u043e \u0435\u0441\u0442\u044c \u0438 \u0441\u043b\u0443\u0447\u0430\u0438 \u043a\u043e\u0433\u0434\u0430 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 <code>X, Y, Z<\/code> \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u043a\u0430\u043c\u0435\u0440\u0443, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043e\u0434\u043d\u043e\u0439 \u043e\u0441\u0438. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u043a\u0430\u043c\u0435\u0440\u0443 \u0432\u0438\u0434\u0430, \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f: <\/p>\n<pre><code class=\"javascript\">Matrix.getLookAt( \u00a0\u00a0new Vector(200, 0, 0), \u00a0\u00a0new Vector(100, 0, -1), \u00a0\u00a0new Vector(0, 1, 0), ),<\/code><\/pre>\n<p>\u0412 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435 \u0432\u044b\u0448\u0435, \u043c\u044b \u0443\u043a\u0430\u0437\u0430\u043b\u0438 <code>X=100<\/code> \u0434\u043b\u044f \u0446\u0435\u043b\u0438 (\u043a\u0443\u0434\u0430 \u0441\u043c\u043e\u0442\u0440\u0438\u043c), \u0438 \u0432 \u0440\u0430\u0437\u043d\u0438\u0446\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c <code>-100, 0, -1<\/code> \u0431\u0435\u0437 \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u0438\u0434\u043d\u043e \u0447\u0442\u043e \u0432\u0435\u043a\u0442\u043e\u0440 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0437\u0433\u043b\u044f\u0434\u0430 \u0441\u043c\u043e\u0442\u0440\u0438\u0442 \u0432\u043b\u0435\u0432\u043e \u0438 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 <code>Z<\/code>, \u043e\u0447\u0435\u043d\u044c \u0441\u043b\u0430\u0431\u043e \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0442\u043e, \u043a\u0443\u0434\u0430 \u043c\u044b \u0441\u043c\u043e\u0442\u0440\u0438\u043c. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u0430, \u0437\u0430\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043f\u043e \u043e\u0441\u0438 <code>Y<\/code> (\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043f\u043e \u043e\u0441\u0438 <code>X<\/code> \u043d\u0430 <code>20<\/code> \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432 \u043e\u0441\u0442\u0430\u0432\u0438\u043c). \u0418 \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u0443 \u0432\u0430\u0441 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435: <\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"\/img\/image-loader.svg\" height=\"1200\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/fed\/93f\/377\/fed93f3775e074b816b6500c747d2b4c.png\" data-width=\"1600\"\/><figcaption><\/figcaption><\/figure>\n<p> \u041c\u044b \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0443 \u043d\u0430\u043a\u043b\u043e\u043d\u0438\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u043e\u0441\u0438 <code>X<\/code>, \u0441\u0430\u043c\u0430 \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0430 \u0432 \u0442\u043e\u0447\u043a\u0435 <code>0, 0, 0<\/code> \u0438 \u043c\u044b \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0438\u0437 \u0442\u043e\u0447\u043a\u0438 <code>200, 0, 0<\/code> \u0432 \u0442\u043e\u0447\u043a\u0443 <code>100, 0, -1<\/code>, \u0442.\u0435. \u0441\u0442\u043e\u044f \u0441\u043f\u0440\u0430\u0432\u0430 \u043e\u0442 \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u044b \u043c\u044b \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430\u043b\u0435\u0432\u043e, \u0438 \u0432\u0438\u0434\u0438\u043c \u0435\u0435 \u043f\u0440\u0430\u0432\u044b\u0439 \u0431\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0437 \u043d\u0430\u0448\u0435\u0433\u043e \u0440\u0430\u043a\u0443\u0440\u0441\u0430 \u043d\u0430\u043a\u043b\u043e\u043d\u0435\u043d \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u0431\u043e\u043a \u043f\u043e \u0447\u0430\u0441\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u0435\u043b\u043a\u0435, \u0445\u043e\u0442\u044f \u044d\u0442\u043e \u0442\u0435 \u0441\u0430\u043c\u044b\u0435 <code>20<\/code> \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432 \u043f\u043e <code>X<\/code>, \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u0443 \u043d\u0430\u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u0440\u0430\u043a\u0443\u0440\u0441. \u0422\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043c <code>Z<\/code> \u0446\u0435\u043b\u0438 \u0434\u043e <code>-100<\/code>: <\/p>\n<pre><code class=\"javascript\">Matrix.getLookAt(   new Vector(200, 0, 0),   new Vector(100, 0, -100),   new Vector(0, 1, 0), ),<\/code><\/pre>\n<p>\u0418 \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u0435\u043a\u0442\u043e\u0440 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0437\u0433\u043b\u044f\u0434\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e, <code>-1, 0, -1<\/code> \u0447\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0431\u044b \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0443 \u043f\u043e \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438, \u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"\/img\/image-loader.svg\" height=\"1202\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/be0\/ec3\/112\/be0ec31120c128ad5374332b9d3b003f.png\" data-width=\"1600\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041e\u0434\u0438\u043d \u0438\u0437 \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0441 \u0441\u043c\u0443\u0442\u0438\u0442\u044c, \u044d\u0442\u043e \u0442\u043e, \u0447\u0442\u043e \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u044b \u0441\u0442\u0440\u043e\u044f\u0442\u0441\u044f \u0432\u043e\u043a\u0440\u0443\u0433 \u0442\u043e\u0447\u043a\u0438 <code>0, 0, 0<\/code> \u0438 \u043c\u044b \u0438\u0445 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043b\u0438 \u0432 <code>100<\/code> \u0440\u0430\u0437 \u043c\u0430\u0442\u0440\u0438\u0446\u0435\u0439 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442 \u0447\u0442\u043e \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0443 \u0438\u0437\u043d\u0443\u0442\u0440\u0438 \u0438\u043b\u0438 \u0438\u0437 \u043e\u0447\u0435\u043d\u044c \u0431\u043b\u0438\u0437\u043a\u043e\u0433\u043e\\\u0434\u0430\u043b\u044c\u043d\u0435\u0433\u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u043e\u043d\u0430 \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0433\u043e \u0436\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430, \u044d\u0442\u043e \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043c\u044b \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u043d\u0435 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443 <code>Z<\/code>, \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c\\\u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 \u0441 \u0435\u0433\u043e \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u0438\u0435\u043c\\\u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435\u043c \u043e\u0442 \u043d\u0430\u0441 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e. \u041d\u0430 \u044d\u0442\u043e \u043c\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u043a\u0430\u043c\u0435\u0440\u0443 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0443 \u0441\u0432\u0435\u0440\u0445\u0443: <\/p>\n<pre><code class=\"javascript\">Matrix.getLookAt( \u00a0\u00a0new Vector(0, 0, 0), \u00a0\u00a0new Vector(0, -1, 0), \u00a0\u00a0new Vector(0, 0, 1), ),<\/code><\/pre>\n<p> \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u043c\u043e\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u044d\u0442\u043e <code>0, 0, 0,<\/code> \u0442.\u0435. \u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u044b \u0438 \u0441\u043c\u043e\u0442\u0440\u044e \u044f \u0441\u0442\u0440\u043e\u0433\u043e \u0432\u043d\u0438\u0437 \u0432 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 <code>0, -1, 0<\/code>, \u043d\u043e \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u044f \u0435\u0435 \u0432\u0438\u0436\u0443, \u0442.\u043a. \u043c\u044b \u0435\u0449\u0435 \u043d\u0435 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0434\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0442\u0430\u043a\u0436\u0435 \u043d\u0435\u043c\u0430\u043b\u043e\u0432\u0430\u0436\u043d\u043e \u0447\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u044f \u043d\u0430\u0447\u0430\u043b \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u0442\u0440\u043e\u0433\u043e \u0432\u043d\u0438\u0437 (\u043f\u043e \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044e \u043e\u0441\u0438 <code>Y<\/code>), \u0443 \u043c\u0435\u043d\u044f \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0441\u044f \u0432\u0435\u043a\u0442\u043e\u0440 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f (\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>up<\/code>) \u0432\u0432\u0435\u0440\u0445, \u0442\u0435\u043f\u0435\u0440\u044c \u044d\u0442\u043e <code>Z<\/code> \u0438 \u0435\u0441\u043b\u0438 \u044f \u0435\u0433\u043e \u0443\u043a\u0430\u0436\u0443 <code>Z=1<\/code> \u0442\u043e \u0443\u0432\u0438\u0436\u0443 \u0442\u0430\u043a\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443: <\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"\/img\/image-loader.svg\" height=\"609\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/17e\/bc4\/3f0\/17ebc43f0da9a24dfeea4835b31f6dea.png\" data-width=\"810\"\/><figcaption><\/figcaption><\/figure>\n<p>\u042d\u0442\u043e \u0432\u0438\u0434 \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u044b \u0441\u0432\u0435\u0440\u0445\u0443, \u0438 \u0442\u0430\u043a\u0436\u0435 \u0432\u0438\u0434\u043d\u043e \u0447\u0442\u043e \u043e\u043d\u0430 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043d\u0430\u043a\u043b\u043e\u043d\u0435\u043d\u0430 \u043f\u043e \u043e\u0441\u0438 <code>X<\/code>.\u00a0 <\/p>\n<p>\u0412 \u043d\u0430\u0448\u0438\u0445 \u0440\u0430\u0441\u0447\u0435\u0442\u0430\u0445 \u0435\u0441\u0442\u044c \u043d\u0435\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0441\u0440\u0430\u0437\u0443 \u0432\u0438\u0434\u043d\u043e, \u043d\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043f\u043e\u043d\u044f\u0442\u044c \u0434\u043b\u044f \u0447\u0435\u0433\u043e \u0438 \u0432 \u043a\u0430\u043a\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u044b. \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0430\u0433\u0438 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u043e \u043c\u0435\u0440\u0435 \u043f\u0440\u043e\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f, \u043a\u043e\u0433\u0434\u0430 \u0443\u0432\u0438\u0434\u0438\u043c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435, \u0441\u0438\u043b\u044c\u043d\u043e \u043c\u0435\u0448\u0430\u044e\u0449\u0435\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e 3D-\u0441\u0446\u0435\u043d\u044b.<\/p>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u0432\u0435\u0440\u043d\u0435\u043c \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"javascript\">let matrix = Matrix.getRotationX(20);  \/\/ matrix = Matrix.multiply( \/\/ \u00a0 \/\/ Matrix.getRotationY(angle += 1), \/\/ \u00a0 matrix \/\/ );  matrix = Matrix.multiply( \u00a0\u00a0Matrix.getScale(100, 100, 100), \u00a0\u00a0matrix, );  \/\/ matrix = Matrix.multiply( \/\/ \u00a0 Matrix.getTranslation(400, -300, 0), \/\/ \u00a0 matrix, \/\/ );  \/\/ \u041f\u0435\u0440\u0435\u0434\u0432\u0438\u0433\u0430\u0435\u043c \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0443 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u043e \u043a\u0430\u043a \u0431\u0443\u0434\u0442\u043e \u043c\u044b  \/\/ \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043d\u0435\u0451 \u0441\u0432\u0435\u0440\u0445\u0443 (\u0438\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043c\u0430\u0442\u0440\u0438\u0446\u0443  \/\/ \u0432\u0438\u0434\u0430 \u0434\u043b\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0430 \u043a\u0430\u043c\u0435\u0440\u044b) matrix = Matrix.multiply( \u00a0\u00a0Matrix.getLookAt( \u00a0\u00a0\u00a0\u00a0new Vector(0, 0, 0), \u00a0\u00a0\u00a0\u00a0new Vector(0, -1, 0), \u00a0\u00a0\u00a0\u00a0new Vector(0, 0, 1), \u00a0\u00a0), \u00a0\u00a0matrix, );<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c\u0441\u044f \u0441 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u044f \u0441 \u043a\u0430\u043c\u0435\u0440\u043e\u0439 (\u0438\u043b\u0438 \u043c\u0430\u0442\u0440\u0438\u0446\u0435\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f) \u043c\u044b \u0437\u0430\u043c\u0435\u0442\u0438\u043b\u0438 \u0447\u0442\u043e <code>Z<\/code>-\u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u043c\u043e\u0434\u0435\u043b\u044c. \u0422.\u0435. \u043e\u0431\u044a\u0435\u043a\u0442 \u0441 \u043c\u0435\u043d\u044c\u0448\u0438\u043c <code>Z<\/code> \u0434\u043e\u043b\u0436\u0435\u043d \u0443\u0434\u0430\u043b\u044f\u0442\u044c\u0441\u044f \u043e\u0442 \u043d\u0430\u0441 \u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u043c\u0435\u043d\u044c\u0448\u0435, \u043d\u043e \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442. \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c \u0447\u0442\u043e \u043c\u044b \u0442\u0430\u043a\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0437\u0430\u043b\u043e\u0436\u0435\u043d\u043e \u0438 \u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e. \u0421\u0435\u0439\u0447\u0430\u0441 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0443 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0441\u0442\u043e\u0440\u043e\u043d \u043a \u043d\u0430\u043c \u0438 \u043a\u0430\u043c\u0435\u0440\u0443 \u043d\u0430\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043d\u0430 \u043d\u0435\u0435 \u043f\u043e \u043e\u0441\u0438 <code>Z<\/code>. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u043c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043f\u043e \u043e\u0441\u0438 <code>\u0425<\/code> (\u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u0443\u0433\u043e\u043b \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f <code>0<\/code> ): <\/p>\n<pre><code class=\"javascript\">let matrix = Matrix.getRotationX(0);<\/code><\/pre>\n<p> \u0418 \u043a\u0430\u043c\u0435\u0440\u0443 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043c \u0432 \u0442\u043e\u0447\u043a\u0443 <code>0, 0, 0<\/code> \u0438 \u0431\u0443\u0434\u0435\u043c \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044f <code>Z<\/code>, \u0442.\u0435. \u0432 <code>0, 0, -1<\/code>: <\/p>\n<pre><code class=\"javascript\">matrix = Matrix.multiply( \u00a0\u00a0Matrix.getLookAt( \u00a0\u00a0\u00a0\u00a0new Vector(0, 0, 0), \/\/ \u0433\u0434\u0435 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044c \u0441\u0442\u043e\u0438\u0442 \u00a0\u00a0\u00a0\u00a0new Vector(0, 0, -1), \/\/ \u0432 \u043a\u0430\u043a\u0443\u044e \u0442\u043e\u0447\u043a\u0443 \u0441\u043c\u043e\u0442\u0440\u0435\u0442 \u00a0\u00a0\u00a0\u00a0new Vector(0, 1, 0), \u00a0\u00a0), \u00a0\u00a0matrix, );<\/code><\/pre>\n<p> \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435: <\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"\/img\/image-loader.svg\" height=\"608\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/557\/9fb\/6fd\/5579fb6fd8a59315458b6c2f44f4e78d.png\" data-width=\"809\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442 \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u044b (\u0447\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435 \u043e\u0431\u044a\u0435\u043a\u0442 \u2014 \u0442\u0435\u043c \u043e\u043d \u043c\u0435\u043d\u044c\u0448\u0435  \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u0430\u043c\u044b\u043c \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c &#8212; \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c <code>X<\/code> \u0438 <code>Y<\/code> \u043a\u0430\u0436\u0434\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u043f\u0435\u0440\u0435\u0434 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u043e\u0439 \u043d\u0430 <code>-Z<\/code> (\u0441\u043e \u0437\u043d\u0430\u043a\u043e\u043c \u043c\u0438\u043d\u0443\u0441 \u0442.\u043a. \u0443 \u043d\u0430\u0441 \u0447\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435 <code>Z<\/code> &#8212; \u0442\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u0430\u043b\u044c\u0448\u0435, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u0434\u0430\u043b\u044c\u043d\u0438\u0439 <code>Z<\/code> \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0435 \u0441 \u043e\u0442\u0434\u0430\u043b\u0435\u043d\u0438\u0435\u043c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: \u0435\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 \u0442\u043e\u0447\u043a\u0430 <code>X<\/code> \u0431\u044b\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 <code>10<\/code>, \u0430 <code>Z = -10<\/code>, \u0442\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0432 <code>10<\/code> \u043d\u0430 <code>-(-10)<\/code> \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c <code>1<\/code>, <code>X<\/code> \u0441\u0442\u0430\u043b \u043c\u0435\u043d\u044c\u0448\u0435 \u0432 <code>10<\/code> \u0440\u0430\u0437. \u0410 \u0435\u0441\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 \u0431\u043b\u0438\u0436\u0435 \u043a \u043a\u0430\u043c\u0435\u0440\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0443 \u043d\u0435\u0433\u043e <code>Z = -2<\/code>, \u0442\u043e <code>10 \/ -(-2)<\/code> \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u043d\u043e <code>5<\/code>, \u0438 \u0442\u0430\u043a\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0438\u043c\u0435\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0438\u0439 <code>X<\/code> , \u0442.\u043a. \u0431\u043b\u0438\u0436\u0435 \u043a \u043a\u0430\u043c\u0435\u0440\u0435. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u044d\u0442\u043e \u043a \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0435. \u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u043a\u043e\u0434 \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430 <code>Z<\/code>, \u043f\u0435\u0440\u0435\u0434 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0432 \u0440\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0442\u043e\u0440: <\/p>\n<pre><code class=\"javascript\">vertex.x = vertex.x \/ -vertex.z; vertex.y = vertex.y \/ -vertex.z;  \/\/ \u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u0432\u044b\u0448\u0435 \u043f\u0435\u0440\u0435\u0434 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439 sceneVertices.push(vertex);<\/code><\/pre>\n<p> \u0421\u0434\u0435\u043b\u0430\u0432 \u0442\u0430\u043a\u043e\u0435 \u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0432\u044b \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0442\u043e\u0447\u043a\u0443 \u0432 \u0446\u0435\u043d\u0442\u0440\u0435: <\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"\/img\/image-loader.svg\" height=\"611\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4b0\/b69\/69f\/4b0b6969f084892b47d9565d462d5f29.png\" data-width=\"811\"\/><figcaption><\/figcaption><\/figure>\n<p> \u042d\u0442\u043e \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0430\u0447\u0430\u0432 \u0434\u0435\u043b\u0438\u0442\u044c <code>X<\/code> \u0438 <code>Y<\/code> \u043d\u0430 <code>-Z<\/code>, \u043c\u044b \u0438\u0445 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u043b\u0438 \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u043d\u043e \u0443\u043c\u043d\u043e\u0436\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0430 \u043f\u043e\u0434\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0441\u043a\u0430\u043b\u044f\u0440, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0443, \u044f \u0432\u0437\u044f\u043b \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u043a\u0430\u043b\u044f\u0440\u0430 \u0447\u0438\u0441\u043b\u043e <code>100<\/code> (\u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0435 \u0434\u0440\u0443\u0433\u043e\u0435): <\/p>\n<pre><code class=\"javascript\">vertex.x = vertex.x \/ -vertex.z * 100; vertex.y = vertex.y \/ -vertex.z * 100;<\/code><\/pre>\n<p> \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442: <\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"\/img\/image-loader.svg\" height=\"606\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/db6\/773\/fd5\/db6773fd5cabd9d7063f5f99a90a8a68.png\" data-width=\"806\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0442\u043e \u0447\u0442\u043e \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u043d\u0435 \u0441\u0438\u043b\u044c\u043d\u043e \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0443, \u0430 \u0432\u0435\u0434\u044c \u0434\u043e \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430 <code>-Z<\/code> \u0432\u0441\u0435 \u0431\u044b\u043b\u043e \u0445\u043e\u0440\u043e\u0448\u043e. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c \u0447\u0442\u043e \u044d\u0442\u0430 \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u043e\u043a\u0440\u0443\u0433 \u0442\u043e\u0447\u043a\u0438 <code>0, 0, 0<\/code> \u0438 \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0435\u0451 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u043b\u0438 \u2014 \u0447\u0430\u0441\u0442\u044c <code>Z<\/code> \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435, \u0430 \u0447\u0430\u0441\u0442\u044c \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435. \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430 <code>-Z<\/code> &#8212; \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u043b\u0438 \u0447\u0442\u043e <code>Z<\/code> \u0443 \u0432\u0435\u0440\u0448\u0438\u043d \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u044b \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0438 \u0442\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u0445\u043e\u0440\u043e\u0448\u043e, \u0432\u0435\u0434\u044c \u0435\u0441\u043b\u0438 <code>Z<\/code> \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f, \u0442\u043e <code>-Z<\/code> \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0438 \u043f\u0440\u0438 \u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u043d\u0430 \u0442\u0430\u043a\u0443\u044e <code>-Z<\/code> \u0437\u043d\u0430\u043a \u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044f \u043d\u0435 \u043f\u043e\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: <code>X = 10, Z=-5<\/code>, \u0442\u043e\u0433\u0434\u0430 <code>10 \/ -(-5) = 2<\/code> &#8212; \u043d\u043e\u0432\u044b\u0439 \u0438\u043a\u0441 \u043f\u0440\u043e\u0441\u0442\u043e \u0447\u0443\u0442\u044c \u043c\u0435\u043d\u044c\u0448\u0435 \u0438\u0437-\u0437\u0430 \u043e\u0442\u0434\u0430\u043b\u0435\u043d\u0438\u044f. \u0410 \u0435\u0441\u043b\u0438 <code>Z=5<\/code>, \u0442\u043e\u0433\u0434\u0430 <code>10 \/ -5 = -2<\/code> &#8212; \u043a\u0430\u043a \u0432\u0438\u0434\u0438\u043c <code>X<\/code> \u043f\u043e\u043c\u0435\u043d\u044f\u043b \u0437\u043d\u0430\u043a \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u043b\u0441\u044f \u043d\u0435 \u0442\u0443\u0434\u0430 \u043a\u0443\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u043d\u0430\u0440\u0438\u0441\u0443\u0435\u043c \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0432\u0435\u0440\u0448\u0438\u043d (\u043c\u0430\u0441\u0441\u0438\u0432 <code>edges<\/code>) \u0442\u043e \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u044b \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e, \u0438 \u0447\u0430\u0441\u0442\u044c \u0432\u0435\u0440\u0448\u0438\u043d \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u044e\u0442\u0441\u044f \u043d\u0430\u043a\u0440\u0435\u0441\u0442, \u0447\u0442\u043e \u0438 \u0432\u0438\u0434\u043d\u043e \u043d\u0430 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u0435 \u0432\u044b\u0448\u0435. \u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0442\u0430\u043a\u043e\u0433\u043e \u0431\u0430\u0433\u0430 \u043d\u0435 \u0431\u044b\u043b\u043e, \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0442\u0435 \u0444\u0438\u0433\u0443\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0441\u0437\u0430\u0434\u0438 \u043d\u0430\u0441 \u0438 \u0438\u043c\u0435\u044e\u0442 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 <code>Z<\/code> (\u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438 \u00ab\u0437\u0430 \u043a\u0430\u043c\u0435\u0440\u043e\u0439\u00bb). \u0422\u0430\u043a\u0443\u044e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0441\u0435\u0439\u0447\u0430\u0441 \u043c\u044b \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u043c, \u0442.\u043a. \u0435\u0449\u0435 \u043d\u0435 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043b\u0438\u0441\u044c. \u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u044d\u0442\u0443 \u0431\u0430\u0433\u0443 \u043d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043b\u0438\u0431\u043e \u043f\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044c <code>eye<\/code> \u043a\u0430\u043c\u0435\u0440\u044b \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043d\u0430\u0437\u0430\u0434 (\u0432 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443 <code>Z<\/code>), \u0447\u0442\u043e\u0431\u044b \u043a\u0430\u043c\u0435\u0440\u0430 \u043d\u0435 \u0431\u044b\u043b\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u044b \u0438\u043b\u0438 \u043f\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0443 \u0432 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443 <code>Z<\/code>, \u0442\u043e\u0433\u0434\u0430 \u043e\u043f\u044f\u0442\u044c \u0436\u0435 \u043a\u0430\u043c\u0435\u0440\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u044b. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0432\u0442\u043e\u0440\u043e\u0435, \u0440\u0430\u0441\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0439\u0442\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0438 \u0441\u043c\u0435\u0441\u0442\u0438\u0442\u0435 \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u043e\u0441\u0438 <code>Z<\/code>, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430 <code>-200<\/code>: <\/p>\n<pre><code class=\"javascript\">matrix = Matrix.multiply( \u00a0\u00a0Matrix.getTranslation(0, 0, -200), \u00a0\u00a0matrix, );<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0443 \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0434\u0430\u043b\u044c\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0431\u043b\u0438\u0436\u0435 \u043a \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0443, \u0447\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u044d\u0444\u0444\u0435\u043a\u0442 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u0438 \u043e\u0442\u0434\u0430\u043b\u0435\u043d\u0438\u0435 (\u0438\u043b\u0438 \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u0443).<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"\/img\/image-loader.svg\" height=\"607\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ea8\/964\/51a\/ea896451aa833de59e5478d14c33ebd1.png\" data-width=\"809\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0442\u0430\u043a \u0441\u0435\u0431\u0435. \u0417\u0430\u0434\u043d\u044f\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430 \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u044b \u0441\u0438\u043b\u044c\u043d\u043e \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0430\u044f, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 \u0431\u043b\u0438\u0436\u043d\u0438\u043c <code>Z<\/code> \u0438 \u0434\u0430\u043b\u044c\u043d\u0438\u043c \u2014 \u0431\u043e\u043b\u044c\u0448\u0430\u044f. \u0418 \u0432\u0435\u0440\u0448\u0438\u043d\u044b <code>X \/ Y<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0437\u0430\u0434\u0438 \u043c\u044b \u0434\u0435\u043b\u0438\u043b\u0438 \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0439 <code>Z<\/code>. \u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043b\u0438\u0448\u044c \u043f\u043e\u043a\u0430\u0437\u0430\u043b \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u044b, \u043d\u043e \u043e\u043d \u043d\u0435 \u0433\u0438\u0431\u043a\u0438\u0439, \u0442.\u043a. \u043d\u0435\u043b\u044c\u0437\u044f \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0438\u043b\u044c\u043d\u043e \u0434\u043e\u043b\u0436\u043d\u0430 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0442\u044c\u0441\u044f \u0444\u0438\u0433\u0443\u0440\u0430 \u043f\u0440\u0438 \u043e\u0442\u0434\u0430\u043b\u0435\u043d\u0438\u0438 (\u0443\u0433\u043e\u043b \u043e\u0431\u0437\u043e\u0440\u0430), \u0435\u0441\u0442\u044c \u0431\u0430\u0433\u0438 \u0441 \u043e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435\u043c \u0431\u043b\u0438\u0436\u043d\u0438\u0445 \u0441\u0442\u0435\u043d\u043e\u043a \u043c\u043e\u0434\u0435\u043b\u0438, \u043a\u043e\u0433\u0434\u0430 \u0447\u0430\u0441\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u0438 \u00ab\u0437\u0430 \u043a\u0430\u043c\u0435\u0440\u043e\u0439\u00bb, \u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b. <\/p>\n<p>\u0414\u043b\u044f \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u043d\u0435\u0434\u043e\u0447\u0435\u0442\u043e\u0432 \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0430, \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0435\u0451 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u043a\u043b\u0430\u0441\u0441 <code>Matrix<\/code>:<\/p>\n<pre><code class=\"javascript\">static getPerspectiveProjection(fovy, aspect, n, f) { \u00a0\u00a0const radians = Math.PI \/ 180 * fovy \u00a0\u00a0const sx = (1 \/ Math.tan(radians \/ 2)) \/ aspect; \u00a0\u00a0const sy = (1 \/ Math.tan(radians \/ 2)); \u00a0\u00a0const sz = (f + n) \/ (f - n); \u00a0\u00a0const dz = (-2 * f * n) \/ (f - n);   return [ \u00a0\u00a0\u00a0\u00a0[sx, 0, 0, 0], \u00a0\u00a0\u00a0\u00a0[0, sy, 0, 0], \u00a0\u00a0\u00a0\u00a0[0, 0, sz, dz], \u00a0\u00a0\u00a0\u00a0[0, 0, -1, 0], \u00a0\u00a0] }<\/code><\/pre>\n<p>\u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0443\u0433\u043e\u043b \u043e\u0431\u0437\u043e\u0440\u0430 \u0432 \u0433\u0440\u0430\u0434\u0443\u0441\u0430\u0445 (<code>fovy<\/code>). \u0423\u0433\u043e\u043b \u043e\u0431\u0437\u043e\u0440\u0430 \u043d\u0443\u0436\u0435\u043d \u0447\u0442\u043e\u0431\u044b \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u0430\u043a \u043c\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u043d\u0430 \u043a\u0430\u043d\u0432\u0430\u0441 \u043e\u0442 \u0442\u043e\u0447\u043a\u0438 \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u0441\u043c\u043e\u0442\u0440\u0438\u043c. \u041d\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u043e? \u0422\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0449\u0435 \u2014 \u0447\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0443\u0433\u043e\u043b \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0434\u0438\u043c, \u0442\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u043f\u0440\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438. \u0414\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0443\u0433\u043b\u043e\u0432 \u043b\u0443\u0447\u0448\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0442 <code>1<\/code> \u0434\u043e <code>179<\/code>. \u0422.\u043a. <code>1<\/code> \u0433\u0440\u0430\u0434\u0443\u0441 \u044d\u0442\u043e \u043c\u044b \u043a\u0430\u043a \u0431\u0443\u0434\u0442\u043e \u043c\u044b \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043c\u0438\u0440 \u0447\u0435\u0440\u0435\u0437 \u0441\u043e\u043b\u043e\u043c\u0438\u043d\u043a\u0443 \u0438 \u043e\u0447\u0435\u043d\u044c \u043c\u0430\u043b\u043e \u0447\u0435\u0433\u043e \u0432\u0438\u0434\u0438\u043c, \u0430 <code>180<\/code> \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432 \u044d\u0442\u043e \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u0434\u0430\u0436\u0435 \u0432\u0441\u0435 \u0447\u0442\u043e \u0441\u0431\u043e\u043a\u0443 \u043e\u0442 \u043d\u0430\u0441, \u0447\u0442\u043e \u0437\u0430\u0445\u0432\u0430\u0442\u0438\u0442 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043d\u0430 \u0441\u0446\u0435\u043d\u0435, \u0441\u043f\u043b\u044e\u0449\u0438\u0442 \u0432 \u0442\u043e\u0447\u043a\u0438 \u0438 \u043c\u044b \u044d\u0442\u043e \u043d\u0430\u0440\u0438\u0441\u0443\u0435\u043c \u043d\u0430 \u043a\u0430\u043d\u0432\u0430\u0441\u0435. \u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u044d\u0442\u0443 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0432 \u043d\u0430\u0448\u0435\u043c \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0435 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e, \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0439\u0442\u0435 \u0440\u0430\u0437\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>fovy<\/code> \u0438 \u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043a\u0430\u043a \u043e\u043d \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0430\u0448\u0435\u0439 \u043c\u043e\u0434\u0435\u043b\u0438. <\/p>\n<p>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>aspect<\/code> \u2014 \u0441\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u0441\u0442\u043e\u0440\u043e\u043d \u043a\u0430\u043d\u0432\u0430\u0441\u0430 (\u0448\u0438\u0440\u0438\u043d\u0430 \u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430 \u0432\u044b\u0441\u043e\u0442\u0443). \u041e\u043d \u043d\u0443\u0436\u0435\u043d \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u0443 \u043d\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438\u0441\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435 \u0441\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u0448\u0438\u0440\u0438\u043d\u044b \u0438 \u0432\u044b\u0441\u043e\u0442\u044b &#8212; \u0434\u0430\u043b\u044c\u0448\u0435 \u0441\u0430\u043c\u0438 \u0432\u0441\u0435 \u0443\u0432\u0438\u0434\u0438\u0442\u0435.<\/p>\n<p>\u0410 \u0442\u0430\u043a\u0436\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b <code>n<\/code> \u0438 <code>f<\/code> (near \u0438 far) \u2014 \u044d\u0442\u0438\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u043c\u044b \u043f\u043e\u0434\u0433\u043e\u043d\u044f\u0435\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b <code>Z<\/code> \u0443 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043a\u0430\u043a\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u043b\u0438\u0437\u043a\u043e \u043a \u043d\u0430\u043c, \u0430 \u043a\u0430\u043a\u0438\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0434\u0430\u043b\u0435\u043a\u043e (<code>Z<\/code> \u0431\u0443\u0434\u0435\u0442 \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 \u043e\u0442 <code>-1<\/code> \u0434\u043e 1 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439 \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u044b), \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u043d\u0430\u043c \u0438\u0445 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 <code>n<\/code> \u0438 <code>f<\/code>, \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0437\u0436\u0435, \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0447\u0430\u0441\u0442\u044f\u0445.<\/p>\n<p>\u041a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u044b\u0435 \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u043e\u0447\u0435\u043d\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e <a href=\"https:\/\/habr.com\/ru\/post\/252771\/\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0443\u0431\u0435\u0440\u0435\u043c \u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 <code>Z<\/code>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u043b\u0438 \u0440\u0430\u043d\u0435\u0435:<\/p>\n<pre><code class=\"javascript\">\/\/ vertex.x = vertex.x \/ -vertex.z * 100; \/\/ vertex.y = vertex.y \/ -vertex.z * 100;<\/code><\/pre>\n<p>\u0418 \u0432 \u043a\u043e\u043d\u0435\u0446 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 (\u043f\u043e\u0441\u043b\u0435 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 <code>lookAt<\/code>) \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u044b: <\/p>\n<pre><code class=\"javascript\">matrix = Matrix.multiply( \u00a0\u00a0Matrix.getPerspectiveProjection( \u00a0\u00a0\u00a0\u00a090, 800 \/ 600, \u00a0\u00a0\u00a0\u00a0-1, -1000), \u00a0\u00a0matrix, );<\/code><\/pre>\n<p> \u042f \u0443\u043a\u0430\u0437\u0430\u043b \u0443\u0433\u043e\u043b 90 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432, \u043d\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0442\u043e\u043c \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0443\u0433\u043b\u044b, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0440\u0430\u0437\u043d\u0438\u0446\u0443. \u0422\u0430\u043a\u0436\u0435 \u0443\u043a\u0430\u0437\u0430\u043b \u0441\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u0441\u0442\u043e\u0440\u043e\u043d \u043a\u0430\u043d\u0432\u0430\u0441\u0430 \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b <code>n<\/code>, <code>f<\/code> , <code>-1<\/code> \u0438 <code>-1000<\/code>, \u043d\u043e \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0443, \u044d\u0442\u043e \u043d\u0430 \u0431\u0443\u0434\u0443\u0449\u0435\u0435, \u0441\u0435\u0439\u0447\u0430\u0441 <code>n<\/code>, <code>f<\/code> \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0438 \u043d\u0430 \u0447\u0442\u043e \u043d\u0435 \u0432\u043b\u0438\u044f\u044e\u0442. \u0422\u0430\u043a\u0436\u0435 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0434\u0432\u0438\u043d\u0435\u043c \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0443 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u0430\u043b\u044c\u0448\u0435 \u0441 <code>-200<\/code> \u043d\u0430 <code>-500<\/code>: <\/p>\n<pre><code class=\"javascript\">matrix = Matrix.multiply( \u00a0\u00a0Matrix.getTranslation(0, 0, -500), \u00a0\u00a0matrix, );<\/code><\/pre>\n<p> \u0412\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c: <\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"\/img\/image-loader.svg\" height=\"609\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ac2\/6f4\/21b\/ac26f421b7e1afb71f90f1b8647399dc.png\" data-width=\"808\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041f\u0438\u0440\u0430\u043c\u0438\u0434\u0430 \u0441\u0442\u0430\u043b\u0430 \u043f\u043b\u043e\u0441\u043a\u043e\u0439, \u043a\u0430\u043a \u0434\u043e \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430 <code>-Z<\/code>, \u0434\u0430 \u0435\u0449\u0435 \u0438 \u0432\u044b\u0442\u044f\u043d\u0443\u0442\u0430\u044f \u043f\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u0438. \u042d\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0442\u0435\u043a\u0443\u0449\u0430\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u043d\u043e \u043d\u0435 \u0432\u0441\u0435. \u0423\u043c\u043d\u043e\u0436\u0438\u0432 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043d\u0430 \u044d\u0442\u0443 \u043c\u0430\u0442\u0440\u0438\u0446\u0443, \u043c\u044b \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0444\u0438\u0433\u0443\u0440\u0443 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 <code>fovy<\/code> (\u0447\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435 \u0443\u0433\u043e\u043b, \u0442\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431), \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0434\u043e\u0433\u043d\u0430\u043b\u0438 \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u0438 \u0448\u0438\u0440\u0438\u043d\u044b \u0438 \u0432\u044b\u0441\u043e\u0442\u044b \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0445 \u0440\u0430\u0441\u0447\u0435\u0442\u043e\u0432 (\u044d\u0442\u0438 \u0440\u0430\u0441\u0447\u0435\u0442\u044b \u0431\u0443\u0434\u0443\u0442 \u043d\u0438\u0436\u0435), \u043f\u043e\u0434\u043e\u0433\u043d\u0430\u043b\u0438 <code>Z<\/code> \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <code>n<\/code> \u0438 <code>f<\/code>, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u043f\u043e\u043d\u044f\u0442\u044c \u043a\u0430\u043a\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u043b\u0438\u0437\u043a\u043e \u0438\u043b\u0438 \u0434\u0430\u043b\u0435\u043a\u043e \u0438 \u043d\u0435 \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0438\u0445, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0435\u0441\u043b\u0438 \u0432\u044b \u0438\u0437\u0443\u0447\u0438\u0442\u0435 \u043a\u043e\u0434 <code>getPerspectiveProjection<\/code> \u0442\u043e \u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u0447\u0442\u043e \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u043c\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 <code>[0, 0, -1, 0]<\/code> \u0438 \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u0441\u043b\u0435\u0434\u0438\u0442\u044c \u043a\u0430\u043a \u0432\u0435\u043a\u0442\u043e\u0440 \u0443\u043c\u043d\u043e\u0436\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043c\u0430\u0442\u0440\u0438\u0446\u0443, \u0442\u043e \u043c\u044b \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043c, \u0447\u0442\u043e <code>Z<\/code> \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0431\u0443\u0434\u0435\u0442 \u0443\u043c\u043d\u043e\u0436\u0430\u0442\u044c\u0441\u044f \u043d\u0430 <code>-1<\/code> \u0432 \u043c\u0430\u0442\u0440\u0438\u0446\u0435, \u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0441\u044f \u0432 <code>W<\/code>, \u0442.\u0435. \u0442\u0430\u043a\u0438\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c, \u043c\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b\u0438 <code>-Z<\/code>, \u0432 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0443 <code>W<\/code>. \u0410 \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u043c\u044b \u044d\u0442\u043e \u0437\u0430\u0442\u0435\u043c \u0447\u0442\u043e \u043d\u0430\u043c \u0432\u0441\u0435 \u0442\u0430\u043a\u0438 \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043a\u0430\u0436\u0434\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430 <code>-Z<\/code> (\u0442\u0435\u043f\u0435\u0440\u044c \u0443\u0436\u0435 \u0431\u0443\u0434\u0435\u043c \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043d\u0430 <code>W<\/code>), \u0447\u0442\u043e\u0431\u044b \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0430 \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u044b \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043d\u0430\u0448\u0435\u0439 \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u044b. \u0412\u043e\u0442 \u0433\u0434\u0435 \u043d\u0430\u043c \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u0442\u043e \u0441\u0430\u043c\u043e\u0435 <code>W<\/code>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u044b \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438 <code>1<\/code> \u0434\u043b\u044f \u0442\u043e\u0447\u0435\u043a. \u0422\u0430\u043a\u0438\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0432 \u0442\u0440\u0435\u0445\u043c\u0435\u0440\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u043c\u0438\u043c\u043e <code>X, Y, Z<\/code> \u0435\u0441\u0442\u044c \u0435\u0449\u0435 <code>W<\/code>, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u044b\u043c\u0438. \u042f \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u043b \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u0440\u0430\u043d\u044c\u0448\u0435, \u0442.\u043a. \u043d\u0430\u043c <code>W<\/code> \u0435\u0449\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u0430 \u0431\u044b\u043b\u0430 \u0434\u043b\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f. \u0412\u0430\u0436\u043d\u043e\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u043d\u0430 \u043a\u0430\u043d\u0432\u0430\u0441\u0435 \u0438\u0437 \u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442, \u0438 \u0432\u0441\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0447\u0442\u043e\u0431\u044b <code>W<\/code> \u0431\u044b\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 \u0435\u0434\u0438\u043d\u0438\u0446\u0435, \u043a\u0430\u043a \u0438 \u0431\u044b\u043b\u043e \u0432\u0441\u0435 \u0432\u0440\u0435\u043c\u044f \u0434\u043e \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043c\u0430\u0442\u0440\u0438\u0446\u0435\u0439 \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u044b. \u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043a\u043e\u0433\u0434\u0430 <code>W<\/code> \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 <code>1<\/code>, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0432\u0441\u0435\u0433\u0434\u0430 <code>X, Y, Z, W<\/code> \u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430 <code>W<\/code>. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 \u043f\u043e\u0441\u043b\u0435 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043d\u0430 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u0442\u0430\u043a\u0430\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u0430 <code>[10, 10, 10, 2]<\/code> \u0442\u043e \u0442\u0443\u0442 \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u0447\u0442\u043e <code>W=2<\/code> \u0438 \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0442\u043e\u0447\u043a\u0443 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043a\u0430\u0436\u0434\u0443\u044e \u0435\u0451 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0443 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430 <code>W<\/code>, \u0442.\u0435. <code>[10 \/ 2, 10 \/ 2, 10 \/ 2 , 2 \/ 2]<\/code>\u00a0 \u0438 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c <code>[5, 5, 5, 1]<\/code>, \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0447\u0442\u043e <code>W<\/code> \u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430 \u0441\u0430\u043c\u043e \u0441\u0435\u0431\u044f \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u0430\u0441\u0442 <code>1<\/code>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u044d\u0442\u0443 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c. \u0415\u0441\u043b\u0438 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0443 \u043d\u0430\u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u0440\u0430\u0432\u043d\u0430 <code>[10, 10, 10, 1]<\/code> \u0442\u043e\u0442 \u0442\u0443\u0442 \u0434\u0435\u043b\u0438\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043d\u0443\u0436\u043d\u043e, \u0442.\u043a. <code>W=1<\/code> \u0438 \u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043d\u0430\u043c \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0430\u0441\u0442, \u0442\u0443\u0442 \u0443\u0436\u0435 \u0432\u0441\u0435 \u043c\u043e\u0436\u043d\u043e \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435. \u041d\u043e \u043c\u044b \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u043c \u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430 <code>W<\/code> \u043f\u0435\u0440\u0435\u0434 \u0432\u044b\u0432\u043e\u0434\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430\u043c\u0438 <code>W<\/code> \u043d\u0430 <code>1<\/code> \u0432 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0435 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u0422\u0430\u043a\u0436\u0435 \u0437\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u0435 \u0447\u0442\u043e <code>W<\/code> \u0445\u0440\u0430\u043d\u0438\u0442 \u0432 \u0441\u0435\u0431\u0435 <code>-Z<\/code> \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u044b \u0434\u0435\u043b\u0438\u043b\u0438 \u0435\u0449\u0435 \u0434\u043e \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u044b, \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u043c\u044b \u0447\u0443\u0442\u044c \u043f\u0440\u043e\u043a\u0430\u0447\u0430\u043b\u0438 \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0432 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u044b (<code>fovy, aspect, n, f<\/code>). \u0418\u0442\u043e\u0433\u043e, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434 \u043f\u0435\u0440\u0435\u0434 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0432 <code>sceneVertices<\/code>: <\/p>\n<pre><code class=\"javascript\">vertex.x = (vertex.x \/ vertex.w * 800) vertex.y = (vertex.y \/ vertex.w * 600) \/\/ \u0412\u043e\u0442 \u043f\u0435\u0440\u0435\u0434 \u044d\u0442\u0438\u043c \u043a\u043e\u0434\u043e\u043c 2 \u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u0432\u044b\u0448\u0435 sceneVertices.push(vertex);<\/code><\/pre>\n<p> \u0412 \u043a\u043e\u0434\u0435 \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u0447\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u043f\u043e\u0434\u0435\u043b\u0438\u043b\u0438 \u043d\u0430 <code>W<\/code>, \u043c\u044b \u0435\u0449\u0435 \u0443\u043c\u043d\u043e\u0436\u0438\u043b\u0438 <code>X<\/code> \u043d\u0430 <code>800<\/code> \u0438 <code>Y<\/code> \u043d\u0430 <code>600<\/code>. \u042d\u0442\u043e \u0442\u0435 \u0436\u0435 \u0441\u0430\u043c\u044b\u0435 \u0441\u043a\u0430\u043b\u044f\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0434\u0435\u043b\u0438\u043b\u0438 \u043d\u0430 <code>-Z<\/code>, \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u043c \u0431\u044b\u043b\u043e <code>100<\/code>, \u0430 \u0442\u0443\u0442 <code>800<\/code> \u0438 <code>600<\/code>, \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u043e\u043d\u0438 \u0440\u0430\u0437\u043d\u044b\u0435, \u0442.\u043a. \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>aspect<\/code> \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u044b \u0438\u0441\u043a\u0430\u0437\u0438\u043b \u043c\u0430\u0441\u0448\u0442\u0430\u0431 <code>X<\/code> \u0438 \u0447\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u0432\u0435\u0440\u043d\u0443\u0442\u044c, \u043d\u0443\u0436\u043d\u043e \u0443\u043c\u043d\u043e\u0436\u0430\u0442\u044c \u043d\u0430 \u0447\u0438\u0441\u043b\u043e \u0431\u043e\u043b\u044c\u0448\u0435\u0435 \u0447\u0435\u043c <code>Y<\/code> \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u0442\u043e\u043c \u0441\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0438 \u0447\u0442\u043e \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u043b\u0438 \u0432 <code>aspect<\/code> \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u044b. \u0412\u043e\u043e\u0431\u0449\u0435 \u0447\u0442\u043e\u0431\u044b \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043d\u0435 \u043d\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c\u0441\u044f , \u044f \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u043c\u043d\u043e\u0436\u0430\u0442\u044c \u043d\u0430 \u0448\u0438\u0440\u0438\u043d\u0443 \u0438 \u0432\u044b\u0441\u043e\u0442\u0443 \u043e\u043a\u043d\u0430 \u043a\u0430\u043d\u0432\u0430\u0441\u0430 <code>X<\/code> \u0438 <code>Y<\/code> \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e. \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0443 \u0432\u0430\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0442\u0430\u043a\u043e\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442: <\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"\/img\/image-loader.svg\" height=\"606\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/dde\/d8c\/cfb\/dded8ccfb725b265229c94807e487bf7.png\" data-width=\"806\"\/><figcaption><\/figcaption><\/figure>\n<p> \u041a\u0430\u043a \u0432\u0438\u0434\u0438\u0442\u0435, \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u043f\u0440\u0438 \u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u043d\u0430 <code>-Z<\/code> (\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043d\u0438\u043a\u0443\u0434\u0430 \u043d\u0435 \u0434\u0435\u043b\u043e\u0441\u044c, \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c <code>-Z<\/code> \u043b\u0435\u0436\u0438\u0442 \u0432 <code>W<\/code>), \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438, \u0445\u043e\u0442\u044c \u0438 \u043d\u0435 \u0432\u0441\u0435\u043c \u043c\u044b \u0435\u0449\u0435 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c. \u041c\u043e\u0436\u0435\u0442\u0435 \u0440\u0430\u0441\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u0447\u043a\u0443 \u0441 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0432\u043e\u043a\u0440\u0443\u0433 \u043e\u0441\u0438 <code>Y<\/code> \u0447\u0442\u043e\u0431\u044b \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e, \u0432\u0435\u0434\u044c \u0442\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u0430 \u0438 \u0432\u0441\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0431\u043e\u043b\u0435\u0435 \u043a\u0440\u0430\u0441\u0438\u0432\u043e: <\/p>\n<pre><code class=\"javascript\">matrix = Matrix.multiply( \u00a0\u00a0Matrix.getRotationY(angle += 1), \u00a0\u00a0matrix );<\/code><\/pre>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f 3\u044f \u0447\u0430\u0441\u0442\u044c. \u0415\u0441\u0442\u044c 2 \u0432\u0435\u0449\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u0432 \u043f\u043b\u0430\u043d\u0430\u0445 \u043d\u0430 3\u044e \u0447\u0430\u0441\u0442\u044c \u0432 \u043a\u043e\u043d\u0446\u0435 \u0432\u0442\u043e\u0440\u043e\u0439, \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430\u043c\u0438 \u0438 \u043d\u043e\u0440\u043c\u0430\u043b\u044f\u043c\u0438, \u043d\u043e \u0442\u0435\u043a\u0443\u0449\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0432\u044b\u0448\u043b\u0430 \u043e\u0431\u044a\u0435\u043c\u043d\u0430\u044f, \u043a\u0430\u043a \u043c\u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0438 \u044f \u043f\u0440\u0438\u043d\u044f\u043b \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0442\u0435\u043c\u044b \u043f\u0440\u043e \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0438 \u0438 \u043d\u043e\u0440\u043c\u0430\u043b\u0438 \u0432 4\u044e \u0447\u0430\u0441\u0442\u044c. <\/p>\n<p>\u0418\u0442\u043e\u0433\u043e \u0432 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b \u0443\u0437\u043d\u0430\u043b\u0438 \u0447\u0442\u043e \u043a\u0430\u043c\u0435\u0440\u0430 \u044d\u0442\u043e \u043d\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043d\u0430 \u0441\u0446\u0435\u043d\u0435 (\u043a\u0430\u043a \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0430), \u0430 \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u0441\u0446\u0435\u043d\u044b \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0432\u0441\u0435\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0447\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0432\u0438\u0434\u043d\u044b \u0441 \u0436\u0435\u043b\u0430\u0435\u043c\u043e\u0433\u043e \u043d\u0430\u043c\u0438 \u0440\u0430\u043a\u0443\u0440\u0441\u0430 \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u0432 \u0437\u043e\u043d\u0435 \u043a\u0430\u043d\u0432\u0430\u0441\u0430 (\u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0442 <code>0<\/code> \u0434\u043e <code>800<\/code> \u043f\u043e <code>X<\/code> \u0438 \u043e\u0442 <code>0<\/code> \u0434\u043e <code>600<\/code> \u043f\u043e <code>Y<\/code>) . \u041c\u043e\u0436\u043d\u043e \u0434\u0430\u0436\u0435 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0447\u0442\u043e \u043a\u0430\u043d\u0432\u0430\u0441 (\u0438\u043b\u0438 \u0445\u043e\u043b\u0441\u0442) \u0434\u043b\u044f \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u043d\u0430\u0448\u0430 \u043a\u0430\u043c\u0435\u0440\u0430, \u0430 \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043b\u0438\u0431\u043e \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u043d\u0430 \u043d\u0435\u0433\u043e, \u043b\u0438\u0431\u043e \u043d\u0435\u0442.<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043c\u044b \u0443\u0437\u043d\u0430\u043b\u0438 \u0447\u0442\u043e \u0447\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u044d\u0444\u0444\u0435\u043a\u0442 \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u044b (\u0447\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435 \u0442\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435) \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c <code>X<\/code> \u0438 <code>Y<\/code> \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u043d\u0430 <code>-Z<\/code> (\u0442.\u043a \u0443 \u043d\u0430\u0441 <code>Z<\/code> \u0441 \u043e\u0442\u0434\u0430\u043b\u0435\u043d\u0438\u0435\u043c \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442\u0441\u044f, \u0430 \u0434\u043b\u044f \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0443\u0436\u043d\u043e \u0447\u0442\u043e\u0431\u044b \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u043b\u0441\u044f) \u0438 \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u043a\u0430\u0447\u0430\u043b\u0438, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u044b, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u0430 <code>-Z<\/code> \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u043b\u0441\u044f \u0432 <code>W<\/code>. \u0418 \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0432 \u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u0445 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e, \u043d\u0443\u0436\u043d\u043e \u0432\u0441\u0435 \u0438\u0445 \u043f\u0435\u0440\u0435\u0434 \u0432\u044b\u0432\u043e\u0434\u043e\u043c \u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430 <code>W<\/code>, \u0447\u0442\u043e \u043c\u044b \u0438 \u0441\u0434\u0435\u043b\u0430\u043b\u0438. \u0412\u0435\u0441\u044c \u043a\u043e\u0434 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043f\u043e\u0434 \u0441\u043f\u043e\u0439\u043b\u0435\u0440\u043e\u043c:<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434 \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"javascript\">const ctx = document.getElementById('surface').getContext('2d'); const imageData = ctx.createImageData(800, 600);  class Vector {   x = 0;   y = 0;   z = 0;   w = 1;    constructor(x, y, z, w = 1) {     this.x = x;     this.y = y;     this.z = z;     this.w = w;   }    static substruct(v1, v2) {     return new Vector(       v1.x - v2.x,       v1.y - v2.y,       v1.z - v2.z,       v1.w - v2.w     );   }    static crossProduct(a, b) {     return new Vector(       a.y * b.z - a.z * b.y,       a.z * b.x - a.x * b.z,       a.x * b.y - a.y * b.x     );   }    static add(v1, v2) {     return new Vector(       v1.x + v2.x,       v1.y + v2.y,       v1.z + v2.z     );   }    multiplyByScalar(s) {     this.x *= s;     this.y *= s;     this.z *= s;      return this;   }    getLength() {     return Math.sqrt(       this.x * this.x + this.y * this.y + this.z * this.z     );   }    normalize() {     const length = this.getLength();      this.x \/= length;     this.y \/= length;     this.z \/= length;      return this;   } }  class Matrix {   static getLookAt(eye, target, up) {     const vz = Vector.substruct(eye, target).normalize();     const vx = Vector.crossProduct(up, vz).normalize();     const vy = Vector.crossProduct(vz, vx);      return [       [vx.x, vy.x, vz.x, -eye.x],       [vx.y, vy.y, vz.y, -eye.y],       [vx.z, vy.z, vz.z, -eye.z],       [0, 0, 0, 1]     ];   }    static getPerspectiveProjection(fovy, aspect, n, f) {     const radians = Math.PI \/ 180 * fovy;     const sx = (1 \/ Math.tan(radians \/ 2)) \/ aspect;     const sy = (1 \/ Math.tan(radians \/ 2));     const sz = (f + n) \/ (f - n);     const dz = (-2 * f * n) \/ (f - n);      return [       [sx, 0, 0, 0],       [0, sy, 0, 0],       [0, 0, sz, dz],       [0, 0, -1, 0]     ];   }    static multiply(a, b) {     const m = [       [0, 0, 0, 0],       [0, 0, 0, 0],       [0, 0, 0, 0],       [0, 0, 0, 0]     ];      for (let i = 0; i &lt; 4; i++) {       for (let j = 0; j &lt; 4; j++) {         m[i][j] = a[i][0] * b[0][j] +           a[i][1] * b[1][j] +           a[i][2] * b[2][j] +           a[i][3] * b[3][j];       }     }      return m;   }    static getRotationX(angle) {     const rad = Math.PI \/ 180 * angle;      return [       [1, 0, 0, 0],       [0, Math.cos(rad), -Math.sin(rad), 0],       [0, Math.sin(rad), Math.cos(rad), 0],       [0, 0, 0, 1]     ];   }    static getRotationY(angle) {     const rad = Math.PI \/ 180 * angle;      return [       [Math.cos(rad), 0, Math.sin(rad), 0],       [0, 1, 0, 0],       [-Math.sin(rad), 0, Math.cos(rad), 0],       [0, 0, 0, 1]     ];   }    static getRotationZ(angle) {     const rad = Math.PI \/ 180 * angle;      return [       [Math.cos(rad), -Math.sin(rad), 0, 0],       [Math.sin(rad), Math.cos(rad), 0, 0],       [0, 0, 1, 0],       [0, 0, 0, 1]     ];   }    static getTranslation(dx, dy, dz) {     return [       [1, 0, 0, dx],       [0, 1, 0, dy],       [0, 0, 1, dz],       [0, 0, 0, 1]     ];   }    static getScale(sx, sy, sz) {     return [       [sx, 0, 0, 0],       [0, sy, 0, 0],       [0, 0, sz, 0],       [0, 0, 0, 1]     ];   }    static multiplyVector(m, v) {     return new Vector(       m[0][0] * v.x + m[0][1] * v.y + m[0][2] * v.z + m[0][3] * v.w,       m[1][0] * v.x + m[1][1] * v.y + m[1][2] * v.z + m[1][3] * v.w,       m[2][0] * v.x + m[2][1] * v.y + m[2][2] * v.z + m[2][3] * v.w,       m[3][0] * v.x + m[3][1] * v.y + m[3][2] * v.z + m[3][3] * v.w     );   } }  class Drawer {   surface = null;   width = 0;   height = 0;    constructor(surface, width, height) {     this.surface = surface;     this.width = width;     this.height = height;   }    drawPixel(x, y, r, g, b) {     x += this.width \/ 2;     y = -(y - this.height \/ 2);     const offset = (this.width * y + x) * 4;      if (x >= 0 &amp;&amp; x &lt; this.width &amp;&amp; y >= 0 &amp;&amp; y &lt; this.height) {       this.surface[offset] = r;       this.surface[offset + 1] = g;       this.surface[offset + 2] = b;       this.surface[offset + 3] = 255;     }   }    drawLine(x1, y1, x2, y2, r = 0, g = 0, b = 0) {     const round = Math.trunc;     x1 = round(x1);     y1 = round(y1);     x2 = round(x2);     y2 = round(y2);      const c1 = y2 - y1;     const c2 = x2 - x1;      const length = Math.max(       Math.abs(c1),       Math.abs(c2)     );      const xStep = c2 \/ length;     const yStep = c1 \/ length;      for (let i = 0; i &lt;= length; i++) {       this.drawPixel(         Math.trunc(x1 + xStep * i),         Math.trunc(y1 + yStep * i),         r, g, b       );     }   }    clearSurface() {     const surfaceSize = this.width * this.height * 4;     for (let i = 0; i &lt; surfaceSize; i++) {       this.surface[i] = 0;     }   } }  const drawer = new Drawer(   imageData.data,   imageData.width,   imageData.height );  \/\/ Pyramid vertices const vertices = [   new Vector(-0.5, 1, 0.5), \/\/ 0 \u0432\u0435\u0440\u0448\u0438\u043d\u0430   new Vector(-0.5, 1, -0.5), \/\/ 1 \u0432\u0435\u0440\u0448\u0438\u043d\u0430   new Vector(0.5, 1, -0.5), \/\/ 2 \u0432\u0435\u0440\u0448\u0438\u043d\u0430   new Vector(0.5, 1, 0.5), \/\/ 3 \u0432\u0435\u0440\u0448\u0438\u043d\u0430   new Vector(-1, -1, 1), \/\/ 4 \u0432\u0435\u0440\u0448\u0438\u043d\u0430   new Vector(-1, -1, -1), \/\/ 5 \u0432\u0435\u0440\u0448\u0438\u043d\u0430   new Vector(1, -1, -1), \/\/ 6 \u0432\u0435\u0440\u0448\u0438\u043d\u0430   new Vector(1, -1, 1) \/\/ 7 \u0432\u0435\u0440\u0448\u0438\u043d\u0430 ];  \/\/ Pyramid edges const edges = [   [0, 1],   [1, 2],   [2, 3],   [3, 0],    [0, 4],   [1, 5],   [2, 6],   [3, 7],    [4, 5],   [5, 6],   [6, 7],   [7, 4] ];  let angle = 0; setInterval(() => {   let matrix = Matrix.getRotationX(0);    matrix = Matrix.multiply(     Matrix.getRotationY(angle += 1),     matrix   );    matrix = Matrix.multiply(     Matrix.getScale(100, 100, 100),     matrix   );    matrix = Matrix.multiply(     Matrix.getTranslation(0, 0, -500),     matrix   );    matrix = Matrix.multiply(     Matrix.getLookAt(       new Vector(0, 0, 0),       new Vector(0, 0, -1),       new Vector(0, 1, 0)     ),     matrix   );    matrix = Matrix.multiply(     Matrix.getPerspectiveProjection(       90, 800 \/ 600,       -1, -1000),     matrix   );    const sceneVertices = [];   for (let i = 0; i &lt; vertices.length; i++) {     let vertex = Matrix.multiplyVector(       matrix,       vertices[i]     );      vertex.x = vertex.x \/ vertex.w * 800;     vertex.y = vertex.y \/ vertex.w * 600;      sceneVertices.push(vertex);   }    drawer.clearSurface();    for (let i = 0, l = edges.length; i &lt; l; i++) {     const e = edges[i];      drawer.drawLine(       sceneVertices[e[0]].x,       sceneVertices[e[0]].y,       sceneVertices[e[1]].x,       sceneVertices[e[1]].y,       0, 0, 255     );   }    ctx.putImageData(imageData, 0, 0); }, 100); <\/code><\/pre>\n<\/div>\n<\/details>\n<p><strong>\u0427\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435 ?<\/strong><\/p>\n<p>\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u0430\u043a \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432 \u0438 \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u0430\u0435\u043c \u0443\u0441\u0435\u0447\u0435\u043d\u043d\u0443\u044e \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0443 \u0441 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043b\u0430 \u0438\u0437 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432. \u041f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043c\u0441\u044f \u0441 \u0442\u0435\u043c \u043a\u0430\u043a \u043d\u0435 \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0442\u0443 \u0447\u0430\u0441\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0435 \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u0430 \u043a \u043a\u0430\u043c\u0435\u0440\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043d\u043e\u0440\u043c\u0430\u043b\u0438.<\/p>\n<p><strong>\u0411\u043e\u043d\u0443\u0441<\/strong><\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a \u043d\u0430\u0448\u0435\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u044b, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043a\u0430\u043c\u0435\u0440\u044b \u0432\u043f\u0435\u0440\u0435\u0434\/\u043d\u0430\u0437\u0430\u0434\/\u0432\u043b\u0435\u0432\u043e\/\u0432\u043f\u0440\u0430\u0432\u043e \u043a\u043b\u0430\u0432\u0438\u0448\u0430\u043c\u0438 WASD \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e.<\/p>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043a\u0430\u043c\u0435\u0440\u044b. \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u043c \u044d\u0442\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043d\u0438\u0436\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u0431\u044b\u043b\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0432 \u043b\u044e\u0431\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u0432 \u043a\u043e\u0434\u0435:<\/p>\n<pre><code class=\"javascript\">let cameraDirection = new Vector(0, 0, -1, 0); let cameraPos = new Vector(0, 0, 0);<\/code><\/pre>\n<p> \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0447\u0442\u043e <code>cameraDirection<\/code> \u044d\u0442\u043e \u043d\u0435 <code>target<\/code> \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043c\u0430\u0442\u0440\u0438\u0446\u044b <code>lookAt<\/code>, \u0442.\u043a. \u0442\u0430\u043c \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u043b\u0438 \u0442\u043e\u0447\u043a\u0443, \u043a\u0443\u0434\u0430 \u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0430 \u044d\u0442\u043e \u0432\u0435\u043a\u0442\u043e\u0440 (\u0443 \u043d\u0435\u0433\u043e 4\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>W=0<\/code>). <code>target<\/code> \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438, \u044d\u0442\u043e \u043d\u0430\u043c \u0434\u0430\u0441\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u043e\u0431\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043a\u0430\u043c\u0435\u0440\u043e\u0439, \u043f\u0440\u0438\u043c\u0435\u0440 \u0431\u0443\u0434\u0435\u0442 \u043d\u0438\u0436\u0435. \u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0438\u0445 \u043f\u0435\u0440\u0435\u0434\u0430\u0434\u0438\u043c \u0432 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 <code>lookAt<\/code>: <\/p>\n<pre><code class=\"javascript\">matrix = Matrix.multiply( \u00a0\u00a0Matrix.getLookAt( \u00a0\u00a0\u00a0\u00a0cameraPos, \u00a0\u00a0\u00a0\u00a0Vector.add(cameraPos, cameraDirection), \u00a0\u00a0\u00a0\u00a0new Vector(0, 1, 0) \u00a0\u00a0), \u00a0\u00a0matrix );<\/code><\/pre>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>cameraPos<\/code> \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439, \u0430 \u0432\u043e\u0442 \u0432\u0442\u043e\u0440\u043e\u0439 (<code>target<\/code> ) \u043c\u044b \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u043f\u0443\u0442\u0435\u043c \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043a\u0430\u043c\u0435\u0440\u044b \u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u043e\u0447\u043a\u0443, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0441\u043c\u043e\u0442\u0440\u0438\u043c. \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0431\u0435\u0437 \u043e\u0448\u0438\u0431\u043e\u043a, \u0442\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u044b \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f.\u00a0 <\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043a\u043b\u0430\u0432\u0438\u0448 WASD. \u042d\u0442\u043e javascript-\u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430 \u043d\u0435\u043c \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f, \u0442.\u043a. \u0435\u0441\u043b\u0438 \u0432\u044b \u0434\u0435\u043b\u0430\u0435\u0442\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0438\u0437 \u0441\u0442\u0430\u0442\u044c\u0438 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u043c \u044f\u0437\u044b\u043a\u0435, \u0442\u043e \u0443 \u0432\u0430\u0441 \u044d\u0442\u0430 \u0447\u0430\u0441\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f, \u043d\u0430 JS \u043d\u0438\u0436\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"javascript\">window.addEventListener('keypress', (e) => { \u00a0\u00a0if (e.code === 'KeyW') { \u00a0\u00a0} else if (e.code === 'KeyS') { \u00a0\u00a0} else if (e.code === 'KeyA') { \u00a0\u00a0} else if (e.code === 'KeyD') { \u00a0\u00a0} });<\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u043a\u0430 \u0437\u0430\u0436\u0430\u0442\u0430 \u043a\u043b\u0430\u0432\u0438\u0448\u0430 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 \u0438 4 \u0443\u0441\u043b\u043e\u0432\u0438\u044f, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043a\u0430\u043a\u0430\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u043a\u043b\u0430\u0432\u0438\u0448\u0430. <\/p>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0438\u0434\u0442\u0438 \u0432\u043f\u0435\u0440\u0435\u0434, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043a \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u043a\u0430\u043c\u0435\u0440\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0435 \u0432\u0435\u043a\u0442\u043e\u0440 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u043a\u0430\u043c\u0435\u0440 \u0441\u0442\u0430\u043d\u0435\u0442 \u0431\u043b\u0438\u0436\u0435 \u043a \u0442\u043e\u0447\u043a\u0435 \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0441\u043c\u043e\u0442\u0440\u0438\u0442, \u0430 \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0443, \u0442\u043e \u043e\u043d\u0430 \u0441\u0442\u0430\u043d\u0435\u0442 \u0431\u043b\u0438\u0436\u0435 \u043a \u043d\u0430\u043c, \u043a\u0430\u043a \u0431\u0443\u0434\u0442\u043e \u043c\u044b \u043a \u043d\u0435\u0439 \u0438\u0434\u0435\u043c. \u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u044b\u043b\u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0439, \u043d\u0443\u0436\u043d\u043e \u0447\u0442\u043e\u0431\u044b \u0432\u0435\u043a\u0442\u043e\u0440 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0431\u044b\u043b \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d, \u0432\u0435\u0434\u044c \u0435\u0441\u043b\u0438 \u0435\u0433\u043e \u0434\u043b\u0438\u043d\u0430 \u043d\u0435 \u0440\u0430\u0432\u043d\u0430 <code>1<\/code>, \u0442\u043e \u043f\u0440\u0438\u0431\u0430\u0432\u043b\u044f\u044f \u0442\u0430\u043a\u043e\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 \u043a \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u044b\u0441\u0442\u0440\u043e. \u0423 \u043c\u0435\u043d\u044f <code>cameraDirection<\/code> \u0440\u0430\u0432\u0435\u043d <code>0, 0, -1<\/code> \u0438 \u043e\u043d \u0443\u0436\u0435 \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b, \u043d\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0443\u0439\u0442\u0435 \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u0435 \u043d\u0443\u0436\u043d\u044b\u0445 \u0431\u0430\u0433\u043e\u0432. \u0422\u0430\u043a\u0436\u0435 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043a\u043b\u0430\u0432\u0438\u0448, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043e\u0431\u044a\u044f\u0432\u0438\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438, \u0447\u0442\u043e\u0431\u044b \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0432\u0435\u043a\u0442\u043e\u0440 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u0430\u043c\u0435\u0440\u044b \u0438 \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435. \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0432\u043f\u0435\u0440\u0435\u0434 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"javascript\">const speed = 5; cameraDirection.normalize();  if (e.code === 'KeyW') {   cameraPos = Vector.add(cameraPos,          cameraDirection.multiplyByScalar(speed)   ) }<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0436\u0438\u043c\u0430\u044f \u043a\u043b\u0430\u0432\u0438\u0448\u0443 <code>W<\/code> \u0432\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0430\u0442\u044c \u043a\u0430\u043c\u0435\u0440\u0443 \u043a \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0435 (\u0445\u043e\u0442\u044c \u043c\u044b \u0442\u043e \u0437\u043d\u0430\u0435\u043c \u0447\u0442\u043e \u044d\u0442\u043e \u0432\u0435\u0441\u044c \u043c\u0438\u0440 \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0430\u0435\u0442\u0441\u044f \u043a \u043d\u0430\u043c). \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u044f \u0441\u043b\u043e\u0436\u0438\u043b \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043a\u0430\u043c\u0435\u0440\u044b \u0441 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c, \u0443\u043c\u043d\u043e\u0436\u0438\u0432 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 \u0441\u043a\u0430\u043b\u044f\u0440, \u0447\u0442\u043e\u0431\u044b \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u043d\u0430\u0437\u0430\u0434 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e (\u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u043d\u0438\u0436\u0435).<\/p>\n<p>\u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0432\u0431\u043e\u043a, \u043d\u0443\u0436\u043d\u043e \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439. \u041c\u044b \u0442\u043e \u0437\u043d\u0430\u0435\u043c \u0447\u0442\u043e \u043a\u0430\u043c\u0435\u0440\u0430 \u0441\u043c\u043e\u0442\u0440\u0438\u0442 \u0441\u0442\u0440\u043e\u0433\u043e \u0432\u0434\u0430\u043b\u044c \u0438 \u0447\u0442\u043e\u0431\u044b \u0441\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430, \u0441\u043a\u0430\u0436\u0435\u043c \u0432\u043b\u0435\u0432\u043e, \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0434\u043e\u0431\u0440\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0432\u0435\u043a\u0442\u043e\u0440 \u0432\u0440\u0443\u0447\u043d\u0443\u044e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0437\u043d\u0430\u044f \u0447\u0442\u043e \u043c\u044b \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432 \u0442\u043e\u0447\u043a\u0443 <code>0, 0, -1<\/code> \u0430 \u0432\u0435\u0440\u0445 \u044d\u0442\u043e <code>0, 1, 0<\/code> \u0442\u043e \u0432\u0435\u043a\u0442\u043e\u0440 \u0432\u0431\u043e\u043a (\u0432\u043b\u0435\u0432\u043e) \u0431\u0443\u0434\u0435\u0442 <code>-1, 0, 0<\/code>.\u00a0 \u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u044d\u0442\u043e \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438, \u0442\u043e\u0433\u0434\u0430 \u043f\u0440\u0438 \u043b\u044e\u0431\u043e\u043c \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u043a\u0430\u043c\u0435\u0440\u044b \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u043b\u0435\u0432\u043e\\\u0432\u043f\u0440\u0430\u0432\u043e. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0435\u043a\u0442\u043e\u0440 \u043f\u0435\u0440\u043f\u0435\u043d\u0434\u0438\u043a\u0443\u043b\u044f\u0440\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440\u0430\u043c \u0432\u0432\u0435\u0440\u0445 \u0438 \u0432\u043f\u0435\u0440\u0435\u0434 (\u044d\u0442\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0438\u0437\u0443\u0447\u0430\u044f \u043d\u043e\u0440\u043c\u0430\u043b\u0438), \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0432\u0448\u0438\u0441\u044c \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f <code>crossProduct<\/code>. \u0418 \u0437\u0430\u0442\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0438\u0439\u0441\u044f \u0432\u0435\u043a\u0442\u043e\u0440 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u043a\u0430\u043c\u0435\u0440\u044b, \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u043a\u0430\u043a \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0434\u043b\u044f \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u0432\u043f\u0435\u0440\u0435\u0434:<\/p>\n<pre><code class=\"javascript\">if (e.code === 'KeyA') { \u00a0\u00a0const side = Vector.crossProduct( \u00a0\u00a0\u00a0\u00a0new Vector(0, 1, 0), \/\/ \u0412\u0435\u043a\u0442\u043e\u0440 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0432\u0435\u0440\u0445 \u00a0\u00a0\u00a0\u00a0cameraDirection \u00a0\u00a0).normalize(); \/\/ side - \u0432\u0435\u043a\u0442\u043e\u0440 \u043f\u0435\u0440\u043f\u0435\u043d\u0434\u0438\u043a\u0443\u043b\u044f\u0440\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440\u0430\u043c \u043f\u0440\u044f\u043c\u043e \u0438 \u0432\u0432\u0435\u0440\u0445 \u00a0\u00a0cameraPos = Vector.add(cameraPos, side.multiplyByScalar(speed)); }<\/code><\/pre>\n<p> \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u0432\u043f\u0440\u0430\u0432\u043e (\u043a\u043b\u0430\u0432\u0438\u0448\u0430 KeyD). <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0442\u044c\u0441\u044f \u043f\u043e \u0441\u0446\u0435\u043d\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0430\u043c\u0438 WASD. \u0415\u0441\u043b\u0438 \u043f\u043e\u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u043e\u0439\u0442\u0438 \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0443 \u043d\u0430\u0441\u043a\u0432\u043e\u0437\u044c, \u0442\u043e \u0432\u044b \u0432\u0441\u0435 \u0435\u0449\u0435 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442\u0435 \u0431\u0430\u0433, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0432\u0438\u0434\u0435\u043b\u0438 \u0440\u0430\u043d\u0435\u0435 \u0432 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438, \u0441\u0432\u044f\u0437\u0430\u043d \u043e\u043d \u0441 \u0442\u0435\u043c \u0447\u0442\u043e \u043c\u044b \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u043d\u0435 \u0443\u043c\u0435\u0435\u043c \u043d\u0435 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442\u044c \u0444\u0438\u0433\u0443\u0440\u044b \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0435\u0441\u044f \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u043b\u0438\u0437\u043a\u043e \u043a \u043a\u0430\u043c\u0435\u0440\u0435, \u043d\u043e \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430\u0443\u0447\u0438\u043c\u0441\u044f \u043f\u043e\u0437\u0436\u0435.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0442\u043e\u0447\u043d\u043e \u0432\u0441\u0435, \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0439\u0442\u0435 \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438, \u043c\u0430\u0442\u0440\u0438\u0446\u0430\u043c\u0438, \u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u043f\u043e\u0434 \u0441\u0432\u043e\u0438 \u043d\u0443\u0436\u0434\u044b, \u0442\u0430\u043a \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043b\u0443\u0447\u0448\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0435.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u0431\u043e\u043d\u0443\u0441\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"javascript\">const ctx = document.getElementById('surface').getContext('2d'); const imageData = ctx.createImageData(800, 600);  class Vector {   x = 0;   y = 0;   z = 0;   w = 1;    constructor(x, y, z, w = 1) {     this.x = x;     this.y = y;     this.z = z;     this.w = w;   }    static substruct(v1, v2) {     return new Vector(       v1.x - v2.x,       v1.y - v2.y,       v1.z - v2.z,       v1.w - v2.w     );   }    static crossProduct(a, b) {     return new Vector(       a.y * b.z - a.z * b.y,       a.z * b.x - a.x * b.z,       a.x * b.y - a.y * b.x     );   }    static add(v1, v2) {     return new Vector(       v1.x + v2.x,       v1.y + v2.y,       v1.z + v2.z     );   }    multiplyByScalar(s) {     this.x *= s;     this.y *= s;     this.z *= s;      return this;   }    getLength() {     return Math.sqrt(       this.x * this.x + this.y * this.y + this.z * this.z     );   }    normalize() {     const length = this.getLength();      this.x \/= length;     this.y \/= length;     this.z \/= length;      return this;   } }  class Matrix {   static getLookAt(eye, target, up) {     const vz = Vector.substruct(eye, target).normalize();     const vx = Vector.crossProduct(up, vz).normalize();     const vy = Vector.crossProduct(vz, vx);      return [       [vx.x, vy.x, vz.x, -eye.x],       [vx.y, vy.y, vz.y, -eye.y],       [vx.z, vy.z, vz.z, -eye.z],       [0, 0, 0, 1]     ];   }    static getPerspectiveProjection(fovy, aspect, n, f) {     const radians = Math.PI \/ 180 * fovy;     const sx = (1 \/ Math.tan(radians \/ 2)) \/ aspect;     const sy = (1 \/ Math.tan(radians \/ 2));     const sz = (f + n) \/ (f - n);     const dz = (-2 * f * n) \/ (f - n);      return [       [sx, 0, 0, 0],       [0, sy, 0, 0],       [0, 0, sz, dz],       [0, 0, -1, 0]     ];   }    static multiply(a, b) {     const m = [       [0, 0, 0, 0],       [0, 0, 0, 0],       [0, 0, 0, 0],       [0, 0, 0, 0]     ];      for (let i = 0; i &lt; 4; i++) {       for (let j = 0; j &lt; 4; j++) {         m[i][j] = a[i][0] * b[0][j] +           a[i][1] * b[1][j] +           a[i][2] * b[2][j] +           a[i][3] * b[3][j];       }     }      return m;   }    static getRotationX(angle) {     const rad = Math.PI \/ 180 * angle;      return [       [1, 0, 0, 0],       [0, Math.cos(rad), -Math.sin(rad), 0],       [0, Math.sin(rad), Math.cos(rad), 0],       [0, 0, 0, 1]     ];   }    static getRotationY(angle) {     const rad = Math.PI \/ 180 * angle;      return [       [Math.cos(rad), 0, Math.sin(rad), 0],       [0, 1, 0, 0],       [-Math.sin(rad), 0, Math.cos(rad), 0],       [0, 0, 0, 1]     ];   }    static getRotationZ(angle) {     const rad = Math.PI \/ 180 * angle;      return [       [Math.cos(rad), -Math.sin(rad), 0, 0],       [Math.sin(rad), Math.cos(rad), 0, 0],       [0, 0, 1, 0],       [0, 0, 0, 1]     ];   }    static getTranslation(dx, dy, dz) {     return [       [1, 0, 0, dx],       [0, 1, 0, dy],       [0, 0, 1, dz],       [0, 0, 0, 1]     ];   }    static getScale(sx, sy, sz) {     return [       [sx, 0, 0, 0],       [0, sy, 0, 0],       [0, 0, sz, 0],       [0, 0, 0, 1]     ];   }    static multiplyVector(m, v) {     return new Vector(       m[0][0] * v.x + m[0][1] * v.y + m[0][2] * v.z + m[0][3] * v.w,       m[1][0] * v.x + m[1][1] * v.y + m[1][2] * v.z + m[1][3] * v.w,       m[2][0] * v.x + m[2][1] * v.y + m[2][2] * v.z + m[2][3] * v.w,       m[3][0] * v.x + m[3][1] * v.y + m[3][2] * v.z + m[3][3] * v.w     );   } }  class Drawer {   surface = null;   width = 0;   height = 0;    constructor(surface, width, height) {     this.surface = surface;     this.width = width;     this.height = height;   }    drawPixel(x, y, r, g, b) {     x += this.width \/ 2;     y = -(y - this.height \/ 2);     const offset = (this.width * y + x) * 4;      if (x >= 0 &amp;&amp; x &lt; this.width &amp;&amp; y >= 0 &amp;&amp; y &lt; this.height) {       this.surface[offset] = r;       this.surface[offset + 1] = g;       this.surface[offset + 2] = b;       this.surface[offset + 3] = 255;     }   }    drawLine(x1, y1, x2, y2, r = 0, g = 0, b = 0) {     const round = Math.trunc;     x1 = round(x1);     y1 = round(y1);     x2 = round(x2);     y2 = round(y2);      const c1 = y2 - y1;     const c2 = x2 - x1;      const length = Math.max(       Math.abs(c1),       Math.abs(c2)     );      const xStep = c2 \/ length;     const yStep = c1 \/ length;      for (let i = 0; i &lt;= length; i++) {       this.drawPixel(         Math.trunc(x1 + xStep * i),         Math.trunc(y1 + yStep * i),         r, g, b       );     }   }    clearSurface() {     const surfaceSize = this.width * this.height * 4;     for (let i = 0; i &lt; surfaceSize; i++) {       this.surface[i] = 0;     }   } }  let cameraDirection = new Vector(0, 0, -1, 0); let cameraPos = new Vector(0, 0, 0);  window.addEventListener('keypress', (e) => {   const speed = 5;   cameraDirection.normalize();   if (e.code === 'KeyW') {     cameraPos = Vector.add(cameraPos, cameraDirection.multiplyByScalar(speed));   } else if (e.code === 'KeyS') {     cameraPos = Vector.substruct(cameraPos, cameraDirection.multiplyByScalar(speed));   } else if (e.code === 'KeyA') {     const side = Vector.crossProduct(       new Vector(0, 1, 0),       cameraDirection     ).normalize();     cameraPos = Vector.add(cameraPos, side.multiplyByScalar(speed));   } else if (e.code === 'KeyD') {     const side = Vector.crossProduct(       new Vector(0, 1, 0),       cameraDirection     ).normalize();     cameraPos = Vector.substruct(cameraPos, side.multiplyByScalar(speed));   } });  const drawer = new Drawer(   imageData.data,   imageData.width,   imageData.height );  \/\/ Pyramid vertices const vertices = [   new Vector(-0.5, 1, 0.5), \/\/ 0 \u0432\u0435\u0440\u0448\u0438\u043d\u0430   new Vector(-0.5, 1, -0.5), \/\/ 1 \u0432\u0435\u0440\u0448\u0438\u043d\u0430   new Vector(0.5, 1, -0.5), \/\/ 2 \u0432\u0435\u0440\u0448\u0438\u043d\u0430   new Vector(0.5, 1, 0.5), \/\/ 3 \u0432\u0435\u0440\u0448\u0438\u043d\u0430   new Vector(-1, -1, 1), \/\/ 4 \u0432\u0435\u0440\u0448\u0438\u043d\u0430   new Vector(-1, -1, -1), \/\/ 5 \u0432\u0435\u0440\u0448\u0438\u043d\u0430   new Vector(1, -1, -1), \/\/ 6 \u0432\u0435\u0440\u0448\u0438\u043d\u0430   new Vector(1, -1, 1) \/\/ 7 \u0432\u0435\u0440\u0448\u0438\u043d\u0430 ];  \/\/ Pyramid edges const edges = [   [0, 1],   [1, 2],   [2, 3],   [3, 0],    [0, 4],   [1, 5],   [2, 6],   [3, 7],    [4, 5],   [5, 6],   [6, 7],   [7, 4] ];  let angle = 0; setInterval(() => {   let matrix = Matrix.getRotationX(0);    matrix = Matrix.multiply(     Matrix.getScale(100, 100, 100),     matrix   );    matrix = Matrix.multiply(     Matrix.getTranslation(0, 0, -500),     matrix   );    matrix = Matrix.multiply(     Matrix.getLookAt(       cameraPos,       Vector.add(cameraPos, cameraDirection),       new Vector(0, 1, 0)     ),     matrix   );    matrix = Matrix.multiply(     Matrix.getPerspectiveProjection(       90, 800 \/ 600,       -1, -1000),     matrix   );    const sceneVertices = [];   for (let i = 0; i &lt; vertices.length; i++) {     let vertex = Matrix.multiplyVector(       matrix,       vertices[i]     );      vertex.x = vertex.x \/ vertex.w * 800;     vertex.y = vertex.y \/ vertex.w * 600;      sceneVertices.push(vertex);   }    drawer.clearSurface();    for (let i = 0, l = edges.length; i &lt; l; i++) {     const e = edges[i];      drawer.drawLine(       sceneVertices[e[0]].x,       sceneVertices[e[0]].y,       sceneVertices[e[1]].x,       sceneVertices[e[1]].y,       0, 0, 255     );   }    ctx.putImageData(imageData, 0, 0); }, 100);   <\/code><\/pre>\n<\/div>\n<\/details>\n<\/div>\n<\/div>\n<p> <!----> <!----><br \/> \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\/599403\/\"> https:\/\/habr.com\/ru\/post\/599403\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\" class=\"article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0443\u0437\u043d\u0430\u0435\u043c \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u043a\u0430\u043c\u0435\u0440\u0430 \u0432 3D \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 (\u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u0432\u0438\u0434\u0430) \u0438 \u043a\u0430\u043a \u043e\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0443\u0437\u043d\u0430\u0435\u043c \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0447\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435 \u2014 \u043c\u0435\u043d\u044c\u0448\u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 (\u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438).\u00a0 <\/p>\n<p>\u041c\u044b \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0443 \u043d\u0430\u0434 \u043a\u043e\u0434\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443 \u043d\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0432 \u0444\u0438\u043d\u0430\u043b\u0435 <a href=\"https:\/\/habr.com\/ru\/post\/497808\/\" rel=\"noopener noreferrer nofollow\">2-\u0439 \u0447\u0430\u0441\u0442\u0438<\/a>.\u00a0 \u0418 \u043d\u0430\u0447\u043d\u0435\u043c \u0441 \u043e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u044f \u043a\u0430\u043c\u0435\u0440\u044b \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 (\u043c.\u0431. \u0432 3D \u0438\u0433\u0440\u0435). <\/p>\n<p>\u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u043e\u043f\u0438\u0441\u0430\u043b\u0438 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 8-\u043c\u0438 \u0432\u0435\u0440\u0448\u0438\u043d \u043a\u0443\u0431, \u0438 \u0432\u0441\u0435 \u0435\u0433\u043e \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0431\u044b\u043b\u0438 \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 <code>[-1, 1]<\/code> \u0438 \u043c\u044b \u0438\u0445 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0438\u043b\u0438 \u0442\u0430\u043a, \u0447\u0442\u043e \u0446\u0435\u043d\u0442\u0440 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 <code>[0, 0, 0]<\/code>, \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0442\u0430\u043a\u0436\u0435 \u0446\u0435\u043d\u0442\u0440\u043e\u043c \u043d\u0430\u0448\u0435\u0433\u043e \u043a\u0443\u0431\u0430. \u042d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0431\u044b\u043b\u043e \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0430\u043a. \u0412\u0441\u043f\u043e\u043c\u043d\u0438\u043c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0441 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0433\u0434\u0435 \u043c\u044b \u0432\u0440\u0430\u0449\u0430\u043b\u0438 \u043a\u0443\u0431 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u043e\u043a\u0440\u0443\u0433 \u043e\u0441\u0438 <code>X<\/code>, \u0430 \u043f\u043e\u0442\u043e\u043c \u0432\u043e\u043a\u0440\u0443\u0433 \u043e\u0441\u0438 <code>Y<\/code>, \u043f\u043e\u0442\u043e\u043c \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u043b\u0438 \u043a\u0443\u0431 \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u043b\u0438, \u0442\u0430\u043c \u043c\u044b \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b\u0438 \u043f\u0440\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438\u00a0 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043c\u0430\u0442\u0440\u0438\u0446\u0430\u043c\u0438 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e, \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0432\u043e\u043a\u0440\u0443\u0433 \u043e\u0441\u0435\u0439 \u0438\u043c\u0435\u0435\u0442\u00a0 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0438 \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0440\u0430\u0437\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u0412\u0441\u0435 \u044d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u043b\u043e \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043a\u0443\u0431, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043e\u043a\u0440\u0443\u0433 \u043e\u0441\u0438 <code>X<\/code>, \u0442\u043e \u0435\u0433\u043e \u043e\u0441\u044c <code>Y<\/code>, \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u043b\u0430 \u0431\u044b \u0441\u043c\u0435\u0441\u0442\u0438\u0442\u044c\u0441\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043a\u0443\u0431\u0438\u043a \u0420\u0443\u0431\u0438\u043a\u0430 \u0432 \u0441\u043e\u0431\u0440\u0430\u043d\u043e\u043c \u0432\u0438\u0434\u0435, \u0438 \u0435\u0433\u043e \u0441\u0438\u043d\u044f\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430 \u0441\u043c\u043e\u0442\u0440\u0438\u0442 \u0432\u0432\u0435\u0440\u0445 \u0438 \u043e\u0441\u044c <code>Y<\/code> \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437\u00a0 \u0435\u0435 \u0446\u0435\u043d\u0442\u0440. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043b\u0435\u0433\u043a\u043e\u00a0 \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u0433\u0434\u0435 \u043e\u0441\u044c <code>Y<\/code> (\u0442\u0430\u043c\u00a0 \u0433\u0434\u0435 \u0441\u0438\u043d\u044f\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430). <\/p>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043d\u0430 90 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432 \u043a\u0443\u0431\u0438\u043a \u0420\u0443\u0431\u0438\u043a\u0430 \u0432\u043e\u043a\u0440\u0443\u0433 \u043e\u0441\u0438 <code>X<\/code>, \u0438 \u0441\u0438\u043d\u044f\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430 \u043a\u0443\u0431\u0438\u043a\u0430 \u0434\u043e\u043b\u0436\u043d\u0430\u00a0 \u0441\u0442\u0430\u0442\u044c \u043b\u0438\u0446\u043e\u043c \u043a \u043d\u0430\u043c \u0438\u043b\u0438 \u043e\u0442 \u043d\u0430\u0441 (\u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u0432 \u043a\u0430\u043a\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u0432\u0440\u0430\u0449\u0430\u043b\u0438), \u043d\u043e \u0432 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u0438\u043d\u044f\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0432\u0432\u0435\u0440\u0445, \u0442.\u0435. \u0432\u00a0 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435\u043c, \u043e\u0441\u044c <code>Y<\/code> \u0442\u0435\u043f\u0435\u0440\u044c \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438, \u0438 \u0435\u0441\u043b\u0438 \u0431\u044b \u043c\u044b \u0432\u0440\u0430\u0449\u0430\u043b\u0438 \u043a\u0443\u0431\u0438\u043a \u0420\u0443\u0431\u0438\u043a\u0430\u00a0 \u0432\u043e\u043a\u0440\u0443\u0433 \u043e\u0441\u0438 <code>Y<\/code>, \u0442\u043e\u00a0 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u043b\u0438 \u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0432\u043e\u043a\u0440\u0443\u0433 \u0432\u0441\u0435 \u0442\u043e\u0439 \u0436\u0435 \u0441\u0438\u043d\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u043d\u043e \u043d\u0435\u0442, \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u043a\u0440\u0443\u0433 \u043d\u043e\u0432\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043a\u0443\u0431\u0438\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u043c\u043e\u0442\u0440\u0438\u0442 \u0432\u0432\u0435\u0440\u0445, \u0432\u043c\u0435\u0441\u0442\u043e \u0441\u0438\u043d\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b. \u0422.\u0435. \u0432 \u043d\u0430\u0448\u0438\u0445 \u043c\u0430\u0442\u0440\u0438\u0446\u0430\u0445 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043e\u0441\u0438 \u043d\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u044b \u043a 3D \u043c\u043e\u0434\u0435\u043b\u044f\u043c \u0438 \u043c\u043e\u0434\u0435\u043b\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u0432\u043e\u043a\u0440\u0443\u0433 \u043e\u0441\u0435\u0439, \u0441\u043c\u043e\u0442\u0440\u044f\u0449\u0438\u043c \u0432\u0432\u0435\u0440\u0445\\\u0432\u043f\u0440\u0430\u0432\u043e\\\u043a \u043d\u0430\u043c, \u0432 \u043d\u0430\u0448\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u00a0 (\u0435\u0449\u0435 \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u044b\u0435 \u043e\u0441\u0438), \u0438\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0432\u043e\u043a\u0440\u0443\u0433 \u0442\u043e\u0447\u043a\u0438 <code>0, 0, 0<\/code>. \u0418\u0437 \u044d\u0442\u043e\u0433\u043e \u0442\u0430\u043a\u0436\u0435 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0435\u0449\u0435 \u043f\u0430\u0440\u0430 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439, \u0435\u0441\u043b\u0438 \u043d\u0430\u0448\u0443 \u0444\u0438\u0433\u0443\u0440\u0443 \u043a\u0443\u0431\u0430, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0432\u043f\u0440\u0430\u0432\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430 10 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439, \u0430 \u043f\u043e\u0442\u043e\u043c \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u043e\u043a\u0440\u0443\u0433 \u043b\u044e\u0431\u043e\u0439 \u043e\u0441\u0438, \u0442\u043e \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u0447\u0442\u043e \u043a\u0443\u0431 \u043d\u0435 \u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432\u043e\u043a\u0440\u0443\u0433 \u0441\u0432\u043e\u0435\u0433\u043e \u0446\u0435\u043d\u0442\u0440\u0430, \u0430 \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0440\u0430\u0434\u0438\u0443\u0441\u043e\u043c \u0432\u043e\u043a\u0440\u0443\u0433 \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u0446\u0435\u043d\u0442\u0440\u0430 <code>0, 0, 0<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b\u043b \u0434\u043e \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u043c\u044b \u043f\u043e\u0434\u0432\u0438\u043d\u0443\u043b\u0438 \u043a\u0443\u0431 \u043d\u0430 10 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0432\u043f\u0440\u0430\u0432\u043e. \u042d\u0442\u043e \u0435\u0449\u0435 \u0440\u0430\u0437 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442 \u0442\u043e, \u0447\u0442\u043e \u0432\u0441\u0435 \u0444\u0438\u0433\u0443\u0440\u044b \u043c\u043e\u0433\u0443\u0442 \u0432\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e, \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043a\u0430 \u043e\u043d\u0438 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442, \u0432\u043e\u043a\u0440\u0443\u0433 \u0442\u043e\u0447\u043a\u0438 <code>0, 0, 0<\/code>. \u042d\u0442\u043e \u043d\u0435\u00a0 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u0430\u0433\u043e\u0439, \u0442.\u043a. \u0443 \u043d\u0430\u0441 \u0432\u043f\u043e\u043b\u043d\u0435\u00a0 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0430 \u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043a\u0443\u0431, \u043d\u0435 \u0432\u043e\u043a\u0440\u0443\u0433 \u0441\u0432\u043e\u0435\u0433\u043e \u0446\u0435\u043d\u0442\u0440\u0430, \u0430 \u0432\u043e\u043a\u0440\u0443\u0433\u00a0 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0442\u043e\u0447\u043a\u0438 \u0432 \u0438\u0433\u0440\u0435:<\/p>\n<figure class=\"full-width\"><figcaption>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u0440\u0430\u0449\u0430\u0435\u043c, \u043f\u043e\u0442\u043e\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c<\/figcaption><\/figure>\n<figure class=\"bordered full-width\"><figcaption>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c, \u043f\u043e\u0442\u043e\u043c \u0432\u0440\u0430\u0449\u0430\u0435\u043c<\/figcaption><\/figure>\n<p> \u0418\u0437 \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0432\u044b\u0432\u043e\u0434: \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0444\u0438\u0433\u0443\u0440\u0443 \u0432 \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0432 \u0438\u0433\u0440\u0435, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0435\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044c, \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044c, \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u00a0 \u0432\u0441\u0435 \u043d\u0443\u0436\u043d\u044b\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f. \u0412\u0441\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0444\u0438\u0433\u0443\u0440\u044b, \u0434\u043e \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u043c\u044b \u0435\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u043b\u0438 \u043a\u0443\u0434\u0430 \u043b\u0438\u0431\u043e \u0432 \u0438\u0433\u0440\u0435, \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435\u00a0 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b. \u0410 \u0435\u0441\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u0438 \u043f\u0435\u0440\u0435\u043c\u043d\u043e\u0436\u0438\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439 \u0432\u0441\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0434\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438, \u0438 \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u043c\u043d\u043e\u0436\u0438\u0442\u044c \u0442\u0443\u0434\u0430 \u043c\u0430\u0442\u0440\u0438\u0446\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u0442 \u043c\u043e\u0434\u0435\u043b\u044c \u0432 \u043d\u0443\u0436\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u0432 \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u0441\u0446\u0435\u043d\u0435, \u0442\u043e \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0435\u0439 \u043c\u043e\u0434\u0435\u043b\u0438, \u0442.\u043a. \u043e\u043d\u0430 \u0434\u0435\u043b\u0430\u0435\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430\u0434 \u043a\u0430\u0436\u0434\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u043e\u0439 \u043e\u0434\u043d\u043e\u0439 3D \u043c\u043e\u0434\u0435\u043b\u0438 \u0442\u0430\u043a, \u0447\u0442\u043e \u0442\u0430 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0443\u0436\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u0432 \u0438\u0433\u0440\u0435. \u0418 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0432\u0435\u0440\u0448\u0438\u043d \u043c\u043e\u0434\u0435\u043b\u0438, \u043f\u043e\u0441\u043b\u0435 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u043c\u0430\u0442\u0440\u0438\u0446\u0435\u0439 \u043c\u043e\u0434\u0435\u043b\u0438, \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u0443\u0436\u0435 \u043d\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u043c\u0438, \u0430 \u043c\u0438\u0440\u043e\u0432\u044b\u043c\u0438 (\u0442\u0430\u043a\u0436\u0435 \u0438\u0445 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u2014 \u043c\u0438\u0440\u043e\u0432\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b). \u041c\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c, \u0447\u0442\u043e \u0443 \u043c\u043e\u0434\u0435\u043b\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0438 \u043c\u0438\u0440\u043e\u0432\u044b\u0435.\u00a0 \u041c\u044b \u0435\u0449\u0435 \u043a \u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u0432\u0441\u0435\u00a0\u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435, \u0430 \u0441\u0435\u0439\u0447\u0430\u0441 \u0436\u0435, \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0432\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435 \u043a \u0435\u0449\u0435 \u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u0442\u0440\u0438\u0446\u0435 &#8212; \u043c\u0430\u0442\u0440\u0438\u0446\u0435 \u0432\u0438\u0434\u0430. <\/p>\n<p>\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0432 API \u043a\u0430\u043d\u0432\u0430\u0441 \u0442\u0430\u043a \u0437\u0430\u043b\u043e\u0436\u0435\u043d\u043e, \u0447\u0442\u043e \u0442\u043e\u0447\u043a\u0430 <code>0, 0<\/code> \u044d\u0442\u043e \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u043b\u0435\u0432\u044b\u0439 \u0443\u0433\u043e\u043b \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0435\u0441\u043b\u0438 \u0431\u044b \u043c\u044b \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u043b\u0438 \u043d\u0430\u0448 \u043a\u0443\u0431 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 (\u043e\u0442 <code>-1<\/code>, \u0434\u043e <code>1<\/code> \u043f\u043e \u0432\u0441\u0435\u043c \u043e\u0441\u044f\u043c) \u0442\u043e \u043c\u044b \u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u044c \u043a\u0443\u0431\u0430 \u0432 \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u043b\u0435\u0432\u043e\u043c \u0443\u0433\u043b\u0443, \u0442.\u043a. \u0432\u0441\u044f \u0435\u0433\u043e \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0431\u044b\u043b\u0430 \u0431\u044b \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 \u044d\u043a\u0440\u0430\u043d\u0430, \u043d\u043e \u0447\u0442\u043e\u0431\u044b \u043a\u0443\u0431 \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043f\u043e \u0446\u0435\u043d\u0442\u0440\u0443 \u044d\u043a\u0440\u0430\u043d\u0430 \u0438 \u043c\u044b \u0435\u0433\u043e \u0432\u0438\u0434\u0435\u043b\u0438 \u0446\u0435\u043b\u0438\u043a\u043e\u043c, \u0435\u0433\u043e \u0443\u043c\u043d\u043e\u0436\u0438\u043b\u0438 \u043d\u0430 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f <code>Matrix.getTranslation(400, -300, 0)<\/code> \u0438 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u043b\u0438 \u043a\u0443\u0431 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0442\u043e\u0447\u043d\u043e \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u043e\u043a\u043d\u0430. \u042d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u043a\u043b\u044e\u0447\u0435\u0432\u0430\u044f \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u0430\u043c\u0435\u0440\u044b \u0432 3D \u0438\u0433\u0440\u0430\u0445 \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445, \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e \u0437\u0430\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0435 \u043d\u0430\u0447\u0430\u043b\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0432 API Canvas (\u044d\u0442\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 <code>0, 0<\/code> \u0432 \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u043b\u0435\u0432\u043e\u043c \u0443\u0433\u043b\u0443) \u043d\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u0432\u0438\u0433\u0430\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0435\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b <code>X, Y<\/code> \u0441\u043e\u0432\u043f\u0430\u043b\u0438 \u0432 \u0432\u0438\u0434\u0438\u043c\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u044c\u044e \u043e\u043a\u043d\u0430 (\u043e\u0442 <code>0<\/code> \u0434\u043e <code>800<\/code> \u043f\u043e <code>X<\/code> \u0438 \u043e\u0442 <code>0<\/code> \u0434\u043e <code>600<\/code> \u043f\u043e <code>Y<\/code> \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435), \u0432\u0435\u0434\u044c \u0435\u0441\u043b\u0438 \u043c\u044b \u043d\u0430\u0440\u0438\u0441\u0443\u0435\u043c \u043c\u043e\u0434\u0435\u043b\u044c \u0432 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u0445 <code>1000, 1000<\/code>, \u0442\u043e \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u0438\u043b\u044c\u043d\u043e \u043d\u0438\u0436\u0435 \u0438 \u043f\u0440\u0430\u0432\u0435\u0435 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f <code>canvas<\/code> \u0438 \u0442\u0430\u043a\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u0432 \u043e\u043a\u043d\u0435 \u043c\u044b\u00a0 \u043d\u0435 \u0443\u0432\u0438\u0434\u0438\u043c. \u0415\u0441\u043b\u0438 \u0445\u043e\u0442\u0438\u043c \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u0445 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f, \u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0435\u0435 \u043f\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0430 \u0431\u044b\u043b\u0430 \u0432 \u0435\u0435 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445, \u0438\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u043c\u044b \u0434\u0432\u0438\u0433\u0430\u0435\u043c \u043d\u0435 \u043a\u0430\u043c\u0435\u0440\u0443, \u0430 \u0441\u0430\u043c \u043e\u0431\u044a\u0435\u043a\u0442. \u0412 \u0438\u0433\u0440\u0430\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u0442\u0430\u043a\u043e\u0435 \u0436\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u2014 \u043c\u044b \u0434\u0432\u0438\u0433\u0430\u0435\u043c \u0432\u0441\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 (\u0432\u0435\u0441\u044c \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u043c\u0438\u0440) \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u043f\u043e\u0434 \u043d\u0443\u0436\u043d\u044b\u043c \u0440\u0430\u043a\u0443\u0440\u0441\u043e\u043c \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u043a\u043d\u0430.<\/p>\n<p>\u0414\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0443\u0436\u0435 \u0438\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u043a\u0430\u043c\u0435\u0440\u0443 (\u0445\u043e\u0442\u044c \u0438 \u043d\u0435 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b\u0438 \u044d\u0442\u043e) \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u043a\u0443\u0431\u043e\u043c, \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f, \u043a\u043e\u0433\u0434\u0430\u00a0 \u0434\u0432\u0438\u0433\u0430\u043b\u0438 \u043a\u0443\u0431 \u043d\u0438\u0436\u0435\\\u043f\u0440\u0430\u0432\u0435\u0435, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043b\u0441\u044f \u0432 \u043e\u043a\u043d\u0435. \u041d\u043e \u044d\u0442\u043e \u043d\u0435 \u0441\u0430\u043c\u044b\u0439 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u0442.\u043a. \u0443 \u043a\u0430\u043c\u0435\u0440\u044b \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0447\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u00a0 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443 \u043a\u0430\u043c\u0435\u0440\u044b \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 (\u043c\u0435\u0441\u0442\u043e\u00a0 \u043e\u0442\u043a\u0443\u0434\u0430 \u043c\u044b \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0438\u043b\u0438 \u043c\u0435\u0441\u0442\u043e, \u0433\u0434\u0435 \u0441\u0435\u0439\u0447\u0430\u0441 \u0441\u0442\u043e\u0438\u0442 \u0438\u0433\u0440\u043e\u043a \u043e\u0442 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043b\u0438\u0446\u0430) \u0430 \u0442\u0430\u043a\u0436\u0435 \u0442\u043e\u0447\u043a\u0430 \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0432\u0435\u0434\u044c, \u0441\u0442\u043e\u044f \u043d\u0430 \u043c\u0435\u0441\u0442\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043a\u0440\u0443\u0442\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043e\u0439 \u043a\u0443\u0434\u0430 \u0437\u0430\u0445\u043e\u0442\u0438\u043c. \u0410 \u0442\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c \u0435\u0449\u0435 \u0442\u0440\u0435\u0442\u0438\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440, \u0432\u0435\u043a\u0442\u043e\u0440 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0432\u0435\u0440\u0445, \u043e\u043d \u043d\u0443\u0436\u0435\u043d \u0447\u0442\u043e\u0431\u044b \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0433\u0434\u0435 \u0432 3D-\u043c\u0438\u0440\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u0435\u0440\u0445, \u0430 \u0433\u0434\u0435 \u043d\u0438\u0437, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0435\u0440\u0435\u0432\u0435\u0440\u043d\u0443\u0442\u044c 3D-\u0441\u0446\u0435\u043d\u0443 \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u043c\u043e\u043c\u0435\u043d\u0442 \u0432 \u0438\u0433\u0440\u0435, \u0433\u0434\u0435 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436 \u0445\u043e\u0434\u0438\u0442 \u043f\u043e \u043f\u043e\u0442\u043e\u043b\u043a\u0443, \u0438\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435, \u043c\u044b \u044d\u0442\u043e \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435.<\/p>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043c\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043c\u0435\u0440\u0443 \u0432 \u0441\u0446\u0435\u043d\u0435, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u0448 \u043a\u0443\u0431, \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043c \u0432 \u0443\u0441\u0435\u0447\u0435\u043d\u043d\u0443\u044e \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0443 (\u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0443, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0440\u043e\u0432\u043d\u043e \u0441\u0440\u0435\u0437\u0430\u043b\u0438 \u0432\u0435\u0440\u0445\u0443\u0448\u043a\u0443, \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0430\u044f \u0447\u0435\u0442\u044b\u0440\u0435\u0445\u0443\u0433\u043e\u043b\u044c\u043d\u0430\u044f \u0443\u0441\u0435\u0447\u0435\u043d\u043d\u0430\u044f \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0430), \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0447\u0442\u043e\u0431\u044b \u0432\u0438\u0434\u0435\u0442\u044c \u0433\u0434\u0435 \u0443 \u043d\u0430\u0448\u0435\u0439 \u0444\u0438\u0433\u0443\u0440\u044b \u0432\u0435\u0440\u0445, \u0432\u0435\u0434\u044c \u0435\u0441\u043b\u0438 \u043a\u0443\u0431 \u043f\u0435\u0440\u0435\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0432\u0435\u0440\u0445-\u043d\u043e\u0433\u0430\u043c\u0438 \u0442\u043e \u0434\u043b\u044f \u043d\u0430\u0441, \u043a\u0430\u043a \u0434\u043b\u044f \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044f \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u043e\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f. \u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0443\u0441\u0435\u0447\u0435\u043d\u043d\u043e\u0439 \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u044b \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443 \u043a\u0443\u0431\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b (\u0442\u0435 \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 <code>Y=1<\/code>) \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0431\u043b\u0438\u0436\u0435 \u043a \u043e\u0441\u0438 <code>Y<\/code>. <code>Y<\/code> \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u043f\u0440\u0435\u0436\u043d\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0430 \u0431\u044b\u043b\u0430 \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u0432\u044b\u0441\u043e\u0442\u044b \u043a\u0430\u043a \u0438 \u043a\u0443\u0431, \u0430 <code>X<\/code> \u0438 <code>Z<\/code> \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0440\u0430\u0432\u043d\u044b\u043c\u0438 <code>0.5<\/code> \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u0432\u0435\u0440\u0448\u0438\u043d:<\/p>\n<pre><code class=\"javascript\">const vertices = [ \u00a0\u00a0new Vector(-0.5, 1, 0.5), \/\/ 0 \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u00a0\u00a0new Vector(-0.5, 1, -0.5), \/\/ 1 \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u00a0\u00a0new Vector(0.5, 1, -0.5), \/\/ 2 \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u00a0\u00a0new Vector(0.5, 1, 0.5), \/\/ 3 \u0432\u0435\u0440\u0448\u0438\u043d\u0430   new Vector(-1, -1, 1), \/\/ 4 \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u00a0\u00a0new Vector(-1, -1, -1), \/\/ 5 \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u00a0\u00a0new Vector(1, -1, -1), \/\/ 6 \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u00a0\u00a0new Vector(1, -1, 1), \/\/ 7 \u0432\u0435\u0440\u0448\u0438\u043d\u0430 ];<\/code><\/pre>\n<p> \u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u044b \u0437\u0430\u043c\u0435\u043d\u0438\u043b\u0438 <code>X<\/code> \u0438 <code>Z<\/code> \u043d\u0430 <code>0.5<\/code> \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0432\u0435\u0440\u0448\u0438\u043d \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 <code>Y = 1<\/code>, \u0442.\u0435. \u0434\u043b\u044f \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043a\u0443\u0431\u0430, \u0438 \u0442\u0430\u043a\u0436\u0435 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0432 \u043c\u0435\u0441\u0442\u0435, \u0433\u0434\u0435 \u043c\u044b \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u0443\u0435\u043c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f (\u043f\u0435\u0440\u0435\u043c\u043d\u043e\u0436\u0430\u0435\u043c \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439) \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e \u0441 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 (\u0441\u0430\u043c <code>setInterval<\/code> \u043e\u0441\u0442\u0430\u0432\u0438\u043c, \u043e\u043d \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0437\u0436\u0435), \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u0433\u0434\u0435 \u043c\u044b \u0437\u0430\u0434\u0430\u0435\u043c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043f\u043e <code>Y<\/code>, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>20<\/code> :<\/p>\n<pre><code class=\"javascript\">matrix = Matrix.multiply(   \/\/ Matrix.getRotationY(angle += 1), - \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435   Matrix.getRotationY(20), \/\/ - \u043d\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 20 (\u0431\u0435\u0437 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438)   matrix );<\/code><\/pre>\n<p> \u0422\u0430\u043a\u0436\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u043e\u0441\u0435\u0439 <code>X\/Y\/Z<\/code> \u0441 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 (\u0445\u043e\u0442\u044f \u044d\u0442\u043e \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043e\u043d \u043d\u0430\u043c \u043c\u0435\u0448\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u0442). \u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u0443 \u0432\u0430\u0441 \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0442\u0430\u043a\u0430\u044f 3D-\u043c\u043e\u0434\u0435\u043b\u044c: <\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043b\u0435\u0433\u0447\u0435 \u0432\u0441\u0435\u0433\u043e \u0431\u044b\u043b\u043e \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043a\u0430\u043c\u0435\u0440\u044b, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e: \u0433\u0434\u0435 \u043c\u044b \u0441\u0442\u043e\u0438\u043c \u0438 \u043a\u0443\u0434\u0430 \u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0430, \u0435\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043c\u0430\u0442\u0440\u0438\u0446\u0435\u0439 \u0432\u0438\u0434\u0430 (view marix), \u0438 \u0435\u0435 \u0441\u0443\u0442\u044c \u043f\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0432\u0435\u0441\u044c \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u043c\u0438\u0440 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u043f\u043e\u0434 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u043c \u0440\u0430\u043a\u0443\u0440\u0441\u043e\u043c \u0438 \u0441\u043e\u0437\u0434\u0430\u043b\u0441\u044f \u044d\u0444\u0444\u0435\u043a\u0442 \u0431\u0443\u0434\u0442\u043e \u043c\u044b \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0441\u0446\u0435\u043d\u0443 \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438, \u0445\u043e\u0442\u044f \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u044d\u0442\u043e \u0441\u0446\u0435\u043d\u0430 \u0442\u0430\u043a \u043f\u043e\u0434\u0432\u0438\u043d\u0443\u043b\u0430\u0441\u044c \u043a \u043d\u0430\u043c. \u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u0443 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c, \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f 2 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430\u0434 \u0432\u0435\u043a\u0442\u043e\u0440\u0430\u043c\u0438, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e, \u0432\u044b\u0447\u0438\u0442\u0430\u043d\u0438\u0435 \u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435. \u0412\u044b\u0447\u0438\u0442\u0430\u043d\u0438\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 (\u043c\u0435\u0442\u043e\u0434 <code>add<\/code>) \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0443\u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u043b\u0438 \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u043a\u043b\u0430\u0441\u0441 \u0432\u0435\u043a\u0442\u043e\u0440 \u0435\u0449\u0435 \u0438 \u0432\u044b\u0447\u0438\u0442\u0430\u043d\u0438\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432: <\/p>\n<pre><code class=\"javascript\">static substruct(v1, v2) { \u00a0\u00a0return new Vector( \u00a0\u00a0\u00a0\u00a0v1.x - v2.x, \u00a0\u00a0\u00a0\u00a0v1.y - v2.y, \u00a0\u00a0\u00a0\u00a0v1.z - v2.z, \u00a0\u00a0) }<\/code><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0432\u044b\u0447\u0438\u0442\u0430\u043d\u0438\u044f \u0434\u0432\u0443\u0445 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 <code>v1<\/code> \u0438 <code>v2<\/code> \u0431\u0443\u0434\u0435\u0442 \u0442\u0440\u0435\u0442\u0438\u0439 \u0432\u0435\u043a\u0442\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u0441\u043b\u043e\u0436\u0438\u0442\u044c \u0441\u043e \u0432\u0442\u043e\u0440\u044b\u043c \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u043c <code>v2<\/code> \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u043e <code>v1<\/code>. \u0421\u0435\u0439\u0447\u0430\u0441 \u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u0432\u043d\u0438\u043a\u0430\u0442\u044c \u0432 \u044d\u0442\u0443 \u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u043a\u0443, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u043a\u0430\u043a \u044d\u0442\u043e \u0432\u044b\u0447\u0438\u0442\u0430\u043d\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f. <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432, \u044d\u0442\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0447\u0443\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0434\u0432\u0443\u0445 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432, \u0431\u0443\u0434\u0435\u0442 \u0442\u0440\u0435\u0442\u0438\u0439 \u0432\u0435\u043a\u0442\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0435\u0440\u043f\u0435\u043d\u0434\u0438\u043a\u0443\u043b\u044f\u0440\u0435\u043d \u043f\u0435\u0440\u0432\u044b\u043c \u0434\u0432\u0443\u043c, \u0438 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043c\u044b \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u044d\u0442\u0443 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u043d\u0430\u0434 \u0432\u0435\u043a\u0442\u043e\u0440\u0430\u043c\u0438 \u043f\u043e\u0437\u0436\u0435, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0447\u043d\u0435\u043c \u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u043d\u043e\u0440\u043c\u0430\u043b\u044f\u043c\u0438, \u0430 \u0441\u0435\u0439\u0447\u0430\u0441 \u0436\u0435 \u043e\u043d \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u043f\u043e \u0444\u043e\u0440\u043c\u0443\u043b\u0435 \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0432\u0438\u0434\u0430. \u041c\u0435\u0442\u043e\u0434 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043c \u0432 \u043a\u043b\u0430\u0441\u0441 <code>Vector<\/code>:<\/p>\n<pre><code class=\"javascript\">static crossProduct(v1, v2) { \u00a0\u00a0return new Vector( \u00a0\u00a0\u00a0\u00a0v1.y * v2.z - v1.z * v2.y, \u00a0\u00a0\u00a0\u00a0v1.z * v2.x - v1.x * v2.z, \u00a0\u00a0\u00a0\u00a0v1.x * v2.y - v1.y * v2.x, \u00a0\u00a0) }<\/code><\/pre>\n<p>\u041c\u0430\u0442\u0440\u0438\u0446\u0443, \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0434\u043b\u044f \u0438\u043c\u0438\u0442\u0430\u0446\u0438\u0438 \u043a\u0430\u043c\u0435\u0440\u044b \u0442\u0430\u043a\u0436\u0435 \u043a\u0430\u043a \u0432\u0441\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043a\u0430\u043a \u043c\u0435\u0442\u043e\u0434 \u0432 \u043a\u043b\u0430\u0441\u0441 <code>Matrix<\/code>: <\/p>\n<pre><code class=\"javascript\">static getLookAt(eye, target, up) { \u00a0\u00a0const vz = Vector.substruct(eye, target).normalize() \u00a0\u00a0const vx = Vector.crossProduct(up, z).normalize() \u00a0\u00a0const vy = Vector.crossProduct(z, x)   return [ \u00a0\u00a0\u00a0\u00a0[vx.x, vy.x, vz.x, -eye.x], \u00a0\u00a0\u00a0\u00a0[vx.y, vy.y, vz.y, -eye.y], \u00a0\u00a0\u00a0\u00a0[vx.z, vy.z, vz.z, -eye.z], \u00a0\u00a0\u00a0\u00a0[0, 0, 0, 1], \u00a0\u00a0] }<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c \u043c\u0435\u0442\u043e\u0434 <code>getLookAt<\/code> \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 3 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430, <code>eye<\/code> \u2014 \u044d\u0442\u043e \u043d\u0430\u0448\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u043c\u043e\u0442\u0440\u0438\u043c (\u0438\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0433\u043b\u0430\u0437\u0430 \u0438\u043b\u0438 \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430 \u0441 \u0432\u0438\u0434\u043e\u043c \u043e\u0442 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043b\u0438\u0446\u0430), <code>target<\/code> &#8212; \u044d\u0442\u043e \u0442\u043e\u0447\u043a\u0430 \u0432 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u0441\u043c\u043e\u0442\u0440\u0438\u043c, <code>up<\/code> &#8212; \u0432\u0435\u043a\u0442\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0433\u0434\u0435 \u0441\u0435\u0439\u0447\u0430\u0441 \u0432\u0435\u0440\u0445, \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0441\u043b\u0438 \u043c\u044b \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u0445\u043e\u0442\u0438\u043c \u043f\u0435\u0440\u0435\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043b\u0438<\/p>\n<\/div>\n<\/div>\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-326931","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/326931","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=326931"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/326931\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=326931"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=326931"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=326931"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}