{"id":173131,"date":"2013-03-18T00:49:03","date_gmt":"2013-03-17T20:49:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=173131"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=173131","title":{"rendered":"<span class=\"post_title\">\u041f\u0438\u0448\u0435\u043c \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440 \u041a\u0443\u0431\u0438\u043a\u0430 \u0420\u0443\u0431\u0438\u043a\u0430<\/span>"},"content":{"rendered":"<div class=\"content html_format\">   \tOpenGL \u2014 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u0430\u044f \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0445 \u0434\u0432\u0443\u0445\u043c\u0435\u0440\u043d\u0443\u044e \u0438 \u0442\u0440\u0435\u0445\u043c\u0435\u0440\u043d\u0443\u044e \u0433\u0440\u0430\u0444\u0438\u043a\u0443.<br \/>  \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043e\u043f\u0438\u0448\u0443, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440 \u041a\u0443\u0431\u0438\u043a\u0430 \u0420\u0443\u0431\u0438\u043a\u0430 \u043d\u0430 OpenGL.<\/p>\n<p>  \u041a\u0443\u0431\u0438\u043a \u0431\u0443\u0434\u0435\u0442 \u0432 3D \u0438 \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043c\u044b\u0448\u043a\u043e\u0439, \u0430 \u043f\u0435\u0440\u0435\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0433\u0440\u0430\u043d\u0438 \u043c\u043e\u0436\u043d\u043e, \u043a\u043b\u0438\u043a\u0430\u044f \u043c\u044b\u0448\u043a\u043e\u0439 \u043f\u043e \u0441\u0442\u0440\u0435\u043b\u043a\u0430\u043c. \u041f\u0440\u0438 \u0442\u043e\u043c \u0441\u0442\u0440\u0435\u043b\u043a\u0438 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0443 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u0439 \u043a \u0437\u0440\u0438\u0442\u0435\u043b\u044e \u0433\u0440\u0430\u043d\u0438.<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage2\/28e\/708\/9e1\/28e7089e1014b0a3330792cecb23c12e.png\"\/><br \/>  <a name=\"habracut\"><\/a><\/p>\n<p>  \u042f \u0431\u0443\u0434\u0443 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430 \u041a\u0443\u0431\u0438\u043a \u0420\u0443\u0431\u0438\u043a\u0430 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 C#, \u0434\u043b\u044f OpenGL \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 <a href=\"http:\/\/www.opentk.com\/\">OpenTK<\/a>. \u041d\u0430\u0434\u043e \u0435\u0451 \u0441\u043a\u0430\u0447\u0430\u0442\u044c, \u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432 Visual Studio \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u044d\u0442\u0443 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443.<\/p>\n<h4>\u042d\u043a\u0441\u043a\u0443\u0440\u0441 \u0432 3D<\/h4>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u0440\u043e 3D. \u041e\u0431\u044a\u0435\u043a\u0442\u044b \u0432 3D \u0443 \u043d\u0430\u0441 \u0438\u043c\u0435\u044e\u0442 3 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b x, y, z, \u0430 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0432\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b. \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0430 \u043d\u0430\u0434\u043e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044e. <\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage2\/f99\/520\/a88\/f99520a88e1ca6540b162d8fbd108cc0.png\"\/><\/p>\n<p>  \u041d\u043e \u0437\u0430\u0434\u043d\u0438\u0435 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b \u0438\u043b\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0442\u043e\u044f\u0442 \u0441\u0431\u043e\u043a\u0443 \u043c\u044b \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u0422\u0430\u043a\u0436\u0435 \u043c\u044b \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0442\u043e\u044f\u0442 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0434\u0430\u043b\u0435\u043a\u043e. (\u0412\u0441\u043f\u043e\u043c\u043d\u0438\u0442\u0435, \u043a\u0430\u043a \u0432 \u0433\u043e\u043d\u043a\u0430\u0445, \u0434\u0430\u043b\u0435\u043a\u0438\u0435 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043a\u043e\u0433\u0434\u0430 \u043a \u043d\u0438\u043c \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0448\u044c \u043f\u043e\u0434\u044a\u0435\u0437\u0436\u0430\u0442\u044c).<\/p>\n<p>  \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u0434\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c \u0442\u043e, \u0447\u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u0438\u0434\u0435\u0442\u044c:<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage2\/310\/574\/dce\/310574dce24985e51c848d62b5e61122.png\"\/><\/p>\n<p>  \u0422\u0430\u043a\u0430\u044f \u0443\u0441\u0435\u0447\u0435\u043d\u043d\u0430\u044f \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0430 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0424\u0440\u0443\u0441\u0442\u0440\u0443\u043c (FrustRoom), \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435, \u043c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u043b\u0438 \u043e\u043d \u0432 \u0424\u0440\u0443\u0441\u0442\u0440\u0443\u043c\u0435 (\u0442\u0435 \u0447\u0430\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043f\u043e\u043c\u0435\u0449\u0430\u044e\u0442\u0441\u044f \u043c\u044b \u043e\u0442\u0441\u0435\u043a\u0430\u0435\u043c), \u043f\u043e\u0442\u043e\u043c \u043c\u044b \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u0443\u0435\u043c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d. \u0412\u0441\u0451 \u044d\u0442\u043e \u0437\u0430 \u043d\u0430\u0441 \u0434\u0435\u043b\u0430\u0435\u0442 OpenGL.<\/p>\n<h4>\u041f\u0440\u043e\u0431\u0430 \u043f\u0435\u0440\u0430<\/h4>\n<p>  <a href=\"http:\/\/www.opentk.com\/files\/download-opentk.html\">\u0421\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 OpenTK<\/a>. \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0444\u0430\u0439\u043b, \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443.<\/p>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043f\u0440\u043e\u0435\u043a\u0442, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0444\u0430\u0439\u043b OpenTK.dll. \u0410 \u0442\u0430\u043a \u043a\u0430\u043a, \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0440\u043e\u043b GLControl, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u041a\u0443\u0431\u0438\u043a \u0420\u0443\u0431\u0438\u043a\u0430, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u0449\u0451 \u0438 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 OpenTK.GLControl.dll<br \/>  OpenTK \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0442\u0430\u043a\u0436\u0435 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 System.Drawing.dll, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0449\u0451 \u0440\u0430\u0437 \u0432\u0445\u043e\u0434\u0438\u043c \u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0441\u044b\u043b\u043a\u0438, \u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0432\u043a\u043b\u0430\u0434\u043e\u0447\u043a\u0443 .Net \u0438 \u0438\u0449\u0435\u043c System.Drawing, \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 OpenTK<\/b><\/p>\n<div class=\"spoiler_text\"><img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage2\/6c1\/126\/776\/6c11267765f2c037ad3bc6a3879e3c41.png\"\/><br \/>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage2\/5a6\/2af\/0d1\/5a62af0d167578d195704fe9793b95e8.png\"\/>  <\/div>\n<\/div>\n<p>  \u042f \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c OpenGL, \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0431\u044b\u0447\u043d\u043e\u0439 GUI-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u043a\u043b\u0438\u043a\u0430\u0435\u043c \u043f\u043e \u043f\u0440\u0430\u0432\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u043e\u0439 \u043c\u044b\u0448\u0438 \u043f\u043e \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u201c\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b\u201d, \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u201c\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b .NET Framework\u201d \u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0444\u0430\u0439\u043b OpenTK.GLControl.dll. \u0412 \u0441\u043f\u0438\u0441\u043a\u0435 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 GLControl, \u0441\u0442\u0430\u0432\u0438\u043c \u043d\u0430\u043f\u0440\u043e\u0442\u0438\u0432 \u043d\u0435\u0433\u043e \u0433\u0430\u043b\u043e\u0447\u043a\u0443. \u041e\u041a. \u041d\u0430 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 GLControl. \u041f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c \u0435\u0433\u043e \u043d\u0430 \u0444\u043e\u0440\u043c\u0443 \u0438 \u0440\u0430\u0441\u0442\u044f\u0433\u0438\u0432\u0430\u0435\u043c \u043d\u0430 \u0432\u0441\u044e \u0435\u0451 \u0444\u043e\u0440\u043c\u0443.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0430 GLControl (\u043a\u0430\u043d\u0432\u0430\u0441, \u0445\u043e\u043b\u0441\u0442)<\/b><\/p>\n<div class=\"spoiler_text\"><img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage2\/91e\/6bb\/28c\/91e6bb28c3af0dd5aa61f4b43aea5955.png\"\/><br \/>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage2\/70f\/618\/0dc\/70f6180dcb1e3a267bc82fc6bc9f30fb.png\"\/><br \/>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage2\/456\/770\/d8a\/456770d8a6e3b09b90f1ac181c1c4075.png\"\/><br \/>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage2\/e21\/79f\/ae6\/e2179fae61a8d75ec3219b279e005b1d.png\"\/>  <\/div>\n<\/div>\n<p>  \u042d\u043b\u0435\u043c\u0435\u043d\u0442 GLControl \u0438\u043c\u0435\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 Load, \u043e\u043d\u043e \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442, \u043a\u043e\u0433\u0434\u0430 \u044d\u0442\u043e\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043b\u0441\u044f.<br \/>  (\u0429\u0435\u043b\u043a\u043d\u0435\u043c \u043f\u043e \u043d\u0435\u043c\u0443, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0442\u0435\u043b\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430, \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 glControl1_Load)<br \/>  \u0421\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u0438 OpenTK \u043d\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e\u0442 \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 GLControl, \u043f\u043e\u043a\u0430 \u043e\u043d \u043d\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043b\u0441\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0432\u043e\u0434\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043b\u0441\u044f \u043b\u0438 GLControl:<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043e\u0434<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;  using OpenTK; using OpenTK.Graphics.OpenGL;  namespace habr {     public partial class Form1 : Form     {         bool loaded = false;\/\/&lt;--------------------------------------         public Form1()         {             InitializeComponent();         }          private void glControl1_Load(object sender, EventArgs e)         {             loaded = true;\/\/&lt;--------------------------------------         }          private void glControl1_Paint(object sender, PaintEventArgs e)         {             if (!loaded)\/\/&lt;--------------------------------------             return;\/\/&lt;--------------------------------------         }     } } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  glControl1_Load \u2014 \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 Load<br \/>  glControl1_Paint \u2014 \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 Paint, \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0441\u043a\u0440\u044b\u0432\u0430\u0435\u043c, \u0430 \u043f\u043e\u0442\u043e\u043c \u0441\u043d\u043e\u0432\u0430 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043e\u043a\u043d\u043e \u0438\u043b\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u043e\u043a\u043d\u0430.<\/p>\n<p>  \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043d\u0430\u0440\u0438\u0441\u0443\u0435\u043c \u043a\u0443\u0431\u0438\u043a.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043e\u0434, \u0440\u0438\u0441\u0443\u044e\u0449\u0438\u0439 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 \u043a\u0443\u0431\u0438\u043a<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;  using OpenTK; using OpenTK.Graphics.OpenGL;  namespace habr {     public partial class Form1 : Form     {         bool loaded = false;         public Form1()         {             InitializeComponent();         }          private void glControl1_Load(object sender, EventArgs e)         {             loaded = true;             GL.ClearColor(Color.SkyBlue);             GL.Enable(EnableCap.DepthTest);                          Matrix4 p = Matrix4.CreatePerspectiveFieldOfView((float)(80 * Math.PI \/ 180), 1, 20, 500);             GL.MatrixMode(MatrixMode.Projection);             GL.LoadMatrix(ref p);              Matrix4 modelview = Matrix4.LookAt(70, 70, 70, 0, 0, 0, 0, 1, 0);             GL.MatrixMode(MatrixMode.Modelview);             GL.LoadMatrix(ref modelview);         }          private void glControl1_Paint(object sender, PaintEventArgs e)         {             if (!loaded)                 return;              GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);                   float width = 20;                         \/*\u0437\u0430\u0434\u043d\u044f\u044f*\/             GL.Color3(Color.Red);             GL.Begin(BeginMode.Polygon);             GL.Vertex3(0, 0, 0);             GL.Vertex3(width, 0, 0);             GL.Vertex3(width, width, 0);             GL.Vertex3(0, width, 0);             GL.End();              \/*\u043b\u0435\u0432\u0430\u044f*\/             GL.Begin(BeginMode.Polygon);             GL.Vertex3(0, 0, 0);             GL.Vertex3(0, 0, width);             GL.Vertex3(0, width, width);             GL.Vertex3(0, width, 0);             GL.End();              \/*\u043d\u0438\u0436\u043d\u044f\u044f*\/             GL.Begin(BeginMode.Polygon);             GL.Vertex3(0, 0, 0);             GL.Vertex3(0, 0, width);             GL.Vertex3(width, 0, width);             GL.Vertex3(width, 0, 0);             GL.End();              \/*\u0432\u0435\u0440\u0445\u043d\u044f\u044f*\/             GL.Begin(BeginMode.Polygon);             GL.Vertex3(0, width, 0);             GL.Vertex3(0, width, width);             GL.Vertex3(width, width, width);             GL.Vertex3(width, width, 0);             GL.End();              \/*\u043f\u0435\u0440\u0435\u0434\u043d\u044f\u044f*\/                         GL.Begin(BeginMode.Polygon);             GL.Vertex3(0, 0, width);             GL.Vertex3(width, 0, width);             GL.Vertex3(width, width, width);             GL.Vertex3(0, width, width);             GL.End();              \/*\u043f\u0440\u0430\u0432\u0430\u044f*\/             GL.Begin(BeginMode.Polygon);             GL.Vertex3(width, 0, 0);             GL.Vertex3(width, 0, width);             GL.Vertex3(width, width, width);             GL.Vertex3(width, width, 0);             GL.End();  \t\t\t\/*\u0440\u0435\u0431\u0440\u0430*\/             GL.Color3(Color.Black);             GL.Begin(BeginMode.LineLoop);             GL.Vertex3(0, 0, 0);             GL.Vertex3(0, width, 0);             GL.Vertex3(width, width, 0);             GL.Vertex3(width, 0, 0);             GL.End();              GL.Begin(BeginMode.LineLoop);             GL.Vertex3(width, 0, 0);             GL.Vertex3(width, 0, width);             GL.Vertex3(width, width, width);             GL.Vertex3(width, width, 0);             GL.End();              GL.Begin(BeginMode.LineLoop);             GL.Vertex3(0, 0, width);             GL.Vertex3(width, 0, width);             GL.Vertex3(width, width, width);             GL.Vertex3(0, width, width);             GL.End();              GL.Begin(BeginMode.LineLoop);             GL.Vertex3(0, 0, 0);             GL.Vertex3(0, 0, width);             GL.Vertex3(0, width, width);             GL.Vertex3(0, width, 0);             GL.End();              glControl1.SwapBuffers();         }             } } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  using OpenTK; \u2014 \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u0430 Matrix4 (\u043c\u0430\u0442\u0440\u0438\u0446\u0430 4&#215;4)<br \/>  using OpenTK.Graphics.OpenGL; \u2014 \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043e\u0431\u044a\u0435\u043a\u0442\u0443 GL.<\/p>\n<p>  GL \u2014 \u043e\u0431\u044a\u0435\u043a\u0442, \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b OpenGL.<br \/>  GL.ClearColor(Color.SkyBlue); \u2014 \u0437\u0430\u043b\u0438\u0432\u0430\u0435\u0442 \u0433\u043e\u043b\u0443\u0431\u044b\u043c \u0446\u0432\u0435\u0442\u043e\u043c<br \/>  GL.Enable(EnableCap.DepthTest); \u2014 \u044d\u0442\u0430 \u0441\u0442\u0440\u043e\u0447\u043a\u0430 \u043d\u0443\u0436\u043d\u0430, \u0447\u0442\u043e\u0431\u044b \u0434\u0430\u043b\u044c\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0432\u0430\u043b\u0438\u0441\u044c \u0431\u043b\u0438\u0436\u043d\u0438\u043c\u0438.<\/p>\n<pre><code class=\"cs\">Matrix4 p = Matrix4.CreatePerspectiveFieldOfView((float)(80 * Math.PI \/ 180), 1, 20, 500); GL.MatrixMode(MatrixMode.Projection); GL.LoadMatrix(ref p); <\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0437\u0430\u0434\u0430\u0451\u043c \u043c\u0430\u0442\u0440\u0438\u0446\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0424\u0440\u0443\u0441\u0442\u0440\u0443\u043c:<br \/>  1) \u0443\u0433\u043e\u043b \u043e\u0431\u0437\u043e\u0440\u0430 80 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432<br \/>  2) \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u043a \u0432\u044b\u0441\u043e\u0442\u0435 \u2014 1<br \/>  3) \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0434\u043e \u043f\u0435\u0440\u0432\u043e\u0439 \u0433\u0440\u0430\u043d\u0438 \u2014 20<br \/>  4) \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0434\u043e \u0434\u0430\u043b\u044c\u043d\u0435\u0439 \u0433\u0440\u0430\u043d\u0438 \u2014 500<\/p>\n<p>  \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u0440\u0435\u0436\u0438\u043c \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438, \u0438 \u0437\u0430\u0434\u0430\u0435\u043c \u044d\u0442\u0443 \u043c\u0430\u0442\u0440\u0438\u0446\u0443. \u041e \u0440\u0435\u0436\u0438\u043c\u0430\u0445 \u0431\u0443\u0434\u0435\u0442 \u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0447\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435.<\/p>\n<pre><code class=\"cs\">GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); <\/code><\/pre>\n<p>  \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c ColorBufferBit \u0438 DepthBuffer<\/p>\n<p>  ColorBuffer. \u0411\u0443\u0444\u0435\u0440 \u0426\u0432\u0435\u0442\u0430. \u0421 \u043a\u0430\u0436\u0434\u044b\u043c \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u043c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0446\u0432\u0435\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0431\u0443\u0444\u0435\u0440\u0435 \u0446\u0432\u0435\u0442\u0430. \u0412\u044b\u0437\u043e\u0432 GL.Clear(ClearBufferMask.ColorBufferBit) \u0437\u0430\u043b\u044c\u0435\u0442 \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u043a\u043d\u043e \u0446\u0432\u0435\u0442\u043e\u043c SkyBlue (\u0441\u043c\u043e\u0442\u0440\u0438 \u0432\u044b\u0448\u0435).<\/p>\n<p>  DepthBuffer. \u041e\u043d \u0436\u0435 Z-Buffer. \u0411\u0443\u0444\u0435\u0440 \u0433\u043b\u0443\u0431\u0438\u043d\u044b. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0434\u0432\u0435 \u0442\u043e\u0447\u043a\u0438 \u0432 3D \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u0443 \u0442\u043e\u0447\u043a\u0443 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435. \u041d\u0443\u0436\u043d\u043e \u0447\u0442\u043e\u0431\u044b, \u0431\u043b\u0438\u0436\u043d\u044f\u044f \u0442\u043e\u0447\u043a\u0430 \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0432\u0430\u043b\u0430 \u0434\u0430\u043b\u044c\u043d\u044e\u044e. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u201c\u0433\u043b\u0443\u0431\u0438\u043d\u0443\u201d \u0442\u043e\u0447\u043a\u0438 (\u0432\u0435\u043b\u0438\u0447\u0438\u043d\u044b \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043f\u043e\u0440\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044e \u043e\u0442 \u043a\u0430\u043c\u0435\u0440\u044b \u0434\u043e \u0442\u043e\u0447\u043a\u0438) \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0435\u0451 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0431\u0443\u0444\u0444\u0435\u0440 (\u043f\u0438\u0441\u043a\u0435\u043b\u044c \u0442\u0430\u043a\u043e\u0439-\u0442\u043e, \u0433\u043b\u0443\u0431\u0438\u043d\u0430 \u0442\u0430\u043a\u0430\u044f-\u0442\u043e), <br \/>  \u0435\u0441\u043b\u0438 \u0436\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u0442\u043e\u0442 \u0436\u0435 \u043f\u0438\u043a\u0441\u0435\u043b\u044c, \u0442\u043e \u043d\u0430\u0434\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u201c\u0433\u043b\u0443\u0431\u0438\u043d\u0443\u201d \u043d\u043e\u0432\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0441 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0439 Depth-\u0431\u0443\u0444\u0444\u0435\u0440\u0435. \u0415\u0441\u043b\u0438 \u043d\u043e\u0432\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u201c\u043c\u0435\u043d\u0435\u0435 \u0433\u043b\u0443\u0431\u043e\u043a\u043e\u201d (\u0431\u043e\u043b\u0435\u0435 \u0431\u043b\u0438\u0436\u0435 \u043a \u043a\u0430\u043c\u0435\u0440\u0435), \u0442\u043e \u0435\u0451 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e, \u0438\u043d\u0430\u0447\u0435 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u0441\u0451 \u043a\u0430\u043a \u0435\u0441\u0442\u044c. <br \/>  \u0412 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u043a\u0443\u0431\u0438\u043a\u0430 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0447\u0438\u0441\u0442\u0438\u0442\u044c Depth-Buffer.<\/p>\n<pre><code class=\"cs\">Matrix4 modelview = Matrix4.LookAt(70, 70, 70, 0, 0, 0, 0, 1, 0); GL.MatrixMode(MatrixMode.Modelview); GL.LoadMatrix(ref modelview); <\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0437\u0430\u0434\u0430\u0435\u043c \u043d\u0430\u0448\u0443 \u043a\u0430\u043c\u0435\u0440\u0443 \u0432 \u0442\u043e\u0447\u043a\u0435 (30, 70, 80), \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0437\u0433\u043b\u044f\u0434\u0430 \u0432 \u0446\u0435\u043d\u0442\u0440 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0442\u0430 (0, 0, 0). \u041e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0442\u0430\u043a\u0430\u044f, \u0447\u0442\u043e \u043e\u0441\u044c OY \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0430 \u0432\u0432\u0435\u0440\u0445.<\/p>\n<p>  \u0415\u0441\u043b\u0438 \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u0435\u043c  <\/p>\n<pre><code class=\"cs\">Matrix4 modelview = Matrix4.LookAt(30, 70, 80, 0, 0, 0, 1, 1, 0); <\/code><\/pre>\n<p>  \u0422\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u043a\u0443\u0431\u0438\u043a \u043f\u043e\u0434 \u0443\u0433\u043b\u043e\u043c, \u043a\u0430\u043a \u0435\u0441\u043b\u0438 \u0431\u044b \u043d\u0430\u043a\u043b\u043e\u043d\u0438\u043b\u0438 \u0433\u043e\u043b\u043e\u0432\u0443 \u043d\u0430 45 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432 \u0432\u043b\u0435\u0432\u043e.<\/p>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0440\u0438\u0441\u0443\u044e\u0442\u0441\u044f \u0441\u0430\u043c \u043a\u0443\u0431\u0438\u043a: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0433\u0440\u0430\u043d\u0438 \u043a\u0440\u0430\u0441\u043d\u044b\u043c \u0446\u0432\u0435\u0442\u043e\u043c, \u043f\u043e\u0442\u043e\u043c \u0447\u0435\u0440\u043d\u044b\u043c \u2014 \u0440\u0435\u0431\u0440\u0430<\/p>\n<p>  \u041f\u043e\u0442\u043e\u043c \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430  <\/p>\n<pre><code class=\"cs\">glControl1.SwapBuffers(); <\/code><\/pre>\n<p>  \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e OpenGL \u0432 OpenTK double-buffer: \u043a\u0430\u0436\u0434\u044b\u0439 \u0431\u0443\u0444\u0444\u0435\u0440 (ColorBuffer, DepthBuffer \u0438 \u0434\u0440\u0443\u0433\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u043d\u0435 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u043b) \u0434\u0443\u0431\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f. \u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u0440\u0438\u0441\u0443\u0435\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043e\u0434\u043d\u0438 \u0431\u0443\u0444\u0435\u0440\u044b. \u0410 \u0432 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043e \u0438\u0437 \u0434\u0440\u0443\u0433\u0438\u0445 \u0431\u0443\u0444\u0435\u0440\u043e\u0432. <br \/>  \u041a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 glControl1.SwapBuffers(); \u043c\u044b \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0431\u0443\u0444\u0435\u0440\u044b, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u044b \u0435\u0433\u043e \u0440\u0438\u0441\u043e\u0432\u0430\u043b\u0438.<br \/>  \u041a\u0441\u0442\u0430\u0442\u0438, \u0435\u0441\u043b\u0438 \u043e\u0447\u0438\u0441\u0442\u044c \u0431\u0443\u0444\u0435\u0440 \u0446\u0432\u0435\u0442\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043f\u0435\u0440\u0432\u044b\u0439 \u0440\u0430\u0437 <\/p>\n<pre><code class=\"cs\">bool b = true; private void glControl1_Paint(object sender, PaintEventArgs e) { \tif (!loaded) \t\treturn;  \tGL.Clear(ClearBufferMask.DepthBufferBit); \tif (b) \t{ \t\tGL.Clear(ClearBufferMask.ColorBufferBit); \t} \tb = false; \u2026 <\/code><\/pre>\n<p>  \u0422\u043e \u0435\u0441\u0442\u044c \u043e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0431\u0443\u0444\u0444\u0435\u0440 \u0446\u0432\u0435\u0442\u0430 (\u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u0437\u0430\u043b\u0438\u0442\u044c \u0435\u0433\u043e \u0433\u043e\u043b\u0443\u0431\u044b\u043c \u0446\u0432\u0435\u0442\u043e\u043c), \u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u043d\u0435 \u043e\u0447\u0438\u0449\u0430\u0442\u044c. \u0410 \u043f\u043e\u0442\u043e\u043c \u0441\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c\/\u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u043e\u043a\u043d\u043e. \u0422\u043e \u0446\u0432\u0435\u0442 \u0444\u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u0441 \u0433\u043e\u043b\u0443\u0431\u043e\u0433\u043e \u043d\u0430 \u0447\u0435\u0440\u043d\u044b\u0439. (\u043f\u0440\u0430\u0432\u0434\u0430, \u0435\u0441\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u043e\u043a\u043d\u0430, \u0442\u043e \u0441\u0442\u0430\u043d\u0435\u0442 \u0432\u0441\u0435\u0433\u0434\u0430 \u0447\u0435\u0440\u043d\u044b\u0439 \u0446\u0432\u0435\u0442 (\u0432\u0438\u0434\u0438\u043c\u043e, \u043e\u0431\u0430 \u0431\u0443\u0444\u0444\u0435\u0440\u0430 \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u0440\u0435\u0441\u0430\u0439\u0437\u0435).<\/p>\n<h4>\u0422\u0435\u043f\u0435\u0440\u044c \u043e \u0440\u0435\u0436\u0438\u043c\u0430\u0445<\/h4>\n<p>  \u041e\u0431\u044a\u0435\u043a\u0442\u044b \u0437\u0430\u0434\u0430\u044e\u0442\u0441\u044f \u0432 3-\u0445 \u043c\u0435\u0440\u043d\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u0445. \u042d\u0442\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u044b\u043c\u0438. \u041a\u0430\u0436\u0434\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d \u0432 \u0441\u0432\u043e\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u0445. \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043c\u0438\u0440 \u0438\u0437 \u0440\u0430\u0437\u043d\u044b\u0445 3d \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0442\u043e\u044f\u0442 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445,<br \/>  \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0443\u043c\u043d\u043e\u0436\u0438\u0442\u044c \u043d\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e <i>\u043c\u043e\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u043c\u0430\u0442\u0440\u0438\u0446\u0443<\/i> (model Matrix). \u0422\u043e\u0433\u0434\u0430 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043d\u043e\u0432\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 \u043d\u043e\u0432\u043e\u043c \u043e\u0431\u0449\u0435\u043c \u043c\u0438\u0440\u043e\u0432\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435.<\/p>\n<p>  \u0412 \u0442\u043e \u0436\u0435 \u0432\u0440\u0435\u043c\u044f \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u043c\u0438\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0441 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0442\u043e\u0440\u043e\u043d, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u0430\u043c\u0435\u0440\u0443, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0430\u0442\u044c\u0441\u044f \u043a \u043e\u0431\u044a\u0435\u043a\u0442\u0443 \u0438 \u0443\u0434\u0430\u043b\u044f\u0442\u044c\u0441\u044f \u043e\u0442 \u043d\u0435\u0433\u043e. \u0423\u043c\u043d\u043e\u0436\u0430\u044f \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 (\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0432 \u043c\u0438\u0440\u043e\u0432\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435) \u043d\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0432\u0438\u0434\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f (view Matrix), \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432\u0438\u0434\u043e\u0432\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u0430\u043d\u0442\u044b \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430.<\/p>\n<p>  \u0412 OpenGL \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u043c\u043e\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f (model Matrix) \u0441\u043e\u0432\u043c\u0435\u0449\u0435\u043d\u0430 \u0441 \u043c\u0430\u0442\u0440\u0438\u0446\u0435\u0439 \u0432\u0438\u0434\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f (view Matrix) \u0432 \u043e\u0434\u043d\u0443 (modelView Matrix). (\u0412\u0435\u0434\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0442\u0434\u0430\u043b\u0438\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u0432\u0443\u043c\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438: \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0435\u0433\u043e \u043c\u0438\u0440\u043e\u0432\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b (\u043e\u0442\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0430\u043c \u043e\u0431\u044a\u0435\u043a\u0442), \u043b\u0438\u0431\u043e \u043e\u0442\u0434\u0430\u043b\u0438\u0442\u044c \u043e\u0442 \u043d\u0435\u0433\u043e \u043a\u0430\u043c\u0435\u0440\u0443 (\u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0432\u0438\u0434\u043e\u0432\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b)).<\/p>\n<p>  \u041f\u043e\u0442\u043e\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0443\u043c\u043d\u043e\u0436\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 (projection Matrix), \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043b\u0438\u0431\u043e \u0437\u0430\u0434\u0430\u0451\u0442 \u0424\u0440\u0443\u0441\u0442\u0440\u0443\u043c (\u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435):<br \/>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage2\/5a4\/d99\/8b6\/5a4d998b6362325dc7632891b45e4a5e.png\"\/><\/p>\n<p>  \u043b\u0438\u0431\u043e \u0437\u0430\u0434\u0430\u0451\u0442 \u043e\u0440\u0442\u043e\u0433\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435:<br \/>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage2\/5ee\/47b\/b26\/5ee47bb26422da1fa9653e0d943c4c4b.png\"\/><\/p>\n<p>  \u0423\u043c\u043d\u043e\u0436\u0430\u044f \u0432\u0438\u0434\u043e\u0432\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043d\u0430 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0443\u0441\u0435\u0447\u0435\u043d\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b (clip coordinates). \u0414\u0435\u043b\u044f \u043a\u0430\u0436\u0434\u0443\u044e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443 (x, y, z) \u043d\u0430 4 \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u0443 \u03c9, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 (Normalize Device Coordinates, NDC) \u043a\u0430\u0436\u0434\u0430\u044f \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u0442 -1 \u0434\u043e 1, \u043f\u0440\u0438 \u0442\u043e\u043c \u043e\u0441\u044c Z \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u0430 \u0443\u0436\u0435 \u043e\u0442 \u043d\u0430\u0441 (\u0442\u043e \u0435\u0441\u0442\u044c \u0424\u0440\u0443\u0441\u0442\u0440\u0443\u043c \u043f\u043e \u0441\u0443\u0442\u0438 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043a\u0443\u0431 \u0438 \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u043d\u0430\u0441 \u043d\u0430 180 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432), <br \/>  \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0441\u0434\u0432\u0438\u0433\u043e\u043c \u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u043e\u043a\u043e\u043d\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b (window coordinates), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u0436\u0435 \u043d\u0430\u043a\u043e\u043d\u0435\u0446 \u0438 \u0443\u0447\u0430\u0441\u0442\u0432\u0443\u044e \u0432 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0438 2D-\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435. <\/p>\n<p>  \u0427\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u0432 \u0440\u0435\u0436\u0438\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0435\u0439 \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e GL.MatrixMode \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c MatrixMode.Projection:<br \/>  GL.MatrixMode(MatrixMode.Projection);<\/p>\n<p>  \u0410 \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u0432 \u0440\u0435\u0436\u0438\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0435\u0439 \u043c\u043e\u0434\u0435\u043b\u044c\u043d\u043e-\u0432\u0438\u0434\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e GL.MatrixMode \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c MatrixMode.Modelvew:<br \/>  GL.MatrixMode(MatrixMode.ModelView);<\/p>\n<p>  \u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u0432 glControl1_Paint \u043a\u043e\u0434, \u0440\u0438\u0441\u0443\u044e\u0449\u0438\u0439 \u043e\u0441\u0438 OX, OY, OZ:<\/p>\n<pre><code>GL.Color3(Color.Black); GL.Begin(BeginMode.Lines); GL.Vertex3(0, 0, 0); GL.Vertex3(50, 0, 0); GL.Vertex3(0, 0, 0); GL.Vertex3(0, 50, 0); GL.Vertex3(0, 0, 0); GL.Vertex3(0, 0, 50); GL.End(); <\/code><\/pre>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u0432 \u0434\u0438\u0437\u0430\u0439\u043d\u0435\u0440\u0435 \u0444\u043e\u0440\u043c, \u043d\u0430\u0434\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0434\u043b\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u044f KeyDown, \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f glControl1_KeyDown. \u0417\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u0435\u0451 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043a\u043e\u0434\u043e\u043c:<\/p>\n<pre><code class=\"cs\">private void glControl1_KeyDown(object sender, KeyEventArgs e) { \tif (!loaded) return;  \tif (e.KeyCode == Keys.A) \t{ \t\tGL.MatrixMode(MatrixMode.Projection); \t\tGL.Rotate(30, 0, 0, 1); \t} \tif (e.KeyCode == Keys.B) \t{ \t\tGL.MatrixMode(MatrixMode.Modelview); \t\tGL.Rotate(30, 0, 0, 1); \t}  \tglControl1.Invalidate(); } <\/code><\/pre>\n<p>  \u0422\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043a\u043b\u0430\u0432\u0438\u0448\u0438 A \u043d\u0430 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0435 \u043c\u044b \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u0440\u0435\u0436\u0438\u043c \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u0438 \u0434\u0435\u043b\u0430\u0435\u043c \u043f\u043e\u0432\u043e\u0440\u043e\u0442 \u0432\u043e\u043a\u0440\u0443\u0433 \u043e\u0441\u0438 OZ \u043d\u0430 30 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432 \u043f\u0440\u043e\u0442\u0438\u0432 \u0447\u0430\u0441\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u0435\u043b\u043a\u0438,<br \/>  \u0430 \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043a\u043b\u0430\u0432\u0438\u0448\u0438 B \u0442\u043e\u0436\u0435 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0432\u043e\u0440\u043e\u0442 \u0432\u043e\u043a\u0440\u0443\u0433 \u043e\u0441\u0438 OZ, \u043d\u043e \u0443\u0436\u0435 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043c\u043e\u0434\u0435\u043b\u044c\u043d\u043e-\u0432\u0438\u0434\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>  \u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u0440\u0438\u0432\u043e\u0436\u0443 \u0437\u0434\u0435\u0441\u044c:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 \u043a\u0443\u0431\u0438\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u043d\u0430\u0436\u0430\u0442\u0438\u044f\u043c A \u0438 B<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;  using OpenTK; using OpenTK.Graphics.OpenGL;  namespace habr {     public partial class Form1 : Form     {         float width = 20;         bool loaded = false;                 public Form1()         {             InitializeComponent();         }          private void Form1_Load(object sender, EventArgs e)         {          }          private void glControl1_Load(object sender, EventArgs e)         {             loaded = true;             GL.ClearColor(Color.SkyBlue);             GL.Enable(EnableCap.DepthTest);                          Matrix4 p = Matrix4.CreatePerspectiveFieldOfView((float)(80 * Math.PI \/ 180), 1, 20, 500);             GL.MatrixMode(MatrixMode.Projection);             GL.LoadMatrix(ref p);              Matrix4 modelview = Matrix4.LookAt(70, 70, 70, 0, 0, 0, 0, 1, 0);             GL.MatrixMode(MatrixMode.Modelview);             GL.LoadMatrix(ref modelview);                   }          private void glControl1_KeyDown(object sender, KeyEventArgs e)         {             if (!loaded) return;              if (e.KeyCode == Keys.A)             {                 GL.MatrixMode(MatrixMode.Projection);                 GL.Rotate(30, 0, 0, 1);             }             if (e.KeyCode == Keys.B)             {                 GL.MatrixMode(MatrixMode.Modelview);                 GL.Rotate(30, 0, 0, 1);             }              glControl1.Invalidate();         }          private void glControl1_Paint(object sender, PaintEventArgs e)         {             if (!loaded)                 return;              GL.Clear(ClearBufferMask.DepthBufferBit | ClearBufferMask.ColorBufferBit);                                      \/*\u0437\u0430\u0434\u043d\u044f\u044f*\/             GL.Color3(Color.Red);             GL.Begin(BeginMode.Polygon);             GL.Vertex3(0, 0, 0);             GL.Vertex3(width, 0, 0);             GL.Vertex3(width, width, 0);             GL.Vertex3(0, width, 0);             GL.End();              \/*\u043b\u0435\u0432\u0430\u044f*\/             GL.Begin(BeginMode.Polygon);             GL.Vertex3(0, 0, 0);             GL.Vertex3(0, 0, width);             GL.Vertex3(0, width, width);             GL.Vertex3(0, width, 0);             GL.End();              \/*\u043d\u0438\u0436\u043d\u044f\u044f*\/             GL.Begin(BeginMode.Polygon);             GL.Vertex3(0, 0, 0);             GL.Vertex3(0, 0, width);             GL.Vertex3(width, 0, width);             GL.Vertex3(width, 0, 0);             GL.End();              \/*\u0432\u0435\u0440\u0445\u043d\u044f\u044f*\/             GL.Begin(BeginMode.Polygon);             GL.Vertex3(0, width, 0);             GL.Vertex3(0, width, width);             GL.Vertex3(width, width, width);             GL.Vertex3(width, width, 0);             GL.End();              \/*\u043f\u0435\u0440\u0435\u0434\u043d\u044f\u044f*\/                         GL.Begin(BeginMode.Polygon);             GL.Vertex3(0, 0, width);             GL.Vertex3(width, 0, width);             GL.Vertex3(width, width, width);             GL.Vertex3(0, width, width);             GL.End();              \/*\u043f\u0440\u0430\u0432\u0430\u044f*\/             GL.Begin(BeginMode.Polygon);             GL.Vertex3(width, 0, 0);             GL.Vertex3(width, 0, width);             GL.Vertex3(width, width, width);             GL.Vertex3(width, width, 0);             GL.End();              GL.Color3(Color.Black);             GL.Begin(BeginMode.LineLoop);             GL.Vertex3(0, 0, 0);             GL.Vertex3(0, width, 0);             GL.Vertex3(width, width, 0);             GL.Vertex3(width, 0, 0);             GL.End();              GL.Begin(BeginMode.LineLoop);             GL.Vertex3(width, 0, 0);             GL.Vertex3(width, 0, width);             GL.Vertex3(width, width, width);             GL.Vertex3(width, width, 0);             GL.End();              GL.Begin(BeginMode.LineLoop);             GL.Vertex3(0, 0, width);             GL.Vertex3(width, 0, width);             GL.Vertex3(width, width, width);             GL.Vertex3(0, width, width);             GL.End();              GL.Begin(BeginMode.LineLoop);             GL.Vertex3(0, 0, 0);             GL.Vertex3(0, 0, width);             GL.Vertex3(0, width, width);             GL.Vertex3(0, width, 0);             GL.End();              GL.Color3(Color.Black);             GL.Begin(BeginMode.Lines);             GL.Vertex3(0, 0, 0);             GL.Vertex3(50, 0, 0);             GL.Vertex3(0, 0, 0);             GL.Vertex3(0, 50, 0);             GL.Vertex3(0, 0, 0);             GL.Vertex3(0, 0, 50);             GL.End();              glControl1.SwapBuffers();         }             } } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0415\u0441\u043b\u0438 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043d\u0430\u0436\u0438\u043c\u0430\u0442\u044c \u0431\u0443\u043a\u0432\u0443 A \u043d\u0430 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0435, \u0442\u043e \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0432\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f 2D-\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435:<br \/>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage2\/cee\/501\/c34\/cee501c3449ae42db77947322a8c172c.gif\"\/><\/p>\n<p>  \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432 \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u0445 \u043e\u0441\u044c OZ \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438 \u043e\u0441\u044c\u044e \u0424\u0440\u0443\u0441\u0442\u0440\u0443\u043c\u0430.<\/p>\n<p>  \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0430\u0436\u0430\u0442\u0438\u044f B \u043d\u0430 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0435, \u0442\u043e \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0432\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0432\u043e\u043a\u0440\u0443\u0433 \u043e\u0441\u0438 OZ:<br \/>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage2\/efb\/99f\/8b6\/efb99f8b696a7b10ee4a978257d40641.gif\"\/><\/p>\n<p>  \u041a\u043e\u0434   <\/p>\n<pre><code class=\"cs\">GL.MatrixMode(MatrixMode.Projection); GL.Rotate(30, 0, 0, 1); <\/code><\/pre>\n<p>  \u0421 \u0442\u0435\u043c \u0436\u0435 \u0443\u0441\u043f\u0435\u0445\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0442\u0430\u043a\u0438\u043c:<\/p>\n<pre><code class=\"cs\">Matrix4d projection_matrix;\/\/\u041c\u0430\u0442\u0440\u0438\u0446\u0430 4x4, \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0442\u0438\u043f\u0430 double GL.GetDouble(GetPName.ProjectionMatrix, out projection_matrix);\/\/\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 projection_matrix  \/\/\u041f\u043e\u0434\u0433\u043e\u0442\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u0432\u043e\u043a\u0440\u0443\u0433 \u043e\u0441\u0438 OZ                 double cos = Math.Cos(-30 * Math.PI \/ 180); double sin = Math.Sin(-30 * Math.PI \/ 180);  Matrix4d rotating_matrix = new Matrix4d( cos, -sin, 0, 0, sin, cos,  0, 0, 0,     0,  1, 0, 0,     0,  0, 1 );  projection_matrix *= rotating_matrix;\/\/\u0443\u043c\u043d\u043e\u0436\u0430\u0435\u043c \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 GL.MatrixMode(MatrixMode.Projection);\/\/\u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u0440\u0435\u0436\u0438\u043c \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f GL.LoadMatrix(ref projection_matrix);\/\/\u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043d\u043e\u0432\u0443\u044e \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f <\/code><\/pre>\n<p>  \u0422\u043e\u0442 \u0436\u0435 \u043a\u043e\u0434 \u043d\u0430\u0434 \u043c\u0430\u0442\u0440\u0438\u0446\u0435\u0439 ModelView \u0434\u0430\u0441\u0442 \u0442\u043e\u0442 \u0436\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.<\/p>\n<p>  \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430 \u043a\u0443\u0431\u0438\u043a\u0430-\u0440\u0443\u0431\u0438\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0437\u0434\u0435\u0441\u044c: <a href=\"http:\/\/\u0442\u0440\u0443\u044a\u043a\u043e\u0434\u0438\u043d\u0433.\u0440\u0444\/files\/opengl.zip\">http:\/\/\u0442\u0440\u0443\u044a\u043a\u043e\u0434\u0438\u043d\u0433.\u0440\u0444\/files\/opengl.zip<\/a><\/p>\n<h4>\u041d\u0430\u043a\u043e\u043d\u0435\u0446-\u0442\u043e<\/h4>\n<p>  \u0412\u0441\u0451 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0443, \u0442\u0430\u043a \u043a\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430. \u041e\u043f\u0438\u0448\u0443 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b.<\/p>\n<h5>\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445<\/h5>\n<p>  <b>1)<\/b> \u041a\u0443\u0431\u0438\u043a \u0420\u0443\u0431\u0438\u043a\u0430, \u0440\u0435\u0431\u0440\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 3-\u0445 \u043a\u0443\u0431\u0438\u043a\u043e\u0432 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 27 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445 \u043a\u0443\u0431\u0438\u043a\u043e\u0432.<br \/>  \u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u043d\u0435\u0439 \u041a\u0443\u0431\u0438\u043a\u0430 \u0420\u0443\u0431\u0438\u043a\u0430 (\u041a\u0420), \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0435 \u043a\u0443\u0431\u0438\u043a\u0438 \u0431\u0443\u0434\u0443\u0442 \u043c\u0435\u043d\u044f\u0442\u044c \u0441\u0432\u043e\u0451 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u043d\u0438 \u041a\u0420, \u043d\u0430\u0434\u043e \u0437\u043d\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u0435 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0435 \u043a\u0443\u0431\u0438\u043a\u0438 \u0432\u0440\u0430\u0449\u0430\u0442\u044c (\u0432\u0435\u0434\u044c \u0432 \u0433\u0440\u0430\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0440\u0430\u0437\u043d\u044b\u0435 \u043a\u0443\u0431\u0438\u043a\u0438), \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0441\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u0433\u0440\u0430\u043d\u0438 \u041a\u0420, \u043d\u0430\u0434\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0430 \u043d\u0435 \u0441\u043e\u0431\u0440\u0430\u043b\u0441\u044f \u043b\u0438 \u043a\u0443\u0431\u0438\u043a.<\/p>\n<p>  \u0414\u043b\u044f \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u0439 \u043a\u0443\u0431\u0438\u043a\u043e\u0432, \u044f \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043b \u043c\u0430\u0441\u0441\u0438\u0432 positions:<br \/>  int[] positions;<\/p>\n<p>  \u0415\u0433\u043e \u043a\u043b\u044e\u0447\u0438 \u2014 \u044d\u0442\u043e \u043d\u043e\u043c\u0435\u0440\u0430 \u043a\u0443\u0431\u0438\u043a\u043e\u0432, \u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u043e\u043c\u0435\u0440\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0439.<\/p>\n<p>  \u041a\u0441\u0442\u0430\u0442\u0438, \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u043b \u0442\u0430\u043a:<br \/>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage2\/40e\/2a7\/880\/40e2a788063676e1d837e10b8010122e.png\"\/><\/p>\n<p>  <b>2)<\/b> \u041a\u043e\u0433\u0434\u0430 \u0432\u0440\u0430\u0449\u0430\u0435\u0448\u044c \u0433\u0440\u0430\u043d\u044c \u041a\u0420, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0435 \u043a\u0443\u0431\u0438\u043a\u0438 \u043c\u0435\u043d\u044f\u044e\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043d\u043e \u043f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u0442\u043e\u0440\u043e\u043d\u0430\u043c\u0438. \u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u043b\u0438 \u0433\u0440\u0430\u043d\u044c \u043d\u0430 \u043e\u0434\u0438\u043d \u043e\u0431\u043e\u0440\u043e\u0442 (90 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432), <br \/>  \u0442\u043e \u043d\u043e\u0432\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043a\u0443\u0431\u0438\u043a\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u0432\u0443\u043c\u044f \u043f\u0443\u0442\u044f\u043c\u0438:<br \/>  1) \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043a\u0443\u0431\u0438\u043a\u0438 \u0432\u043e\u043a\u0440\u0443\u0433 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u043e\u0441\u0438 \u043d\u0430 90 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432 (\u0447\u0442\u043e \u0438 \u0434\u0435\u043b\u0430\u043b\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u0438 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0435)<br \/>  2) \u043b\u0438\u0431\u043e \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u0443\u0431\u0438\u043a\u0438, \u043d\u0430 \u043d\u043e\u0432\u044b\u0435 \u043c\u0435\u0441\u0442\u0430, \u0438 \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u0443\u0431\u0438\u043a \u0432\u043e\u043a\u0440\u0443\u0433 \u0441\u0432\u043e\u0435\u0439 \u043e\u0441\u0438 \u043d\u0430 90 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432. <\/p>\n<p>  \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043b\u0430\u0441\u0441 \u0441\u043b\u0443\u0436\u0435\u0442 \u0434\u043b\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u0443\u0431\u0438\u043a\u0430 \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435.<\/p>\n<pre><code class=\"cs\">public class angleXYZ     {         public angleXYZ()         {             this.X = 0;             this.Y = 0;             this.Z = 0;         }         public int X { get; set; }         public int Y { get; set; }         public int Z { get; set; }     } <\/code><\/pre>\n<p>  \u043f\u043e\u043b\u044f X, Y, Z \u2014 \u044d\u0442\u043e \u0443\u0433\u043b\u044b \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0441\u0435\u0439 OX, OY, OZ <br \/>  \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043a\u0430\u043a\u0443\u044e-\u043b\u0438\u0431\u043e \u0433\u0440\u0430\u043d\u044c, \u0443 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043a\u0443\u0431\u0438\u043a\u043e\u0432 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0443\u0433\u043e\u043b. <br \/>  \u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f, \u044f \u043e\u0431\u043d\u0443\u043b\u044f\u044e \u044d\u0442\u0438 \u0443\u0433\u043b\u044b, \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u044e \u043a\u0443\u0431\u0438\u043a\u0438 \u043d\u0430 \u043d\u043e\u0432\u044b\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 (\u0442\u043e \u0435\u0441\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u0435\u043d\u044f\u044e \u043c\u0430\u0441\u0441\u0438\u0432 position), \u0438 \u0432\u0440\u0430\u0449\u0430\u044e \u043a\u0443\u0431\u0438\u043a\u0438 \u0432\u043e\u043a\u0440\u0443\u0433 \u0441\u0432\u043e\u0435\u0439 \u043e\u0441\u0438 (\u043f\u043e\u043a\u0430\u0436\u0443, \u0447\u0442\u043e \u043f\u043e\u0434 \u044d\u0442\u0438\u043c \u0438\u043c\u0435\u044e \u0432 \u0432\u0438\u0434\u0443). \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0432\u0438\u0434\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0430\u043c\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435.<\/p>\n<p>  \u041e\u0431\u044a\u0435\u043a\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 angleXYZ \u0435\u0441\u0442\u044c \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u0443\u0431\u0438\u043a\u0430 \u0438 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 angles:  <\/p>\n<pre><code class=\"cs\">List&lt;angleXYZ&gt; angles = new List&lt;angleXYZ&gt;(); <\/code><\/pre>\n<p>  <b>3) <\/b>\u041a\u0430\u0436\u0434\u044b\u0439 \u043a\u0443\u0431\u0438\u043a \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 8 \u0443\u0433\u043b\u043e\u0432\u044b\u0445 \u0442\u043e\u0447\u0435\u043a. \u0417\u043d\u0430\u044f \u044d\u0442\u0438 \u0442\u043e\u0447\u043a\u0438, \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043a\u0443\u0431\u0438\u043a \u043d\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430.<br \/>  \u041a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0442\u043e\u0447\u0435\u043a \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 3-\u0445 \u043c\u0435\u0440\u043d\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0435 edges. \u0427\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u043d\u043e\u0441 \u0438 \u043f\u043e\u0432\u043e\u0440\u043e\u0442 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043b\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f (\u0430 \u043d\u0435 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435), \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u043c\u0430\u0442\u0440\u0438\u0446\u044b 1&#215;4 \u0434\u043b\u044f \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0438 \u043c\u0430\u0442\u0440\u0438\u0446\u044b 4&#215;4 \u0434\u043b\u044f \u043c\u0430\u0442\u0440\u0438\u0446 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430 \u0438 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f.<br \/>  \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u0430\u0442\u0440\u0438\u0446 4&#215;4 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u0432\u043e\u0435\u0434\u0438\u043d\u043e \u0438 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430, \u0438 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430. \u0422\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0437\u0430 \u043e\u0434\u043d\u0443 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0432\u0435 \u0432\u0435\u0449\u0438: \u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441, \u0438 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435.<\/p>\n<pre><code class=\"cs\">float[][][] edges; \u2026 \/\/\u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c edges = new float[n][][];\/\/n - \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u0443\u0431\u0438\u043a\u043e\u0432 (27, \u0435\u0441\u043b\u0438 3x3x3) \u2026 for (int i = 0; i &lt; n; i++) { \tfloat[][] vectors = new float[8][] { \t\t\/\/w-\u0434\u043b\u0438\u043d\u0430 \u0440\u0435\u0431\u0440\u0430 \u043a\u0443\u0431\u0438\u043a\u0430 \t\tnew float[4] { 0, 0, 0, 1 }, \t\tnew float[4] { 0, 0, w, 1 }, \t\tnew float[4] { 0, w, 0, 1 }, \t\tnew float[4] { 0, w, w, 1 }, \t\tnew float[4] { w, 0, 0, 1 }, \t\tnew float[4] { w, 0, w, 1 }, \t\tnew float[4] { w, w, 0, 1 }, \t\tnew float[4] { w, w, w, 1 }, \t}; \tedges[i] = vectors; \t\u2026 \t\/\/\u0441\u043c\u0435\u0449\u0430\u0435\u043c \u043a\u0443\u0431\u0438\u043a \tList&lt;int&gt; data = getOffsets(i); \tint offset_x = data[0]; \tint offset_z = data[1]; \tint offset_y = data[2];  \tfor (int j = 0; j &lt; edges[i].Length; j++) \t{ \t\t\/\/w - \u0434\u043b\u0438\u043d\u0430 \u043a\u0443\u0431\u0438\u043a\u0430, spacing - \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043a\u0443\u0431\u0438\u043a\u0430\u043c\u0438  \t\t\/\/(\u043a\u0443\u0431\u0438\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u0441\u0442\u043e\u044f\u0442\u044c \u043d\u0435 \u043f\u043b\u043e\u0442\u043d\u043e) \t\tedges[i][j][0] += offset_x * (w + spacing); \t\tedges[i][j][1] += offset_y * (w + spacing); \t\tedges[i][j][2] += offset_z * (w + spacing); \t} } <\/code><\/pre>\n<p>  \u0427\u0442\u043e\u0431\u044b \u0443\u0437\u043d\u0430\u0442\u044c \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0433\u043e \u043a\u0443\u0431\u0438\u043a\u0430 (\u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u041a\u0443\u0431\u0438\u043a \u0420\u0443\u0431\u0438\u043a\u0430) \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0443\u043b\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u043e\u043c \u041a\u0420, \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e getOffsets, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u043e\u043c\u0435\u0440 \u043a\u0443\u0431\u0438\u043a\u0430 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0430 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u0443\u0431\u0438\u043a\u043e\u0432 \u043d\u0430\u0434\u043e \u043e\u0442\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0437 \u043e\u0441\u0435\u0439. <\/p>\n<p>  <b>4)<\/b> \u0415\u0441\u0442\u044c \u0435\u0449\u0451 \u0441\u043b\u043e\u0432\u0430\u0440\u044c intersect_planes.<br \/>  \u041a\u043b\u044e\u0447\u0438 \u0441\u043b\u043e\u0432\u0430\u0440\u044f \u2014 \u044d\u0442\u043e \u043e\u0441\u0438 (\u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f Axis (public enum Axis { X, Y, Z };)),<br \/>  \u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u2014 \u044d\u0442\u043e \u0433\u0440\u0430\u043d\u0438 \u043d\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u043e\u0441\u0438, \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043c\u043e\u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 Plane (\u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c).<\/p>\n<pre><code class=\"cs\">public enum Axis { X, Y, Z }; Dictionary&lt;Axis, Plane[]&gt; intersect_planes = new Dictionary&lt;Axis,Plane[]&gt;(); <\/code><\/pre>\n<p>  \u041a\u043b\u0430\u0441\u0441 Plane \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0442\u043e\u0447\u0435\u043a \u0443\u0433\u043b\u043e\u0432\u044b\u0445 \u0442\u043e\u0447\u0435\u043a \u043a\u0430\u0436\u0434\u043e\u0439 \u0433\u0440\u0430\u043d\u0438.<\/p>\n<pre><code class=\"cs\">side = N * w + (N - 1) * spacing;\/\/ - \u0434\u043b\u0438\u043d\u0430 \u0433\u0440\u0430\u043d\u0438 \/\/\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0443\u0433\u043b\u043e\u0432\u044b\u0445 \u0442\u043e\u0447\u0435\u043a Vector3 p1 = new Vector3(0, side, side);\/\/&lt;---- Vector3 p2 = new Vector3(side, 0, side); Vector3 p3 = new Vector3(side, side, side);\/\/&lt;---- Vector3 p4 = new Vector3(side, 0, 0); Vector3 p5 = new Vector3(0, 0, 0); Vector3 p6 = new Vector3(0, side, 0);\/\/&lt;----  Vector3 p7 = new Vector3(0, 0, side); Vector3 p8 = new Vector3(side, side, 0);              intersect_planes[Axis.X] = new Plane[2] { new Plane(p2, p3, p8),\/\/\u043a\u0443\u0431\u0438\u043a\u0438 2, 5, 8, 11, 14, 17, 23, 20, 26 \u041e\u0441\u044c X new Plane(p1, p7, p5)\/\/\u043a\u0443\u0431\u0438\u043a\u0438 0, 3, 6, 9, 12, 15, 18, 21, 24 \u041e\u0441\u044c X }; intersect_planes[Axis.Y] = ... \u2026. <\/code><\/pre>\n<p>  \u043e\u0431\u044a\u0435\u043a\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 Plane \u043f\u0440\u043e\u0441\u0442\u043e \u0445\u0440\u0430\u043d\u0438\u0442 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b 3-\u0445 \u0442\u043e\u0447\u0435\u043a, \u0430 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u0431\u044b\u043b\u0438 \u0440\u0430\u0437\u043d\u044b\u0435. \u041d\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0438 \u043d\u0435 \u0437\u0430\u0432\u043e\u0434\u0438\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441, \u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u044b\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c:<\/p>\n<pre><code class=\"cs\">intersect_planes[Axis.X] = new Vector3[2][] { \tnew Vector3[]{p2, p3, p8},\/\/\u043a\u0443\u0431\u0438\u043a\u0438 2, 5, 8, 11, 14, 17, 23, 20, 26 \u041e\u0441\u044c X \tnew Vector3[]{p1, p7, p5},\/\/\u043a\u0443\u0431\u0438\u043a\u0438 0, 3, 6, 9, 12, 15, 18, 21, 24 \u041e\u0441\u044c X }; <\/code><\/pre>\n<p>  \u043d\u043e \u043d\u0430\u043f\u0440\u044f\u0433\u0430\u0435\u0442 \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0447\u0435\u0440\u0435\u0437 \u0447\u0435\u0440\u0435\u0434\u0443 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u044b\u0445 \u0441\u043a\u043e\u0431\u043e\u043a.<\/p>\n<p>  \u042d\u0442\u043e\u0442 \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043f\u043e \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u043a\u0430\u043a\u043e\u0439 \u0433\u0440\u0430\u043d\u0438 \u043c\u044b \u0449\u0435\u043b\u043a\u043d\u0443\u043b\u0438 \u043c\u044b\u0448\u043a\u043e\u0439, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043a\u0430\u043a\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u041a\u0443\u0431\u0438\u043a\u0430 \u0420\u0443\u0431\u0438\u043a\u0430 \u043d\u0430\u0434\u043e \u0432\u0440\u0430\u0449\u0430\u0442\u044c. \u041e\u0431 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438, \u043f\u043e \u0441\u0442\u0440\u0435\u043b\u043a\u0430\u043c \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0449\u0435\u043b\u043a\u043d\u0443\u043b\u0438 \u043c\u044b\u0448\u043a\u043e\u0439, \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u043f\u043e\u0437\u0436\u0435.<\/p>\n<p>  <b>5)<\/b> \u0412\u0430\u0436\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043c\u043e\u0435\u0433\u043e vp \u043a\u043b\u0430\u0441\u0441\u0430 ViewPoint.  <\/p>\n<pre><code class=\"cs\">ViewPoint vp = new ViewPoint(); <\/code><\/pre>\n<p>  \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u0440\u0430\u043d\u0438\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0442\u043e\u0447\u043a\u0438 \u043e\u0431\u0437\u043e\u0440\u0430 \u041a\u0443\u0431\u0438\u043a\u0430 \u0420\u0443\u0431\u0438\u043a\u0430, \u0434\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0440\u0438 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043c\u044b\u0448\u043a\u043e\u0439 \u041a\u0443\u0431\u0438\u043a\u0430 \u0420\u0443\u0431\u0438\u043a\u0430, \u0443 \u043c\u0435\u043d\u044f \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0442\u043e\u0447\u043a\u0438 \u043e\u0431\u0437\u043e\u0440\u0430, \u0430 \u043a\u0443\u0431\u0438\u043a \u0441\u0442\u043e\u0438\u0442 \u043d\u0430 \u043c\u0435\u0441\u0442\u0435.<\/p>\n<p>  \u041a\u043b\u0430\u0441\u0441 ViewPoint \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u0439 \u043e\u0441\u0438 \u043a \u0442\u043e\u0447\u043a\u0435 \u0437\u0440\u0435\u043d\u0438\u044f (\u043c\u0435\u0442\u043e\u0434 getNearestAxis). \u042d\u0442\u043e \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u043d\u0430 \u043a\u0430\u043a\u043e\u0439 \u0433\u0440\u0430\u043d\u0438 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u0435\u043b\u043e\u0447\u043a\u0438, \u0442\u043e \u0435\u0441\u0442\u044c \u043a\u0430\u043a\u0438\u0435 \u0447\u0430\u0441\u0442\u0438 \u0432\u0440\u0430\u0449\u0430\u0442\u044c, \u043f\u0440\u0438 \u0449\u0435\u043b\u0447\u043a\u0435 \u043c\u044b\u0448\u0438.<\/p>\n<p>  \u0422\u043e\u0447\u043a\u0430 \u043e\u0431\u0437\u043e\u0440\u0430 \u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432\u043e\u043a\u0440\u0443\u0433 \u041a\u0443\u0431\u0438\u043a\u0430 \u0420\u0443\u0431\u0438\u043a\u0430 \u043f\u043e \u0441\u0444\u0435\u0440\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0443\u0434\u043e\u0431\u043d\u043e \u043e\u043f\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u0433\u043b\u043e\u043c \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0441\u0438 OX (\u0443\u0433\u043e\u043b \u03b1) \u0438 \u0443\u0433\u043b\u043e\u043c \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e oc\u0438 OY (\u0443\u0433\u043e\u043b \u03b2):<br \/>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage2\/904\/711\/a52\/904711a5254769bc11a69f65089fe94d.png\"\/><\/p>\n<p>  \u0423 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 vp \u043e\u0442\u043a\u0440\u044b\u0442\u044b \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430-\u0441\u0435\u0442\u0442\u0435\u0440\u044b angle_view_alpha \u0438 angle_view_beta, \u0447\u0435\u0440\u0435\u0437 \u043d\u0438\u0445 \u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0443\u0433\u043e\u043b \u03b1 \u0438 \u0443\u0433\u043e\u043b \u03b2, \u0430 \u0432 \u0442\u0435\u043b\u0435 \u0441\u0435\u0442\u0442\u0435\u0440\u043e\u0432 \u043f\u043e \u044d\u0442\u0438\u043c \u0443\u0433\u043b\u0430\u043c \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043a\u0430\u043c\u0435\u0440\u044b (\u0442\u043e\u0447\u043a\u0438 \u043e\u0431\u0437\u043e\u0440\u0430). <br \/>  \u0422\u0430\u043a\u0436\u0435 \u0443 \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430-\u0433\u0435\u0442\u0442\u0435\u0440\u044b, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0435 \u0432\u0435\u0440\u0445 \u043d\u043e\u0433\u0430\u043c\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043b\u0438 \u043a\u0430\u043c\u0435\u0440\u0430, \u0441 \u043a\u0430\u043a\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u043e\u0441\u0438 \u043c\u044b \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043a\u0443\u0431\u0438\u043a (\u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 X, \u0438\u043b\u0438 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 Z).<br \/>  \u042d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0432 \u043a\u0430\u043a\u0438\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043a\u0440\u0443\u0442\u0438\u0442\u044c \u0433\u0440\u0430\u043d\u0438 \u041a\u0443\u0431\u0438\u043a\u0430 \u0420\u0443\u0431\u0438\u043a\u0430. \u0421\u0430\u043c \u041a\u0443\u0431\u0438\u043a \u0420\u0443\u0431\u0438\u043a\u0430 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u0446\u0435\u043d\u0442\u0440 \u0431\u044b\u043b \u0432 \u0446\u0435\u043d\u0442\u0440\u0435 \u043d\u0430\u0447\u0430\u043b\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442.<\/p>\n<h4>\u041f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u043a\u043e\u0434\u0443<\/h4>\n<p>  <b>\u042f \u0431\u0443\u0434\u0443 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b, \u0438\u043d\u0430\u0447\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u0434\u043e\u043b\u0433\u043e.<\/b> \u042f \u0438 \u0442\u0430\u043a \u0441\u0435\u0431\u044f \u0443\u0436\u0435 \u041b\u044c\u0432\u043e\u043c \u041d\u0438\u043a\u043e\u043b\u0430\u0435\u0432\u0438\u0447\u0435\u043c \u0447\u0443\u0432\u0441\u0442\u0432\u0443\u044e.<\/p>\n<h5><b>\u041c\u0435\u0442\u043e\u0434 Render<\/b><\/h5>\n<p>  \u0421\u0430\u043c \u041a\u0443\u0431\u0438\u043a \u0420\u0443\u0431\u0438\u043a\u0430 \u044f \u0445\u043e\u0447\u0443, \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u0446\u0435\u043d\u0442\u0440 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u043b \u0441 \u0446\u0435\u043d\u0442\u0440\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0435\u0440\u0435\u0439\u0434\u044f \u0432 \u0440\u0435\u0436\u0438\u043c \u043c\u0430\u0442\u0440\u0438\u0446\u044b ModelView, \u044f \u0434\u0435\u043b\u0430\u044e \u043f\u0435\u0440\u0435\u043d\u043e\u0441 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u043d\u0430 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u0434\u043b\u0438\u043d\u044b \u041a\u0443\u0431\u0438\u043a\u0430 \u0420\u0443\u0431\u0438\u043a\u0430 \u043f\u043e \u0432\u0441\u0435\u043c \u043e\u0441\u044f\u043c:<\/p>\n<p>  <code>double offset0 = this.w * N + (N - 1) * spacing;\/\/\u0434\u043b\u0438\u043d\u0430 \u041a\u0443\u0431\u0438\u043a\u0430 \u0420\u0443\u0431\u0438\u043a\u0430 w - \u0434\u043b\u0438\u043d\u0430 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u043e \u043a\u0443\u0431\u0438\u043a\u0430, N - \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u044c \u041a\u0420 (3), spacing - \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u043c\u0438 \u043a\u0443\u0431\u0438\u043a\u0430\u043c\u0438. double offset = offset0 \/ 2; GL.Translate( \t-offset, \t-offset, \t-offset );<\/code><\/p>\n<p>  \u041f\u043e\u0442\u043e\u043c \u043f\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u043a\u0443\u0431\u0438\u043a\u043e\u0432 (27 \u0440\u0430\u0437) \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f cube, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0438\u0441\u0443\u0435\u0442 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0435 \u043a\u0443\u0431\u0438\u043a\u0438 \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0446\u0435\u043d\u0442\u0440\u0435 \u041a\u0420, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0435\u0433\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u0438\u0434\u043d\u043e \u043d\u0438\u043a\u043e\u0433\u0434\u0430.<\/p>\n<h5>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <b>cube<\/b><\/h5>\n<p>  \u042f \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e, \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u043c\u0430\u0442\u0440\u0438\u0446\u0443 ModelView \u0432 \u0441\u0442\u044d\u043a\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 OpenGL:  <\/p>\n<pre><code class=\"cs\">GL.PushMatrix(); <\/code><\/pre>\n<p>   \u0430 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e \u044d\u0442\u0443 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0438\u0437 \u0441\u0442\u044d\u043a\u0430:  <\/p>\n<pre><code class=\"cs\">GL.PopMatrix(); <\/code><\/pre>\n<p>  \u042d\u0442\u043e \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u044b ModelView (\u043f\u043e\u0432\u043e\u0440\u043e\u0442\u044b, \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u044b) \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u0443\u0431\u0438\u043a\u0430 \u043d\u0435 \u0432\u043b\u0438\u044f\u043b\u0438 \u043d\u0430 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0434\u0440\u0443\u0433\u0438\u0445 \u043a\u0443\u0431\u0438\u043a\u043e\u0432. \u0414\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0435\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043a\u0440\u0443\u0442\u0438\u0442\u044c \u043e\u0434\u0438\u043d \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 \u043a\u0443\u0431\u0438\u043a, \u0442\u043e \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043a\u0440\u0443\u0442\u0438\u0442\u044c\u0441\u044f \u0434\u0440\u0443\u0433\u0438\u0435.<\/p>\n<p>  \u0414\u043b\u044f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0433\u0440\u0430\u043d\u0438, \u044f \u0434\u0435\u043b\u0430\u044e \u043f\u043e\u0432\u043e\u0440\u043e\u0442 \u0432\u043e\u043a\u0440\u0443\u0433 \u0432\u043e\u043a\u0440\u0443\u0433 \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u0438\u0437 \u043e\u0441\u0435\u0439.  <\/p>\n<pre><code class=\"cs\">float offset = (w * N + (N - 1) * spacing) \/ 2;\/\/\u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0430 \u0432\u0441\u0435\u0433\u043e \u041a\u0443\u0431\u0438\u043a\u0430 \u0420\u0443\u0431\u0438\u043a\u0430 GL.Translate( \toffset, \toffset, \toffset );  GL.Rotate(angle.X, Vector3.UnitX); GL.Rotate(angle.Y, Vector3.UnitY); GL.Rotate(angle.Z, Vector3.UnitZ);  GL.Translate( \t-offset, \t-offset, \t-offset ); <\/code><\/pre>\n<p>  \u041a\u043e\u0434 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u0442\u0430\u043a, \u0447\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0438\u0437 \u0443\u0433\u043b\u043e\u0432 angle.X, angle.Y, angle.Z \u0432 \u043e\u0434\u0438\u043d \u043c\u043e\u043c\u0435\u043d\u0442 \u043c\u043e\u0436\u0435 \u0431\u044b\u0442\u044c \u043d\u0435\u043d\u0443\u043b\u0435\u0432\u044b\u043c, \u0442\u0430\u043a \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0432\u043e\u0440\u043e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043e\u043a\u0440\u0443\u0433 \u043e\u0434\u043d\u043e\u0439 \u043e\u0441\u0438, \u043b\u0438\u0431\u043e \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432\u043e\u043e\u0431\u0449\u0435.<\/p>\n<p>  \u041d\u043e, \u043f\u0430\u043c\u044f\u0442\u0443\u044f \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0441\u043c\u0435\u0449\u0435\u043d\u0430, \u043d\u0430\u0434\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0451 \u043d\u0430 \u043c\u0435\u0441\u0442\u043e, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e\u0432\u043e\u0440\u043e\u0442, \u0438 \u0441\u043d\u043e\u0432\u0430 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u043d\u043e\u0441, \u0447\u0442\u043e \u0443 \u043c\u0435\u043d\u044f \u0438 \u0441\u0434\u0435\u043b\u0430\u043d\u043e:<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage2\/560\/d19\/636\/560d19636cd83fd0ade4f36994c8d248.png\"\/><\/p>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u0430\u0441\u0441\u0438\u0432 <b>edges <\/b>\u0434\u043b\u044f \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u0443\u0431\u0438\u043a\u0430, \u0446\u0432\u0435\u0442\u0430 \u0433\u0440\u0430\u043d\u0435\u0439 \u043a\u0443\u0431\u0438\u043a\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u0438\u0437 \u043d\u043e\u043c\u0435\u0440\u0430 \u043a\u0443\u0431\u0438\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 cube.<\/p>\n<h5><b>\u0421\u0442\u0440\u0435\u043b\u043a\u0438<\/b><\/h5>\n<p>  \u0426\u0435\u043d\u0442\u0440 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0442\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e GL.Translate \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e.<br \/>  \u041f\u043e\u0442\u043e\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 vp \u043a\u043b\u0430\u0441\u0441\u0430 ViewPoint \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u0438\u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0430\u044f \u043a \u043a\u0430\u043c\u0435\u0440\u0435 \u043e\u0441\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0438 \u0441 \u043a\u0430\u043a\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b. \u0414\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043f\u043e\u0432\u043e\u0440\u043e\u0442 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e GL.Rotate \u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u043c GL.Translate \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u043e\u0439 \u043f\u0435\u0440\u0435\u043d\u043e\u0441, \u0447\u0442\u043e\u0431\u044b \u0441\u0442\u0440\u0435\u043b\u043a\u0438 \u0440\u0438\u0441\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u0443 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u0439 \u0433\u0440\u0430\u043d\u0438.<\/p>\n<p>  \u0427\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043f\u043e \u043a\u0430\u043a\u043e\u0439 \u0441\u0442\u0440\u0435\u043b\u043a\u0435 \u043c\u044b \u0449\u0451\u043b\u043a\u043d\u0443\u043b\u0438, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0434\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043f\u0440\u044f\u043c\u0443\u044e \u0438\u0434\u0443\u0449\u0443\u044e \u043e\u0442 \u043c\u0435\u0441\u0442\u0430 \u0449\u0435\u043b\u0447\u043a\u0430 \u043c\u044b\u0448\u0438, \u0430 \u043f\u043e\u0442\u043e\u043c \u043d\u0430\u0434\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u0435\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u0441 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c\u044e, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0439 \u0433\u0440\u0430\u043d\u044c \u043a\u0443\u0431\u0438\u043a\u0430, \u0434\u0430\u043b\u0435\u0435 \u0437\u043d\u0430\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445 \u043a\u0443\u0431\u0438\u043a\u043e\u0432 \u0438 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438, \u043d\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u0442 \u0442\u0440\u0443\u0434\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043f\u043e \u043a\u0430\u043a\u043e\u0439 \u0441\u0442\u0440\u0435\u043b\u043a\u0435 \u043c\u044b \u0449\u0451\u043a\u043d\u0443\u043b\u0438.<\/p>\n<p>  \u0414\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f 2-\u0445 \u0442\u043e\u0447\u0435\u043a \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u044f\u043c\u043e\u0439 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 (NDC, \u0440\u0435\u0447\u044c \u043e \u043d\u0438\u0445 \u0432\u044b\u0448\u0435), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0434\u043e \u0443\u043c\u043d\u043e\u0436\u0438\u0442\u044c \u043d\u0430 \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u043c\u0430\u0442\u0440\u0438\u0446\u0443, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0443\u044e \u0432 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u043c\u0430\u0442\u0440\u0438\u0446 ModelView \u0438 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438.<br \/>  \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0434\u0432\u0443\u0445 \u0442\u043e\u0447\u0435\u043a, \u043b\u0435\u0436\u0430\u0449\u0438\u0445 \u043d\u0430 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u0439 \u0438 \u0434\u0430\u043b\u044c\u043d\u0435\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044f\u0445 \u0424\u0440\u0443\u0441\u0442\u0440\u0443\u043c\u0430.<\/p>\n<pre><code class=\"cs\">System.Windows.Forms.MouseEventArgs me = (e as System.Windows.Forms.MouseEventArgs);                         double y = me.Y; double x = me.X; int w = glControl1.Width; int h = glControl1.Height;  float xpos = (float)(2 * (x \/ w) - 1); float ypos = (float)(2 * (1 - y \/ h) - 1); Vector4 startRay = new Vector4(xpos, ypos, 1, 1); Vector4 endRay = new Vector4(xpos, ypos, -1, 1);              \/\/ Reverse Project Matrix4 modelview = new Matrix4(); Matrix4 projection = new Matrix4();  GL.GetFloat(GetPName.ModelviewMatrix, out modelview); GL.GetFloat(GetPName.ProjectionMatrix, out projection);  Matrix4 trans = modelview * projection; trans.Invert(); startRay = Vector4.Transform(startRay, trans); endRay = Vector4.Transform(endRay, trans); sr = startRay.Xyz \/ startRay.W; er = endRay.Xyz \/ endRay.W; <\/code><\/pre>\n<h5>\u0421\u043d\u043e\u0432\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u0432 \u043c\u0435\u0442\u043e\u0434 <b>Render<\/b><\/h5>\n<p>  \u0417\u043d\u0430\u044f \u0431\u043b\u0438\u0436\u0430\u044e\u0448\u0443\u044e \u0433\u0440\u0430\u043d\u044c \u0438 \u0434\u0432\u0435 \u0442\u043e\u0447\u043a\u0438 \u043f\u0440\u044f\u043c\u043e\u0439, \u043c\u044b \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u0442\u043e\u0447\u043a\u0443 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u044f\u043c\u043e\u0439 \u0438 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438, \u0433\u0434\u0435 \u043b\u0435\u0436\u0438\u0442 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0430\u044f \u043a \u043d\u0430\u043c \u0433\u0440\u0430\u043d\u044c \u041a\u0443\u0431\u0438\u043a\u0430 \u0420\u0443\u0431\u0438\u043a\u0430 (\u0442\u043e \u0435\u0441\u0442\u044c \u0432 \u0434\u0435\u043b\u043e \u0432\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u0441\u043b\u043e\u0432\u0430\u0440\u044c intersect_planes, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0442\u043e\u0447\u043a\u0438 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438).<\/p>\n<p>  \u0424\u0443\u043d\u043a\u0446\u0438\u044e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0442\u043e\u0447\u043a\u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u044f \u043d\u0430\u0433\u0443\u0433\u043b\u0438\u043b. \u0414\u0430\u043b\u0435\u0435 \u0432 \u043a\u043e\u0434\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u0433\u0440\u0430\u043d\u044c \u043c\u044b \u043a\u043b\u0438\u043a\u043d\u0443\u043b\u0438 \u0438\u043b\u0438 \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043e\u0442 \u043d\u0435\u0451 (\u043f\u043e \u0441\u0442\u0440\u0435\u043b\u043a\u0435), \u0438 \u0441 \u0431\u043e\u043a\u0443 \u043e\u0442 \u0433\u0440\u0430\u043d\u0438 \u0438\u043b\u0438 \u0441\u0432\u0435\u0440\u0445\u0443 \u0441\u043d\u0438\u0437\u0443. \u042d\u0442\u043e \u0432\u0441\u0451 \u043b\u0435\u0433\u043a\u043e \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0441\u0430\u043c \u043a\u0443\u0431\u0438\u043a \u043d\u0435 \u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f, \u0430 \u0435\u0433\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043f\u0430\u0440\u0430\u043b\u0435\u043b\u044c\u043d\u044b \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044f\u043c XOY, XOZ, YOZ (\u0442\u043e \u0435\u0441\u0442\u044c \u0432\u0441\u0451 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435\/\u0431\u043e\u043b\u044c\u0448\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0442\u043e\u0447\u043a\u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 4-\u0445 \u0443\u0433\u043b\u043e\u0432\u044b\u0445 \u0442\u043e\u0447\u0435\u043a).<br \/>  \u041d\u0443 \u0430 \u043f\u043e\u0442\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u043d\u0438.<\/p>\n<h5><b>\u0412\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0433\u0440\u0430\u043d\u0438<\/b><\/h5>\n<p>  \u0414\u043b\u044f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u043d\u0438 \u044f \u0441\u043e\u0437\u0434\u0430\u043b \u043a\u043b\u0430\u0441\u0441 EasingTimer, \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u044b\u0439 \u043e\u0442 System.Timers.Timer, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Singleton, \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430. \u042d\u0442\u043e \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u0434\u0432\u0435 \u0433\u0440\u0430\u043d\u0438 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043d\u0435 \u0432\u0440\u0430\u0449\u0430\u043b\u0438\u0441\u044c. \u0422\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f run, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0443\u0449\u0435\u043d \u043b\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f, \u0438 \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043d\u0435 \u043d\u0430\u0441\u0442\u0443\u043f\u0438\u0442, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u0442\u0441\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439.<\/p>\n<p>  \u0421\u0432\u043e\u0439\u0441\u0442\u0432\u043e duration \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 EasingTimer \u0437\u0430\u0434\u0430\u0451\u0442 \u0432 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f.<br \/>  \u0421\u0430\u043c\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<ol>\n<li>\u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f<\/li>\n<li>\u0441\u0442\u0430\u0440\u0442\u0443\u0435\u0442\u0441\u044f \u0422\u0430\u0439\u043c\u0435\u0440 \u043d\u0430 \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u043d\u0430 100 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434.<\/li>\n<li>\u043a\u043e\u0433\u0434\u0430 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0442\u0430\u0439\u043c\u0435\u0440, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u0433\u0440\u0430\u043d\u0438 <b>rotatePart<\/b>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 angles \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043a\u0443\u0431\u0438\u043a\u043e\u0432. \u041d\u0430\u043f\u043e\u043c\u043d\u044e, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u044d\u0442\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043f\u043e\u0432\u043e\u0440\u043e\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u0443\u0431\u0438\u043a\u0430 \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435.<br \/> \n<pre><code class=\"cs\">public class angleXYZ     {         public angleXYZ()         {             this.X = 0;             this.Y = 0;             this.Z = 0;         }         public int X { get; set; }         public int Y { get; set; }         public int Z { get; set; }     } <\/code><\/pre>\n<p>  \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430, \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0443\u0433\u043e\u043b \u043b\u0438\u0431\u043e X, \u043b\u0438\u0431\u043e Y, \u043b\u0438\u0431\u043e Z, <br \/>  \u0442\u0430\u0439\u043c\u0435\u0440 \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 100 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u0430\u044f \u0434\u0435\u043b\u044c\u0442\u0430 \u0443\u0433\u043b\u0430 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434, \u043f\u0440\u043e\u0448\u0435\u0434\u0448\u0438\u0445 \u043e\u0442 \u0434\u0430\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b\u0438 \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u0448\u0430\u0433\u0435.<br \/>  \u0422\u0430\u0439\u043c\u0435\u0440 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f, \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 glControl1.Invalidate();, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0437\u0432\u044b\u0430\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 <b>Render<\/b>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 <b>cube<\/b> \u0434\u043b\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0433\u043e \u043a\u0443\u0431\u0438\u043a\u0430, \u0430 \u0442\u0430\u043a \u043a\u0430\u043a \u0443 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043a\u0443\u0431\u0438\u043a\u043e\u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 <b>angles<\/b> \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u044b, \u0442\u043e \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0433\u0440\u0430\u043d\u0438. \u0413\u0440\u0430\u043d\u044c \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0432\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f, \u043f\u043e\u043a\u0430 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0442\u0430\u0439\u043c\u0435\u0440.  <\/li>\n<li>\u041a\u043e\u0433\u0434\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u0433\u0440\u0430\u043d\u0438 <b>rotatePart<\/b>, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0447\u0442\u043e \u043f\u0440\u043e\u0448\u043b\u043e duration \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434.<br \/>  \u043e\u043d\u0430 \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 \u0443\u0433\u043b\u044b \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u0443 \u043a\u0443\u0431\u0438\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043b\u0430 (\u0435\u0441\u043b\u0438 \u0432 \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 <b>Render<\/b>, \u0442\u043e \u041a\u0443\u0431\u0438\u043a \u0420\u0443\u0431\u0438\u043a\u0430 \u0431\u0443\u0434\u0443\u0442 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438, \u043a\u0430\u043a \u0431\u0443\u0434\u0442\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0432\u0440\u0430\u0449\u0430\u043b\u0438).<br \/>  \u0414\u0430\u043b\u0435\u0435 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043c\u0430\u0441\u0441\u0438\u0432 positions (\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0433\u0434\u0435 \u043a\u0430\u043a\u043e\u0439 \u043a\u0443\u0431\u0438\u043a \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f, \u0441\u043c\u043e\u0442\u0440\u0438 \u0432\u044b\u0448\u0435), \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u043d\u043e\u0432\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u041a\u0443\u0431\u0438\u043a\u0430 \u0420\u0443\u0431\u0438\u043a\u0430. \u041d\u043e \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u2014 \u043f\u043e\u0441\u043b\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u043d\u0438, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0432\u0443\u044e\u0449\u0438\u0435 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0435 \u043a\u0443\u0431\u0438\u043a\u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0438 \u0441\u0432\u043e\u0451 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043d\u043e \u0438 \u0441\u043b\u043e\u0432\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u043f\u043e\u0432\u043e\u0440\u043e\u0442 \u0432\u043e\u043a\u0440\u0443\u0433 \u0441\u0432\u043e\u0435\u0439 \u043e\u0441\u0438. <br \/>  \u0414\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438 \u043f\u043e\u0432\u043e\u0440\u043e\u0442 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0433\u043e \u043a\u0443\u0431\u0438\u043a\u0430 \u043f\u0440\u0438 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u0433\u0440\u0430\u043d\u0438, \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u0435\u043d \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044e \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043a\u0443\u0431\u0438\u043a\u0430 \u0438 \u0435\u0433\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0432\u043e\u043a\u0440\u0443\u0433 \u0441\u0432\u043e\u0435\u0439 \u043e\u0441\u0438:<br \/>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage2\/1c2\/539\/b2b\/1c2539b2b6adcef40dd61d2a3e674f3d.png\"\/>  <\/li>\n<\/ol>\n<p>  \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432 edges, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b 8 \u0442\u043e\u0447\u0435\u043a \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445 \u043a\u0443\u0431\u0438\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0440\u0430\u0449\u0430\u043b\u0438\u0441\u044c \u0443\u043c\u043d\u043e\u0436\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430.<br \/>  \u0414\u0430\u043b\u0435\u0435 \u043e\u043f\u044f\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u0432\u044b\u0437\u043e\u0432 glControl1.Invalidate(); \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 Render, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 cube, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043a\u0430\u0436\u0435\u0442 \u043a\u0443\u0431\u0438\u043a\u0438 \u043d\u0430 \u043d\u043e\u0432\u044b\u0445 \u043c\u0435\u0441\u0442\u0430\u0445 \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435 \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044b\u0445.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0437\u044a\u044f\u0441\u043d\u044e \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b\u043b \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043d \u043c\u0430\u0441\u0441\u0438\u0432 positions, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u043a\u0430\u043a\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043a\u0430\u043a\u043e\u0439 \u043a\u0443\u0431\u0438\u043a \u0441\u0442\u043e\u0438\u0442 (27 \u043a\u0443\u0431\u0438\u043a\u043e\u0432, 27 \u043f\u043e\u0437\u0438\u0446\u0438\u0439). \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u043d\u0435\u0439 \u041a\u0443\u0431\u0438\u043a\u0430 \u0420\u0443\u0431\u0438\u043a\u0430, \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0435 \u043a\u0443\u0431\u0438\u043a\u0438 \u0431\u0443\u0434\u0443\u0442 \u0432\u0441\u0451 \u0432\u0440\u0435\u043c\u044f \u043c\u0435\u043d\u044f\u0442\u044c \u0441\u0432\u043e\u0451 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0438 \u043d\u0430\u0434\u043e \u0443\u0436\u0435 \u043e\u043f\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438 \u0432\u0438\u0434\u0430 \u201c\u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u0443\u0431\u0438\u043a \u043d\u043e\u043c\u0435\u0440 3 \u043d\u0430 90 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432 \u0432\u043e\u043a\u0440\u0443\u0433 \u043e\u0441\u0438 X\u201d, \u0430 \u043e\u043f\u0435\u0440\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438 \u0432\u0438\u0434\u0430 \u201c\u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u0443\u0431\u0438\u043a, \u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u043d\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043d\u043e\u043c\u0435\u0440 3, \u043d\u0430 90 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432 \u0432\u043e\u043a\u0440\u0443\u0433 \u043e\u0441\u0438 X\u201d.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0437\u044a\u044f\u0441\u043d\u044e, \u043f\u043e\u0447\u0435\u043c\u0443 \u044f \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u044e \u0432 \u043d\u0443\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 angles, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0445 \u0437\u0430 \u043f\u043e\u0432\u043e\u0440\u043e\u0442 \u043a\u0443\u0431\u0438\u043a\u0430 \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u043e\u0432 \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u041f\u043e\u0432\u043e\u0440\u043e\u0442 \u0432\u043e\u043a\u0440\u0443\u0433 \u043e\u0441\u0438 X, \u043f\u043e\u0442\u043e\u043c \u043f\u043e\u0432\u043e\u0440\u043e\u0442 \u0432\u043e\u043a\u0440\u0443\u0433 \u043e\u0441\u0438 Y \u043d\u0435 \u0442\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0447\u0442\u043e \u043f\u043e\u0432\u043e\u0440\u043e\u0442 \u0432\u043e\u043a\u0440\u0443\u0433 \u043e\u0441\u0438 Y, \u0430 \u043f\u043e\u0442\u043e\u043c \u043f\u043e\u0432\u043e\u0440\u043e\u0442 \u0432\u043e\u043a\u0440\u0443\u0433 \u043e\u0441\u0438 X.<\/p>\n<p>  \u0415\u0441\u043b\u0438 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043e\u0431\u043d\u0443\u043b\u044f\u0442\u044c \u0443\u0433\u043b\u044b \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u043a\u0443\u0431\u0438\u043a\u043e\u0432, \u0442\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434 \u0438\u0437 \u043c\u0435\u0442\u043e\u0434\u0430 cube, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0439 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f<\/p>\n<p>  \u0431\u0443\u0434\u0435\u0442 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0432\u044b\u0435 \u0442\u0440\u0438 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f, \u0434\u0430 \u0438 \u0442\u043e, \u0435\u0441\u043b\u0438 \u0431\u0443\u0434\u0443\u0442 \u0432 \u0442\u0430\u043a\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435: \u0432\u043e\u043a\u0440\u0443\u0433 X, \u0432\u043e\u043a\u0440\u0443\u0433 Y, \u0432\u043e\u043a\u0440\u0443\u0433 Z.  <\/p>\n<pre><code class=\"cs\">GL.Rotate(angle.X, Vector3.UnitX); GL.Rotate(angle.Y, Vector3.UnitY); GL.Rotate(angle.Z, Vector3.UnitZ); <\/code><\/pre>\n<p>  \u041d\u0443\u0436\u043d\u043e \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u0443\u0431\u0438\u043a\u0430, \u043d\u0435\u043a\u0438\u0439 \u0442\u0440\u044d\u0439\u0441 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u043e\u0432 \u043d\u0443\u0436\u043d\u043e \u0438\u043c\u0435\u0442\u044c. \u041c\u0430\u0441\u0441\u0438\u0432 edges \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0443\u0433\u043b\u043e\u0432\u044b\u0445 \u0442\u043e\u0447\u0435\u043a \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445 \u043a\u0443\u0431\u0438\u043a\u043e\u0432, \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0443\u043c\u043d\u043e\u0436\u0430\u044f \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043a\u0443\u0431\u0438\u043a\u0430, \u043d\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430, \u043c\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0432\u0441\u0435\u0445 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u043e\u0432 \u044d\u0442\u043e\u0433\u043e \u043a\u0443\u0431\u0438\u043a\u0430. \u041d\u0430\u043c \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 edges \u0438 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043a\u0443\u0431\u0438\u043a.<\/p>\n<h5><b>\u0412\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0433\u043e \u041a\u0443\u0431\u0438\u043a\u0430 \u0420\u0443\u0431\u0438\u043a\u0430<\/b><\/h5>\n<p>  \u0412\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0433\u043e \u041a\u0443\u0431\u0438\u043a\u0430 \u0420\u0443\u0431\u0438\u043a\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0442\u043e\u0447\u043a\u0438 \u043e\u0431\u0437\u043e\u0440\u0430. \u042d\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u0445 MouseDown, MouseMove, MouseUp. \u041f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u043d\u0430 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u043b\u0430\u0441\u044c \u043c\u044b\u0448\u043a\u0430 \u043f\u043e \u043e\u043a\u043d\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0443\u0433\u043b\u044b \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430, \u043f\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u0438 \u0438 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u0438. <\/p>\n<p>  \u0418\u0437\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 vp \u043a\u043b\u0430\u0441\u0441\u0430 ViewPoint, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0435 \u0437\u0430 \u0443\u0433\u043b\u044b \u043e\u0442 \u043e\u0441\u0438 X, \u0438 Y (\u0441\u043c\u043e\u0442\u0440\u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0432\u044b\u0448\u0435), \u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043a\u043b\u0430\u0441\u0441\u0430 ViewPoint \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043a\u0430\u043c\u0435\u0440\u044b \u0438 \u043f\u0435\u0440\u0435\u0432\u0435\u0440\u043d\u0443\u0442\u0430 \u043b\u0438 \u043e\u043d\u0430, \u0437\u0430\u0442\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u043d\u043e\u0432\u0430\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0430 ModelView:<\/p>\n<pre><code class=\"cs\">G_modelview = Matrix4.LookAt(vp.viewX, vp.viewY, vp.viewZ, 0, 0, 0, 0, vp.orintation_y, 0); <\/code><\/pre>\n<p>  \u043f\u0435\u0440\u0432\u044b\u0435 3 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0437\u0430\u0434\u0430\u044e\u0442 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043a\u0430\u043c\u0435\u0440\u044b, <br \/>  \u0432\u0442\u043e\u0440\u044b\u0435 3 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0437\u0430\u0434\u0430\u044e\u0442, \u0447\u0442\u043e \u043a\u0430\u043c\u0435\u0440\u0430 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0430 \u043d\u0430 \u0446\u0435\u043d\u0442\u0440 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442.<br \/>  \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 3 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0437\u0430\u0434\u0430\u044e\u0442, \u043a\u0430\u043a \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u0430 \u043a\u0430\u043c\u0435\u0440\u0430<br \/>  \u0437\u0434\u0435\u0441\u044c \u0437\u0430\u0434\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043e\u0441\u044c Y \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0430 \u043b\u0438\u0431\u043e \u0432\u0432\u0435\u0440\u0445, \u0435\u0441\u043b\u0438 vp.orintation_y == 1, \u043b\u0438\u0431\u043e \u0432\u043d\u0438\u0437 \u0435\u0441\u043b\u0438 vp.orintation_y == -1<\/p>\n<p>  \u0417\u0430 \u0441\u0438\u043c \u0432\u0441\u0451. <br \/>  \u0412\u0441\u0451 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435, \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u043a\u0430\u043a \u0442\u043e \u0441\u043c\u044b\u0441\u043b\u0430 \u043d\u0435 \u0432\u0438\u0436\u0443, \u0434\u0430 \u0435\u0449\u0451 \u0438 \u0434\u043e\u043b\u0433\u043e \u0431\u0443\u0434\u0435\u0442. \u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435. \u041f\u0440\u043e\u0435\u043a\u0442 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0437\u0434\u0435\u0441\u044c: <a href=\"http:\/\/xn--c1abmgrdmpk4e.xn--p1ai\/files\/opengl.zip\">http:\/\/xn--c1abmgrdmpk4e.xn--p1ai\/files\/opengl.zip<\/a>    \t \t\t   \t<\/p>\n<div class=\"clear\"><\/div>\n<\/p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/173131\/\"> http:\/\/habrahabr.ru\/post\/173131\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\">   \tOpenGL \u2014 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u0430\u044f \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0445 \u0434\u0432\u0443\u0445\u043c\u0435\u0440\u043d\u0443\u044e \u0438 \u0442\u0440\u0435\u0445\u043c\u0435\u0440\u043d\u0443\u044e \u0433\u0440\u0430\u0444\u0438\u043a\u0443.<br \/>  \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043e\u043f\u0438\u0448\u0443, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440 \u041a\u0443\u0431\u0438\u043a\u0430 \u0420\u0443\u0431\u0438\u043a\u0430 \u043d\u0430 OpenGL.<\/p>\n<p>  \u041a\u0443\u0431\u0438\u043a \u0431\u0443\u0434\u0435\u0442 \u0432 3D \u0438 \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043c\u044b\u0448\u043a\u043e\u0439, \u0430 \u043f\u0435\u0440\u0435\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0433\u0440\u0430\u043d\u0438 \u043c\u043e\u0436\u043d\u043e, \u043a\u043b\u0438\u043a\u0430\u044f \u043c\u044b\u0448\u043a\u043e\u0439 \u043f\u043e \u0441\u0442\u0440\u0435\u043b\u043a\u0430\u043c. \u041f\u0440\u0438 \u0442\u043e\u043c \u0441\u0442\u0440\u0435\u043b\u043a\u0438 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0443 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u0439 \u043a \u0437\u0440\u0438\u0442\u0435\u043b\u044e \u0433\u0440\u0430\u043d\u0438.<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage2\/28e\/708\/9e1\/28e7089e1014b0a3330792cecb23c12e.png\"\/>  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-173131","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/173131","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=173131"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/173131\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=173131"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=173131"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=173131"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}