OpenGL рдПрдХ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рд╕реНрд╡рддрдВрддреНрд░ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рд╣реИ рдЬреЛ рджреЛ-рдЖрдпрд╛рдореА рдФрд░ рддреАрди-рдЖрдпрд╛рдореА рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдВрдкреНрдпреВрдЯрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдЖрдк рдУрдкрдирдЧреЗрд▓ рдкрд░ рд░реВрдмрд┐рдХ рдХреНрдпреВрдм рдПрдореБрд▓реЗрдЯрд░ рдХреИрд╕реЗ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдХреНрдпреВрдм 3 рдбреА рдореЗрдВ рд╣реЛрдЧрд╛ рдФрд░ рдорд╛рдЙрд╕ рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдШреБрдорд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рдФрд░ рдЖрдк рддреАрд░ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рдЪреЗрд╣рд░реЗ рдХреЛ рдлреНрд▓рд┐рдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рддреАрд░ рджрд░реНрд╢рдХ рдХреЗ рд╕рдмрд╕реЗ рдХрд░реАрдм рдХрд┐рдирд╛рд░реЗ рдкрд░ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВред

рдореИрдВ рд░реБрдмрд┐рдХ рдХреЗ рдХреНрдпреВрдм рдПрдореНрдпреВрд▓реЗрдЯрд░ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рд╡рд░реНрдгрди C # рдореЗрдВ рдХрд░реВрдВрдЧрд╛, OpenGL рдХреЗ рд▓рд┐рдП рдореИрдВ
OpenTK рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ
рдХрд░реВрдВрдЧрд╛ ред рдЖрдкрдХреЛ рдЗрд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рд╡рд┐рдЬрд╝реБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
3 рдбреА рджреМрд░рд╛
рдЕрдм 3 рдбреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╡рд┐рд╡рд░рдгред 3D рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ рд╣рдорд╛рд░реЗ 3 рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ x, y, z рдФрд░ рдореЙрдирд┐рдЯрд░ рд╕реНрдХреНрд░реАрди рдкрд░ рдХреЗрд╡рд▓ рджреЛ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╣реИрдВред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдкреНрд░реЛрдЬреЗрдХреНрд╢рди рдХреЛ рдореЙрдирд┐рдЯрд░ рд╕реНрдХреНрд░реАрди рдкрд░ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд▓реЗрдХрд┐рди рдмреИрдХ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдпрд╛ рдЬреЛ рдмрдЧрд╝рд▓ рдореЗрдВ рдЦрдбрд╝реЗ рд╣реИрдВ, рд╣рдореЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдореЗрдВ рдРрд╕реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдБ рдирд╣реАрдВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдЬреЛ рдмрд╣реБрдд рджреВрд░ рд╣реИрдВред (рд░реЗрд╕рд┐рдВрдЧ рдореЗрдВ рдХреИрд╕реЗ рдпрд╛рдж рд░рдЦреЗрдВ, рдЬрдм рдЖрдк рдЙрдирд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рджреВрд░ рдХреА рд╡рд╕реНрддреБрдПрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИрдВ)ред
рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рд╕реАрдорд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╣рдо рдХреНрдпрд╛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:

рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдХрд╛рдЯреЗ рдЧрдП рдкрд┐рд░рд╛рдорд┐рдб рдХреЛ рдлреНрд░рд╕реНрдЯреНрд░рдо (FrustRum) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕реНрдХреНрд░реАрди рдкрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдлреНрд░рд╕реНрдЯреНрд░рдо (рдЙрди рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рд╣рдо рдХрдЯ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ), рдлрд┐рд░ рд╣рдо рд╕реНрдХреНрд░реАрди рдкрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╕рдм рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдУрдкрдирдЬреАрдПрд▓ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдкрдВрдЦ рдкрд░реАрдХреНрд╖рдг
OpenTK рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ ред рдлрд╝рд╛рдЗрд▓ рдЪрд▓рд╛рдПрдБ, рд▓рд╛рдпрдмреНрд░реЗрд░реА рдХреЛ рдЕрдирдкреИрдХ рдХрд░реЗрдВред
рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ, OpenTK.dll рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рдЬреЛрдбрд╝реЗрдВред рдФрд░ рдЬрдм рд╕реЗ рд╣рдо GLControl рдирд┐рдпрдВрддреНрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕ рдкрд░ Rubik's Cube рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд╣рдо OpenTK.GLControl.dll рдХрд╛ рд▓рд┐рдВрдХ рднреА рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ
OpenTK рдХреЛ рднреА System.Drawing.dll рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рд╣рдо рдПрдХ рд▓рд┐рдВрдХ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ .Net рдЯреИрдм рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ рдФрд░ System.Drawing рдХреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВ, рдФрд░ рдЬреЛрдбрд╝реЗрдВред
OpenTK рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдореИрдВ рдПрдХ рдирд┐рдпрдорд┐рдд GUI рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдЕрдВрджрд░ OpenGL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдбрд┐рдЬрд╝рд╛рдЗрди рдореЛрдб рдореЗрдВ, рд╣рдо рдЯреВрд▓рдмрд╛рд░ рдкрд░ рд░рд╛рдЗрдЯ-рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ "рд╕рд┐рд▓реЗрдХреНрдЯ рдПрд▓реАрдореЗрдВрдЯреНрд╕" рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ, ".NET рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рдШрдЯрдХ" рдЯреИрдм рдкрд░ рдЬрд╛рдПрдВ рдФрд░ OpenTK.GLControl.dll рдлрд╝рд╛рдЗрд▓ рдЪреБрдиреЗрдВред рд╕реВрдЪреА рдореЗрдВ рдПрдХ рдирдпрд╛ GLControl рддрддреНрд╡ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛, рдЗрд╕рдХреЗ рд╕рд╛рдордиреЗ рдПрдХ рдЪреЗрдХрдорд╛рд░реНрдХ рд░рдЦреЗрдВред рдареАрдХ рд╣реИред рдЯреВрд▓рдмрд╛рд░ рдкрд░ рдПрдХ рдирдпрд╛ GLControl рдЖрдЗрдЯрдо рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред рд╣рдо рдЗрд╕реЗ рдлрд╝реЙрд░реНрдо рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЗрд╕рдХреЗ рд╕рдВрдкреВрд░реНрдг рд░реВрдк рддрдХ рдлреИрд▓рд╛рддреЗ рд╣реИрдВред
GLControl рдирд┐рдпрдВрддреНрд░рдг рдЬреЛрдбрд╝рдирд╛ (рдХреИрдирд╡рд╛рд╕, рдХреИрдирд╡рд╛рд╕) GLControl рддрддреНрд╡ рдореЗрдВ рдПрдХ рд▓реЛрдб рдИрд╡реЗрдВрдЯ рд╣реИ, рдЬрдм рдпрд╣ рддрддреНрд╡ рд▓реЛрдб рд╣реЛрддрд╛ рд╣реИ рддреЛ рдпрд╣ рдЖрдЧ рд▓рдЧ рдЬрд╛рддреА рд╣реИред
(рд╣реИрдВрдбрд▓рд░ рдХреЗ рд╢рд░реАрд░ рдХреЛ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ, glControl1_Load рд╡рд┐рдзрд┐ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА)
OpenTK рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдЗрд╕реЗ рдмреВрдЯ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ GLControl рдХреЗ рд╕рд╛рде рдХрд╛рдо рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдПрдХ рдЪрд░ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдорд╛рди рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ GLControl рдиреЗ рдмреВрдЯ рдХрд┐рдпрд╛ рд╣реИ:
рдХреЛрдб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;
glControl1_Load - рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛ рд▓реЛрдб рдШрдЯрдирд╛ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреА рд╣реИ
glControl1_Paint - рдПрдХ рд╡рд┐рдзрд┐, рдЬреЛ рдкреЗрдВрдЯ рдИрд╡реЗрдВрдЯ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рд╣рдо рдЫрд┐рдкрд╛рддреЗ рд╣реИрдВ рдФрд░ рддрдм рд╡рд┐рдВрдбреЛ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рддреЗ рд╣реИрдВ рдпрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд┐рдВрдбреЛ рдХрд╛ рдЖрдХрд╛рд░ рдмрджрд▓реЗрдВред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдШрди рдбреНрд░рд╛ред
рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдШрди рдЖрд░реЗрдЦрдг рдХреЛрдб 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; 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(); 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(); 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(); 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(); 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(); 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(); glControl1.SwapBuffers(); } } }
OpenTK рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛; - рдореИрдЯреНрд░рд┐рдХреНрд╕ 4 рд╡рд░реНрдЧ (4x4 рдореИрдЯреНрд░рд┐рдХреНрд╕) рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ
OpenTK.Graphics.OpenGL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛; - рдЬреАрдПрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХред
GL рдПрдХ рдРрд╕реА рд╡рд╕реНрддреБ рд╣реИ рдЬрд┐рд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ OpenGL рдХрдорд╛рдВрдб рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
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);
рдпрд╣рд╛рдВ рд╣рдо рдЙрд╕ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдлреНрд░рд╕реНрдЯреНрд░рдо рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ:
1) 80 рдбрд┐рдЧреНрд░реА рдХрд╛ рдХреЛрдг рджреЗрдЦрдирд╛
2) рд▓рдВрдмрд╛рдИ рдХрд╛ рдЕрдиреБрдкрд╛рдд - 1
3) рдкрд╣рд▓реЗ рдЪреЗрд╣рд░реЗ рдХреА рджреВрд░реА - 20
4) рджреВрд░ рдХреА рддрд░рдл рджреВрд░реА - 500
рдкреНрд░реЛрдЬреЗрдХреНрд╢рди рдореЛрдб рдкрд░ рдЬрд╛рдПрдВ, рдФрд░ рдЗрд╕ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рд╕реЗрдЯ рдХрд░реЗрдВред рдореЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдж рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред
GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
рдкреНрд░рд╛рд░рдВрдн ColorBufferBit рдФрд░ DepthBuffer
ColorBufferред рд░рдВрдЧ рдмрдлрд╝рд░ред рд╕реНрдХреНрд░реАрди рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдХрд╛ рд░рдВрдЧ рдорд╛рди рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рд░рдВрдЧ рдмрдлрд░ рдореЗрдВ рджрд░реНрдЬ рд╣реЛрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ GL.Clear (ClearBufferMask.ColorBufferBit) рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдВрдбреЛ рд╕реНрдХрд╛рдИрдмреНрд▓реВ (рдКрдкрд░ рджреЗрдЦреЗрдВ) рд░рдВрдЧ рд╕реЗ рднрд░ рдЬрд╛рдПрдЧреАред
DepthBufferред рд╡рд╣ рдЬреЗрдб-рдмрдлрд░ рд╣реИред рдЧрд╣рд░рд╛рдИ рдмрдлрд░ред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ 3 рдбреА рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рджреЛ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рд╕реНрдХреНрд░реАрди рдкрд░ рдПрдХ рдмрд┐рдВрджреБ рдкрд░ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдирд┐рдХрдЯ рдмрд┐рдВрджреБ рдмрд╣реБрдд рджреВрд░ рддрдХ рдУрд╡рд░рд▓реИрдк рд╣реЛред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдмрд┐рдВрджреБ рдХреА "рдЧрд╣рд░рд╛рдИ" рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдореВрд▓реНрдп рдХреИрдорд░реЗ рд╕реЗ рдмрд┐рдВрджреБ рддрдХ рдХреА рджреВрд░реА рдХреЗ рдЖрдиреБрдкрд╛рддрд┐рдХ рд░реВрдк рд╕реЗ рдЖрдиреБрдкрд╛рддрд┐рдХ рд╣реИ) рдФрд░ рдмрдлрд░ рдореЗрдВ рдЗрд╕рдХреЗ рдореВрд▓реНрдп рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд░реЗрдВ (рдЬреИрд╕реЗ рдкрд┐рдХреНрд╕реЗрд▓, рдРрд╕реА рдЧрд╣рд░рд╛рдИ), рдЖрджрд┐
рдпрджрд┐ рдЕрдЧрд▓реЗ рдмрд┐рдВрджреБ рдХреЛ рдПрдХ рд╣реА рдкрд┐рдХреНрд╕реЗрд▓ рдкрд░ рдкреНрд░рдХреНрд╖реЗрдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдирдП рдмрд┐рдВрджреБ рдХреА "рдЧрд╣рд░рд╛рдИ" рдХреА рддреБрд▓рдирд╛ рд░рд┐рдХреЙрд░реНрдб рдХрд┐рдП рдЧрдП рдЧрд╣рд░рд╛рдИ рдмрдлрд░ рд╕реЗ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ рдирдпрд╛ рдмрд┐рдВрджреБ "рдХрдо рдЧрд╣рд░рд╛" (рдХреИрдорд░реЗ рдХреЗ рдХрд░реАрдм) рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рдкреНрд░рдХреНрд╖реЗрдкрдг рдХреЛ рдореМрдЬреВрджрд╛ рдПрдХ рдХреЛ рдУрд╡рд░рд▓реИрдк рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ рд╣рдо рд╕рдм рдХреБрдЫ рдЙрд╕реА рддрд░рд╣ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВред
рдШрди рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рд╣рдореЗрдВ рдЧрд╣рд░рд╛рдИ-рдмрдлрд░ рдХреЛ рд╕рд╛рдл рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
Matrix4 modelview = Matrix4.LookAt(70, 70, 70, 0, 0, 0, 0, 1, 0); GL.MatrixMode(MatrixMode.Modelview); GL.LoadMatrix(ref modelview);
рдпрд╣рд╛рдВ рд╣рдордиреЗ рдЕрдкрдирд╛ рдХреИрдорд░рд╛ рдмрд┐рдВрджреБ (30, 70, 80) рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛, рд╕рдордиреНрд╡рдп рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдХреЗрдВрджреНрд░ рдореЗрдВ рджреГрд╖реНрдЯрд┐ рдХреА рджрд┐рд╢рд╛ (0, 0, 0)ред рдЕрднрд┐рд╡рд┐рдиреНрдпрд╛рд╕ рдРрд╕рд╛ рд╣реИ рдХрд┐ рдУрдП рдЕрдХреНрд╖ рдХреЛ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЕрдЧрд░ рд╣рдо рдХрд░рддреЗ рд╣реИрдВ
Matrix4 modelview = Matrix4.LookAt(30, 70, 80, 0, 0, 0, 1, 1, 0);
рдлрд┐рд░ рд╣рдо рдПрдХ рдХреЛрдг рдкрд░ рдХреНрдпреВрдм рдХреЛ рджреЗрдЦреЗрдВрдЧреЗ, рдЬреИрд╕реЗ рдХрд┐ рд╣рдордиреЗ рдЕрдкрдирд╛ рд╕рд┐рд░ 45 рдбрд┐рдЧреНрд░реА рдмрд╛рдИрдВ рдУрд░ рдЭреБрдХрд╛ рджрд┐рдпрд╛ рдерд╛ред
рдЗрд╕рдХреЗ рдмрд╛рдж, рдШрди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЦреАрдВрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдкрд╣рд▓реЗ рдЪреЗрд╣рд░реЗ рд▓рд╛рд▓ рд╣реЛрддреЗ рд╣реИрдВ, рдлрд┐рд░ рдХрд┐рдирд╛рд░реЗ рдХрд╛рд▓реЗ рд╣реЛрддреЗ рд╣реИрдВ
рдлрд┐рд░ рдХрдорд╛рдВрдб рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ
glControl1.SwapBuffers();
рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, OpenTK рдореЗрдВ OpenGL рдбрдмрд▓-рдмрдлрд░ рд╣реИ: рдкреНрд░рддреНрдпреЗрдХ рдмрдлрд░ (ColorBuffer, DepthBuffer рдФрд░ рдЕрдиреНрдп рдЬрд┐рдирдХрд╛ рдореИрдВрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛) рдХреА рдирдХрд▓ рдХреА рдЧрдИ рд╣реИред рдЬрдм рд╣рдо рдХреЛрдИ рдЪрд┐рддреНрд░ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдХреЗрд╡рд▓ рдмрдлрд╝рд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рд╕рдордп, рд╕реНрдХреНрд░реАрди рдПрдХ рдЫрд╡рд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреА рд╣реИ рдЬреЛ рдЕрдиреНрдп рдмрдлрд╝рд░реНрд╕ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛рддреА рд╣реИред
GlControl1.SwapBuffers (); рд╣рдо рдмрдлрд╝рд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЫрд╡рд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдордиреЗ рдЗрд╕реЗ рдЪрд┐рддреНрд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИред
рд╡реИрд╕реЗ, рдпрджрд┐ рдЖрдк рдкрд╣рд▓реА рдмрд╛рд░ рдХреЗрд╡рд▓ рд░рдВрдЧреАрди рдмрдлрд░ рдХреЛ рд╕рд╛рдл рдХрд░рддреЗ рд╣реИрдВ
bool b = true; private void glControl1_Paint(object sender, PaintEventArgs e) { if (!loaded) return; GL.Clear(ClearBufferMask.DepthBufferBit); if (b) { GL.Clear(ClearBufferMask.ColorBufferBit); } b = false; тАж
рдпрд╣реА рд╣реИ, рдХреЗрд╡рд▓ рдПрдХ рд░рдВрдЧ рдмрдлрд░ рдХреЛ рд╕рд╛рдлрд╝ рдХрд░реЗрдВ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕реЗ рдиреАрд▓реЗ рд░рдВрдЧ рд╕реЗ рднрд░реЗрдВ), рдФрд░ рджреВрд╕рд░реЗ рдХреЛ рд╕рд╛рдлрд╝ рди рдХрд░реЗрдВред рдФрд░ рдлрд┐рд░ рд╡рд┐рдВрдбреЛ рдХреЛ рдЫреЛрдЯрд╛ / рдЕрдзрд┐рдХрддрдо рдХрд░реЗрдВред рд╡рд╣ рдкреГрд╖реНрдарднреВрдорд┐ рдХрд╛ рд░рдВрдЧ рдиреАрд▓реЗ рд╕реЗ рдХрд╛рд▓реЗ рд░рдВрдЧ рдореЗрдВ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛ред (рд╕рдЪ рд╣реИ, рдпрджрд┐ рдЖрдк рд╡рд┐рдВрдбреЛ рдХреЛ рдЖрдХрд╛рд░ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╣рдореЗрд╢рд╛ рдХрд╛рд▓рд╛ рд╣реЛ рдЬрд╛рдПрдЧрд╛ (рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЖрдХрд╛рд░ рдмрджрд▓рдиреЗ рдкрд░ рджреЛрдиреЛрдВ рдмрдлрд╝рд░реНрд╕ рд░реАрд╕реЗрдЯ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ)ред
рдЕрдм рдореЛрдбреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ 3-рдЖрдпрд╛рдореА рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрди рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рд╡рд╕реНрддреБ рдХреЛ рдЙрд╕рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрд▓рдЧ-рдЕрд▓рдЧ рдереНрд░реА рдбреА рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреА рджреБрдирд┐рдпрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдЦрдбрд╝реЗ рд╣реЛрддреЗ рд╣реИрдВ,
рдЖрдкрдХреЛ рд╕рдВрдмрдВрдзрд┐рдд
рдореЙрдбрд▓ рдореИрдЯреНрд░рд┐рдХреНрд╕ (рдореЙрдбрд▓ рдореИрдЯреНрд░рд┐рдХреНрд╕) рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддреНрдпреЗрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рдЧреБрдгрд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рддрдм рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╡рд╕реНрддреБ рдХреЗ рдирдП рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдПрдХ рдирдП рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рд╢реНрд╡ рд╕реНрдерд╛рди рдореЗрдВ рдорд┐рд▓рддреЗ рд╣реИрдВред
рдЙрд╕реА рд╕рдордп, рд╣рдо рд╡рд┐рднрд┐рдиреНрди рдкрдХреНрд╖реЛрдВ рд╕реЗ рд╡рд╕реНрддреБрдУрдВ рдХреА рджреБрдирд┐рдпрд╛ рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдо рдХреИрдорд░реЗ рдХреЛ рдкрд▓рдЯ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдо рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕рд╕реЗ рджреВрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рджреГрд╢реНрдп рдкрд░рд┐рд╡рд░реНрддрди (рджреГрд╢реНрдп рдореИрдЯреНрд░рд┐рдХреНрд╕) рдХреЗ рд╕рдВрдЧрдд рдореИрдЯреНрд░рд┐рдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ (рд╡рд┐рд╢реНрд╡ рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ) рдХреЛ рдЧреБрдгрд╛ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рджреГрд╢реНрдп рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред
рдУрдкрдирдЬреАрдПрд▓ рдореЗрдВ, рдореЙрдбрд▓ рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдореЗрд╢рди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рд╡реНрдпреВ рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдореЗрд╢рди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ (рдореЙрдбрд▓ рд╡реНрдпреВ рдореИрдЯреНрд░рд┐рдХреНрд╕) рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред (рдЖрдЦрд┐рд░рдХрд╛рд░, рд╣рдо рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЛ рджреЛ рддрд░реАрдХреЛрдВ рд╕реЗ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ: рдЗрд╕рдХреЗ рд╡рд┐рд╢реНрд╡ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ (рд╡рд╕реНрддреБ рдХреЛ рджреВрд░ рд▓реЗ рдЬрд╛рдПрдВ) рдХреЛ рдмрджрд▓реЗрдВ, рдпрд╛ рдХреИрдорд░реЗ рдХреЛ рдЗрд╕рд╕реЗ рджреВрд░ рд▓реЗ рдЬрд╛рдПрдВ (рдирдпрд╛ рджреГрд╢реНрдп рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ)ред
рдлрд┐рд░ рд╕рдордиреНрд╡рдп рдореИрдЯреНрд░рд┐рдХреНрд╕ (рдкреНрд░рдХреНрд╖реЗрдкрдг рдореИрдЯреНрд░рд┐рдХреНрд╕) рджреНрд╡рд╛рд░рд╛ рдЧреБрдгрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдпрд╛ рддреЛ рд╣рддрд╛рд╢рд╛ (рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рдкреНрд░рдХреНрд╖реЗрдкрдг) рдХреЛ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ:

рдпрд╛ рдСрд░реНрдереЛрдЧреЛрдирд▓ рдкреНрд░рдХреНрд╖реЗрдкрдг рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ:

рдкреНрд░рдХреНрд╖реЗрдкрдг рдореИрдЯреНрд░рд┐рдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рджреГрд╢реНрдп рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рдЧреБрдгрд╛ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдХрд╛рдЯреЗ рдЧрдП рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ (рдХреНрд▓рд┐рдк рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ) рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ (x, y, z) рдХреЛ inate рдХреЗ рдорд╛рди рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ (Normalize Device Coordinates, NDC) рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ -1 рд╕реЗ 1 рддрдХ рд╣реИ, рдЬрдмрдХрд┐ Z рдЕрдХреНрд╖ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдЕрд░реНрдерд╛рдд, Frustrum рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд╣реИ) рдПрдХ рдШрди рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╣рдорд╕реЗ 180 рдбрд┐рдЧреНрд░реА рдШреВрдорддрд╛ рд╣реИ)
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рдЦрд┐рдбрд╝рдХреА рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдФрд░ рд╕реНрдХреЗрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЕрдВрддрддрдГ рд╕реНрдХреНрд░реАрди рдкрд░ 2 рдбреА рдЫрд╡рд┐ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВред
рдкреНрд░реЛрдЬреЗрдХреНрд╢рди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХрдВрдЯреНрд░реЛрд▓ рдореЛрдб рдкрд░ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд╕рд╛рде GL.MatrixMode рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдкреИрд░рд╛рдореАрдЯрд░:
GL.MatrixMode (MatrixMode.Projection);
рдФрд░ рдореЙрдбрд▓-рд╡реНрдпреВ рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдореЗрд╢рди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХрдВрдЯреНрд░реЛрд▓ рдореЛрдб рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд╕рд╛рде GL.MatrixMode рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдкреИрд░рд╛рдореАрдЯрд░ рдкреИрд░рд╛рдореАрдЯрд░:
GL.MatrixMode (MatrixMode.ModelView);
GlControl1_Paint рдореЗрдВ рдХреЛрдб рдЬреЛрдбрд╝реЗрдВ рдЬреЛ рдХреБрд▓реНрд╣рд╛рдбрд╝рд┐рдпреЛрдВ рдХреЛ рдЦреАрдВрдЪрддрд╛ рд╣реИ OX, OY, OZ:
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_KeyDown рдлрд╝рдВрдХреНрд╢рди рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред рдЗрд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд╕реЗ рднрд░реЗрдВ:
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(); }
рдпрд╣реА рд╣реИ, рдЬрдм рдЖрдк рдХреАрдмреЛрд░реНрдб рдкрд░ A рдХреБрдВрдЬреА рджрдмрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдкреНрд░рдХреНрд╖реЗрдкрдг рдореЛрдб рдореЗрдВ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ OZ рдЕрдХреНрд╖ 30 рдбрд┐рдЧреНрд░реА рд╡рд╛рдорд╛рд╡рд░реНрдд рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдШреВрдорддреЗ рд╣реИрдВ,
рдФрд░ рдЬрдм рдЖрдк B рдХреБрдВрдЬреА рджрдмрд╛рддреЗ рд╣реИрдВ, рддреЛ OZ рдЕрдХреНрд╖ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рд░реЛрдЯреЗрд╢рди рднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореЙрдбрд▓-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░реВрдкрд╛рдВрддрд░рдг рдореЛрдб рдореЗрдВред
рдореИрдВ рдпрд╣рд╛рдВ рдкреВрд░рд╛ рдХреЛрдб рджреЗрддрд╛ рд╣реВрдВ:
рдПрдХ рдЫреЛрдЯрд╛ рдШрди рдЬреЛ A рдФрд░ B рджрдмрд╛рдХрд░ рдШреВрдорддрд╛ рд╣реИ 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); 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(); 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(); 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(); 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(); 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(); 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(); } } }
рдпрджрд┐ рд╣рдо рдХреАрдмреЛрд░реНрдб рдкрд░ рдЕрдХреНрд╖рд░ A рджрдмрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рд╕реНрдХреНрд░реАрди рдкрд░ 2D рдЫрд╡рд┐ рдХреЛ рдШреБрдорд╛рдПрдВрдЧреЗ:

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдореЗрдВ, OZ рдЕрдХреНрд╖ рднреА Froustrum рдЕрдХреНрд╖ рд╣реИред
рдпрджрд┐ B рдХреЛ рдХреАрдмреЛрд░реНрдб рдкрд░ рджрдмрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкреНрд░рдгрд╛рд▓реА OZ рдЕрдХреНрд╖ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдШреВрдореЗрдЧреА:

рдХреЛрдб
GL.MatrixMode(MatrixMode.Projection); GL.Rotate(30, 0, 0, 1);
рдЙрд╕реА рд╕рдлрд▓рддрд╛ рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
Matrix4d projection_matrix;
рдореЙрдбрд▓рд╡реНрдпреВ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рдКрдкрд░ рд╕рдорд╛рди рдХреЛрдб рд╕рдорд╛рди рдкрд░рд┐рдгрд╛рдо рджреЗрдЧрд╛ред
рджрд░рдЕрд╕рд▓, рдЪрд▓реЛ рд░реВрдмрд┐рдХ рдХреНрдпреВрдм рдПрдореБрд▓реЗрдЯрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд╡рд┐рд╡рд░рдг рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдЖрдк рдпрд╣рд╛рдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
http: //trukoding.rf/files/opengl.zipрдЕрдВрдд рдореЗрдВ,
рдореИрдВ рд╕рдм рдХреБрдЫ рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкрд╛рда рд╣реЛрдЧрд╛ред рдореИрдВ рдореБрдЦреНрдп рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ред
рдореБрдЦреНрдп рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдПрдБ
1) рд░реВрдмрд┐рдХ рдХрд╛ рдШрди, рдЬрд┐рд╕рдХреЗ рдХрд┐рдирд╛рд░реЗ рдореЗрдВ 3 рдШрди рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ 27 рдЫреЛрдЯреЗ рдШрди рд╣реЛрддреЗ рд╣реИрдВред
рд░реВрдмрд┐рдХ рдХреЗ рдХреНрдпреВрдм (рдХреЗрдЖрд░) рдХреЗ рдЪреЗрд╣рд░реЗ рдХреЗ рд░реЛрдЯреЗрд╢рди рдХреЗ рджреМрд░рд╛рди, рдЫреЛрдЯреЗ рдХреНрдпреВрдмреНрд╕ рдЙрдирдХреЗ рд╕реНрдерд╛рди рдХреЛ рдмрджрд▓ рджреЗрдВрдЧреЗред рд╕реАрдЖрд░ рдХреЗ рдЪреЗрд╣рд░реЗ рдХреЛ рдШреБрдорд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рдХреМрди рд╕реЗ рдЫреЛрдЯреЗ рдХреНрдпреВрдмреНрд╕ рдХреЛ рдШреБрдорд╛рдиреЗ рдХреЗ рд▓рд┐рдП (рдЖрдЦрд┐рд░рдХрд╛рд░, рд╡рд┐рднрд┐рдиреНрди рдХреНрдпреВрдмреНрд╕ рдЪреЗрд╣рд░реЗ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ), рд╕реАрдЖрд░ рдХреЗ рдЪреЗрд╣рд░реЗ рдХреЗ рдЕрдЧрд▓реЗ рд░реЛрдЯреЗрд╢рди рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпреВрдм рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред
рдмреНрд▓реЙрдХреЛрдВ рдХреА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдкрджреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рд▓рд╛рдЧреВ рдХреА:
int [] рдкрджреЛрдВ;
рдЙрдирдХреА рдЪрд╛рдмрд┐рдпрд╛рдБ рдХреНрдпреВрдмреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛, рдФрд░ рдкрджреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдорд╛рди рд╣реИрдВред
рд╡реИрд╕реЗ, рдореИрдВрдиреЗ рдкрджреЛрдВ рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рд╣реИ:
2) рдЬрдм рдЖрдк рд╕реАрдбреА рдЪреЗрд╣рд░реЗ рдХреЛ рдШреБрдорд╛рддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрдмрдВрдзрд┐рдд рдЫреЛрдЯреЗ рдХреНрдпреВрдмреНрд╕ рди рдХреЗрд╡рд▓ рд╕реНрдерд╛рди рдмрджрд▓рддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдЕрдиреНрдп рдкрдХреНрд╖реЛрдВ рджреНрд╡рд╛рд░рд╛ рдШреБрдорд╛рддреЗ рд╣реИрдВред рдЬрдм рд╣рдордиреЗ рдХрд┐рдирд╛рд░реЗ рдХреЛ рдПрдХ рдореЛрдбрд╝ рджрд┐рдпрд╛ (90 рдбрд┐рдЧреНрд░реА),
рддрдм рдШрди рдХреА рдирдИ рдЕрд╡рд╕реНрдерд╛ рджреЛ рддрд░рд╣ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ:
1) рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЕрдХреНрд╖ 90 рдбрд┐рдЧреНрд░реА рдХреЗ рдЖрд╕рдкрд╛рд╕ рдЗрд╕реА рдХреНрдпреВрдмреНрд╕ рдХреЛ рдШреБрдорд╛рдПрдВ (рдЬреЛ рдореЛрдбрд╝рддреЗ рд╕рдордп рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛)
2) рдпрд╛ рддреЛ рдХреНрдпреВрдмреНрд╕ рдХреЛ рдирдП рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдкреБрдирд░реНрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░реЗрдВ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдХреНрдпреВрдм рдХреЛ рдЕрдкрдиреА рдзреБрд░реА рдкрд░ 90 рдбрд┐рдЧреНрд░реА рд╕реЗ рдШреБрдорд╛рдПрдВред
рдЕрдЧрд▓реА рдХрдХреНрд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рдШрди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
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; } }
рдлрд╝реАрд▓реНрдб X, Y, Z, рдХреБрд▓реНрд╣рд╛рдбрд╝рд┐рдпреЛрдВ OX, рдУрдП, OZ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдХреЛрдг рд╣реИрдВ
рдЬрдм рд╣рдо рдПрдХ рдЪреЗрд╣рд░реЗ рдХреЛ рдШреБрдорд╛рддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрдмрдВрдзрд┐рдд рдХреНрдпреВрдм рд╕рдВрдмрдВрдзрд┐рдд рдХреНрдпреВрдмреНрд╕ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред
рд░реЛрдЯреЗрд╢рди рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рдЗрди рдХреЛрдгреЛрдВ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рддрд╛ рд╣реВрдВ, рдХреНрдпреВрдмреНрд╕ рдХреЛ рдирдП рдкрджреЛрдВ рдкрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реВрдВ (рдЕрд░реНрдерд╛рдд, рд╕реНрдерд┐рддрд┐ рд╕рд░рдгреА рдХреЛ рддрджрдиреБрд╕рд╛рд░ рдмрджрд▓ рджреЗрдВ), рдФрд░ рдХреНрдпреВрдмреНрд╕ рдХреЛ рдЕрдкрдиреА рдзреБрд░реА рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдШреБрдорд╛рдПрдВ (рдореИрдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдореЗрд░рд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ)ред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗрд╡рд▓ рд░реЛрдЯреЗрд╢рди рдХреЛ рд╣реА рджреЗрдЦрддрд╛ рд╣реИред
рдкреНрд░рддреНрдпреЗрдХ рдХреНрдпреВрдм рдореЗрдВ рдХреНрд▓рд╛рд╕ рдПрдВрдЧрд▓рдПрдХреНрд╕рд╡рд╛рдИрдЬреЗрдб рдХреА рдПрдХ рд╡рд╕реНрддреБ рд╣реЛрддреА рд╣реИ рдФрд░ рдЗрд╕реЗ рдХреЛрдгреЛрдВ рдХреЗ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
List<angleXYZ> angles = new List<angleXYZ>();
3) рдкреНрд░рддреНрдпреЗрдХ рдШрди рдореЗрдВ 8 рдХреЛрдиреЗ рдмрд┐рдВрджреБ рд╣реЛрддреЗ рд╣реИрдВред рдЗрди рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдЬрд╛рдирдирд╛, рдХреНрдпреВрдм рдЦреАрдВрдЪрдирд╛ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред
рдЕрдВрдХ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХрд┐рдирд╛рд░реЛрдВ рдХреЗ 3-рдЖрдпрд╛рдореА рд╕рд░рдгреА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдХреЗрд╡рд▓ рдЧреБрдгрди рдХрд╛рд░реНрдпреЛрдВ (рдЬреЛрдбрд╝ рдФрд░ рдЧреБрдгрд╛ рдХреЗ рдмрдЬрд╛рдп) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдФрд░ рдШреБрдорд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рд▓рд┐рдП 1x4 рдореИрдЯреНрд░рд┐рд╕реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдФрд░ рдЧреБрдгрд╛ рдореИрдЯреНрд░рд┐рд╕ рдХреЗ рд▓рд┐рдП 4x4 рдореИрдЯреНрд░рд┐рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред
4x4 рдореИрдЯреНрд░рд┐рд╕реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЖрдк рдЧреБрдгрд╛ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдПрдХ рд╕рд╛рде рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдореИрдЯреНрд░рд┐рдХреНрд╕, рдФрд░ рд░реЛрдЯреЗрд╢рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рджреЛ рдЪреАрдЬреЗрдВ рдПрдХ рдЧреБрдгрди рдСрдкрд░реЗрд╢рди рдореЗрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ: рд╕рдВрдХреНрд░рдордг рдФрд░ рдЧреБрдгрд╛ рджреЛрдиреЛрдВред
float[][][] edges; тАж
рдЗрдХрдЯреНрдареЗ рд╕реАрдЖрд░ рдореЗрдВ рд╢реВрдиреНрдп рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдЕрдЧрд▓реЗ рдЫреЛрдЯреЗ рдХреНрдпреВрдм (рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рд░реВрдмрд┐рдХ рдХреЗ рдХреНрдпреВрдм рд╣реЛрддреЗ рд╣реИрдВ) рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдлрд╝рдВрдХреНрд╢рди рдЧреЗрдЯрдСрдлрд╝рд╕реЗрдЯ рд▓рд┐рдЦрд╛, рдЬреЛ рдХреНрдпреВрдм рдХреА рд╕рдВрдЦреНрдпрд╛ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рд░рд┐рдЯрд░реНрди рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдЕрдХреНрд╖ рдХреЗ рд╕рд╛рде рдХрд┐рддрдиреЗ рдХреНрдпреВрдмреНрд╕ рдХреЛ рдкреАрдЫреЗ рд╣рдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
4) рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рднреА рд╣реИ intersect_planesред
рд╢рдмреНрджрдХреЛрд╢ рдХреБрдВрдЬреА рдХреБрд▓реНрд╣рд╛рдбрд╝рд┐рдпреЛрдВ рд╣реИрдВ (рдПрдХреНрд╕рд┐рд╕ рдПрдиреНрдпреВрдорд░реЗрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ (рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдирдо рдПрдХреНрд╕рд┐рд╕ {рдПрдХреНрд╕, рд╡рд╛рдИ, рдЬреЗрдб};));
рдФрд░ рдореВрд▓реНрдп рдЗрд╕реА рдзреБрд░реА рдкрд░ рдЕрдВрдХрд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рдореЗрд░реА рдХрдХреНрд╖рд╛ рдХреА рд╡рд┐рдорд╛рди (рд╡рд┐рдорд╛рди) рдХреА рд╡рд╕реНрддреБрдПрдВред
public enum Axis { X, Y, Z }; Dictionary<Axis, Plane[]> intersect_planes = new Dictionary<Axis,Plane[]>();
рдкреНрд░рддреНрдпреЗрдХ рдЪреЗрд╣рд░реЗ рдХреЗ рдХреЛрдиреЗ рдХреЗ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд▓реЗрди рдХреНрд▓рд╛рд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
side = N * w + (N - 1) * spacing;
рдкреНрд▓реЗрди рд╡рд░реНрдЧ рдХреА рдПрдХ рд╡рд╕реНрддреБ рдмрд╕ 3 рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреА рд╣реИ, рдФрд░ рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдирд┐рд░реНрдорд╛рддрд╛ рдпрд╣ рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдЕрд▓рдЧ рд╣реИрдВред рд▓реЗрдХрд┐рди рдПрдХ рдЕрд▓рдЧ рд╡рд░реНрдЧ рдХреЛ рд╢реБрд░реВ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рдерд╛, рд▓реЗрдХрд┐рди рдмрд╕ рджреЛ рдЖрдпрд╛рдореА рд╕рд░рдгреА рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ:
intersect_planes[Axis.X] = new Vector3[2][] { new Vector3[]{p2, p3, p8},
рд▓реЗрдХрд┐рди рд╡рд░реНрдЧ рдХреЛрд╖реНрдардХ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд░рдгреА рдХреЗ рддрддреНрд╡реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╖реНрдЯрдкреНрд░рджред
рдкреНрд▓реЗрди рд╕реЗ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдбрд┐рдХреНрд╢рдирд░реА рдХреА рдЬрд░реВрд░рдд рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕ рдкрд░ рд╣рдордиреЗ рдорд╛рдЙрд╕ рд╕реЗ рдХреНрд▓рд┐рдХ рдХрд┐рдпрд╛, рдХреНрд░рдорд╢рдГ, рд░реВрдмрд┐рдХ рдХреНрдпреВрдм рдХреЗ рдХрд┐рд╕ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдШреБрдорд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡рд┐рдорд╛рди рдХреА рдкрд░рд┐рднрд╛рд╖рд╛, рдЬрд┐рдирдореЗрдВ рд╕реЗ рддреАрд░ рдХреЛ рдорд╛рдЙрд╕ рд╕реЗ рдХреНрд▓рд┐рдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдмрд╛рдж рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред
5) рдореЗрд░реА рд╡реАрдкреА рдХреНрд▓рд╛рд╕ рд╡реНрдпреВрдкреЙрдЗрдВрдЯ рдХреА рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд╕реНрддреБред
ViewPoint vp = new ViewPoint();
рдЬреЛ рд░реВрдмрд┐рдХ рдХреНрдпреВрдм рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рдордиреНрд╡рдп рдХреЗ рдореВрд▓реНрдп рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдореИрдВ рдЕрдкрдиреЗ рдорд╛рдЙрд╕ рдХреЗ рд╕рд╛рде рд░реВрдмрд┐рдХ рдХреНрдпреВрдм рдХреЛ рдШреБрдорд╛рддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реВрдВ, рдФрд░ рдХреНрдпреВрдм рдЕрднреА рднреА рдЦрдбрд╝рд╛ рд╣реИред
рд╡реНрдпреВ рдкреЙрдЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдирд┐рдХрдЯрддрдо рдЕрдХреНрд╖ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реНрдпреВрдкреНрд╡рд╛рдЗрдВрдЯ рд╡рд░реНрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (getNearestAxis рд╡рд┐рдзрд┐)ред рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рддреАрд░ рдХреЛ рдХрд┐рд╕ рдЪреЗрд╣рд░реЗ рдкрд░ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрд░реНрдерд╛рдд рдорд╛рдЙрд╕ рдХреЛ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдкрд░ рдХрд┐рди рднрд╛рдЧреЛрдВ рдХреЛ рдШреБрдорд╛рдирд╛ рд╣реИред
рджреГрд╖реНрдЯрд┐рдХреЛрдг рдПрдХ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд░реВрдмрд┐рдХ рдХреЗ рдШрди рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдШреВрдорддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдХреНрд╖ OX (рдХреЛрдг ╬▒) рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдХреЛрдг рдФрд░ рдорд╣рд╛рд╕рд╛рдЧрд░ рдФрд░ рдУрдП (рдХреЛрдг ╬▓) рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдХреЛрдг рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд▓рд┐рдд рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ:

рд╡реАрдкреА рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░, рд╕реЗрдЯрд░ рдЧреБрдг angle_view_alpha рдФрд░ angle_view_beta рдЦреБрд▓реЗ рд╣реИрдВ, рдЙрдирдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЛрдг ╬▒ рдФрд░ рдХреЛрдг, рдмрджрд▓ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рд╕реЗрдЯрд░реНрд╕ рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рдХреИрдорд░реЗ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ (рд╡реНрдпреВрдкреНрд╡рд╛рдЗрдВрдЯ) рдЗрди рдХреЛрдгреЛрдВ рд╕реЗ рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред
рдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ рдЧрдЯрд░ рдЧреБрдг рднреА рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреИрдорд░рд╛ рдЙрд▓реНрдЯрд╛ рд╣реИ, рдХрд┐рд╕реА рдирд┐рд╢реНрдЪрд┐рдд рдЕрдХреНрд╖ рдХреЗ рдХрд┐рд╕ рддрд░рдл рд╣рдо рдХреНрдпреВрдм рдХреЛ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рдХрд╛рд░рд╛рддреНрдордХ X рдорд╛рдиреЛрдВ рдХреА рддрд░рдл рд╕реЗ, рдпрд╛ рдирдХрд╛рд░рд╛рддреНрдордХ Z рдорд╛рдиреЛрдВ рдХреА рддрд░рдл рд╕реЗ)ред
рд░реБрдмрд┐рдХ рдХреЗ рдХреНрдпреВрдм рдХреЗ рдХрд┐рдирд╛рд░реЛрдВ рдХреЛ рдореЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рди рджрд┐рд╢рд╛рдУрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЗрд╕рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд░реВрдмрд┐рдХ рдХрд╛ рдХреНрдпреВрдм рд╕реНрд╡рдпрдВ рд╕реНрдерд┐рдд рд╣реИ рддрд╛рдХрд┐ рдЗрд╕рдХрд╛ рдХреЗрдВрджреНрд░ рдореВрд▓ рдХреЗ рдХреЗрдВрджреНрд░ рдореЗрдВ рд╣реЛред
рдХреЛрдб рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВ
рдореИрдВ рдХреЗрд╡рд▓ рдореБрдЦреНрдп рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛, рдЕрдиреНрдпрдерд╛ рдпрд╣ рдмрд╣реБрдд рд▓рдВрдмрд╛ рд╣реЛрдЧрд╛ред рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЦреБрдж рдХреЛ рд▓рд┐рдпреЛ рдирд┐рдХреЛрд▓рд╛рдЗрд╡рд┐рдЪ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реВрдВред
рд░реЗрдВрдбрд░ рд╡рд┐рдзрд┐
рдореИрдВ рд░реВрдмрд┐рдХ рдХреНрдпреВрдм рдХреЛ рдЦреБрдж рдЦреАрдВрдЪрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рддрд╛рдХрд┐ рдЗрд╕рдХрд╛ рдХреЗрдВрджреНрд░ рдореВрд▓ рдХреЗ рдХреЗрдВрджреНрд░ рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реЛ, рдЗрд╕рд▓рд┐рдП рдЬрдм рдореИрдВ рдореЙрдбрд▓рд╡реНрдпреВ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдореЛрдб рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рд╕рднреА рдЕрдХреНрд╖реЛрдВ рдХреЗ рд╕рд╛рде рд░реВрдмрд┐рдХ рдХреНрдпреВрдм рдХреА рд▓рдВрдмрд╛рдИ рдХреЗ рд▓рд┐рдП рд╕рдордиреНрд╡рдп рдкреНрд░рдгрд╛рд▓реА рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ:
double offset0 = this.w * N + (N - 1) * spacing;
рдлрд┐рд░, рдХреНрдпреВрдмреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ (27 рдЧреБрдирд╛) рд╕реЗ, рдХреНрдпреВрдм рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЫреЛрдЯреЗ рдХреНрдпреВрдмреНрд╕ рдХреЛ рдЦреАрдВрдЪрддрд╛ рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдпрд╣ рд╕реАрдбреА рдХреЗ рдХреЗрдВрджреНрд░ рдореЗрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрднреА рдирд╣реАрдВ рджреЗрдЦрд╛ рдЬрд╛рдПрдЧрд╛ред
рдШрди рд╕рдорд╛рд░реЛрд╣
рдореИрдВ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ OpenGL рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рд╕реНрдЯреИрдХ рдореЗрдВ рд╡рд░реНрддрдорд╛рди ModelView рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рдмрдЪрд╛рддрд╛ рд╣реВрдБ:
GL.PushMatrix();
рдФрд░ рдЕрдВрдд рдореЗрдВ рдореИрдВ рдЗрд╕ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рд╕реНрдЯреИрдХ рд╕реЗ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реВрдВ:
GL.PopMatrix();
рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рддрд╛рдХрд┐ рдПрдХ рдХреНрдпреВрдм рдХреЗ рдореЙрдбрд▓рд╡реНрдпреВ рдореИрдЯреНрд░рд┐рдХреНрд╕ (рдШреБрдорд╛рд╡, рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг) рдХреЛ рдмрджрд▓рдирд╛ рдЕрдиреНрдп рдХреНрдпреВрдмреНрд╕ рдХреЗ рдореЗрдЯреНрд░рд┐рд╕реЗрд╕ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рди рдХрд░реЗред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдпрджрд┐ рд╣рдо рдПрдХ рдЫреЛрдЯреЗ рдХреНрдпреВрдм рдХреЛ рдореЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рджреВрд╕рд░реЛрдВ рдХреЛ рд╕реНрдкрд┐рди рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдПрдХ рдЪреЗрд╣рд░реЗ рдХреА рд╕реНрдХреНрд░реЙрд▓ рдХреЛ рдЪреЗрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдПрдХ рдХреБрд▓реНрд╣рд╛рдбрд╝реА рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдШреВрдорддрд╛ рд╣реВрдВред
float offset = (w * N + (N - 1) * spacing) / 2;
рдХреЛрдб рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ рдХреЛрдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛрдгред X, angle.Y, angle.Z рдПрдХ рдХреНрд╖рдг рдореЗрдВ рдиреЙрдирдЬрд░реЛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣рд╛рдВ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдЕрдХреНрд╖ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдШреВрдорддрд╛ рд╣реИ, рдпрд╛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди, рдЗрд╕ рдмрд╛рдд рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдХрд┐ рд╕рдордиреНрд╡рдп рдкреНрд░рдгрд╛рд▓реА рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдЗрд╕реЗ рдЕрдкрдиреА рдЬрдЧрд╣ рдкрд░ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдПрдХ рдореЛрдбрд╝ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдлрд┐рд░ рд╕реЗ рд░рд┐рд╡рд░реНрд╕ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдореИрдВрдиреЗ рдХрд┐рдпрд╛ рдерд╛:

рдЕрдЧрд▓рд╛,
рдХрд┐рдирд╛рд░реЛрдВ рдХреЗ рд╕рд░рдгреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреВрдм рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреВрдм рдХреЗ рдЪреЗрд╣рд░реЛрдВ рдХреЗ рд░рдВрдЧ рдШрди рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рдЬреЛ рдХреНрдпреВрдм рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рддреАрд░
рдХреЗрдВрджреНрд░ рдЕрдкрдиреЗ рдореВрд▓ рд╕реНрдерд╛рди рдкрд░ GL.Translate рд░рд┐рдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рд╕рдордиреНрд╡рдп рдХрд░рддрд╛ рд╣реИред
рдлрд┐рд░, рд╡реНрдпреВрдкреНрд╡рд╛рдЗрдВрдЯ рдХреНрд▓рд╛рд╕ рдХреЗ рд╡реАрдкреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдХреИрдорд░реЗ рдХреЗ рдирд┐рдХрдЯрддрдо рд╕рдордиреНрд╡рдп рдкреНрд░рдгрд╛рд▓реА рдХреА рдзреБрд░реА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдХрд┐рд╕ рддрд░рдл рд╕реЗ рд╣реИред
рд╕рдВрдмрдВрдзрд┐рдд рд░реЛрдЯреЗрд╢рди GL.Rotate рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ GL.Translate рд╡рд┐рдзрд┐ рдРрд╕рд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдмрдирд╛рддреА рд╣реИ рддрд╛рдХрд┐ рддреАрд░ рдирд┐рдХрдЯрддрдо рдЪреЗрд╣рд░реЗ рдкрд░ рдЖрд░реЗрдЦрд┐рдд рд╣реЛредрдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╣рдо рдХрд┐рд╕ рддреАрд░ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдкрд╣рд▓реЗ рдорд╛рдЙрд╕ рдХреНрд▓рд┐рдХ рдХреЗ рд╕реНрдерд╛рди рд╕реЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕реАрдзреА рд░реЗрдЦрд╛ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдлрд┐рд░ рд╣рдореЗрдВ рд╕рдореАрдк рдХреЗ рд╕рдорддрд▓ рдЪреМрд░рд╛рд╣реЗ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рдШрди рдХрд╛ рдЪреЗрд╣рд░рд╛ рд╣реЛ, рдлрд┐рд░ рдЫреЛрдЯреЗ рдХреНрдпреВрдмреНрд╕ рдХреЗ рдЖрдХрд╛рд░ рдФрд░ рдЙрдирдХреЗ рдмреАрдЪ рдХреА рджреВрд░реА рдХреЛ рдЬрд╛рдирдирд╛, рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХрд┐ рд╣рдо рдХрд┐рд╕ рддреАрд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред schoknuliредрдРрд╕реА рд╕реАрдзреА рд░реЗрдЦрд╛ рдХреЗ 2 рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ (рдПрдирдбреАрд╕реА, рдКрдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ) рдкрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдореЙрдбрд▓рд╡реНрдпреВ рдореИрдЯреНрд░рд┐рд╕ рдФрд░ рдкреНрд░реЛрдЬреЗрдХреНрд╢рди рдХреЛ рдЧреБрдгрд╛ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдЙрд▓реНрдЯреЗ рдореИрдЯреНрд░рд┐рдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рдЧреБрдгрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПредрдирддреАрдЬрддрди, рд╣рдо рдлреНрд░реЛрд╕реНрдЯреНрд░рдо рдХреЗ рдирд┐рдХрдЯрддрдо рдФрд░ рджреВрд░ рдХреЗ рд╡рд┐рдорд╛рдиреЛрдВ рдкрд░ рдкрдбрд╝реЗ рджреЛ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред 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);
рдлрд┐рд░ рд╕реЗ рд░реЗрдВрдбрд░ рд╡рд┐рдзрд┐ рдкрд░ рдЬрд╛рдПрдВ
рдЕрдкреНрд░реЛрдЪрд┐рдВрдЧ рдлреЗрд╕ рдФрд░ рд▓рд╛рдЗрди рдХреЗ рджреЛ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдЬрд╛рдирдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рд▓рд╛рдЗрди рдФрд░ рдЪреМрд░рд╛рд╣реЗ рдХреЗ рдЪреМрд░рд╛рд╣реЗ рдХреЗ рдмрд┐рдВрджреБ рдХреЛ рдЦреЛрдЬрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рд░реВрдмрд┐рдХ рдХреНрдпреВрдм рдХрд╛ рдЪреЗрд╣рд░рд╛ рд╣рдорд╛рд░реЗ рд╕рдмрд╕реЗ рдХрд░реАрдм рд╣реИ (рдпрд╛рдиреА, рдкреНрд░рддрд┐рдЪреНрдЫреЗрджрди_рдкреНрд▓реЗрди рд╢рдмреНрджрдХреЛрд╢ рдЬрд┐рд╕рдореЗрдВ рдкреНрд▓реЗрди рдХреЗ рдкреЙрдЗрдВрдЯ рдкреНрд▓реЗ рд╣реЛрддреЗ рд╣реИрдВ)редрдЪреМрд░рд╛рд╣реЗ рдмрд┐рдВрджреБ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдореИрдВрдиреЗ рдЧреБрдЧреБрд▓ рдХрд┐рдпрд╛ред рдЖрдЧреЗ, рдХреЛрдб рдореЗрдВ, рдпрд╣ рдЙрд╕ рдЪреЗрд╣рд░реЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдпрд╛ рддреЛ рдЗрд╕рдХреЗ рдХрд┐рдирд╛рд░реЗ рдкрд░ (рддреАрд░ рдХреА рджрд┐рд╢рд╛ рдореЗрдВ), рдФрд░ рдЪреЗрд╣рд░реЗ рдХреА рддрд░рдл рд╕реЗ рдпрд╛ рдКрдкрд░ рд╕реЗ рдиреАрдЪреЗ рддрдХ рдХреНрд▓рд┐рдХ рдХрд┐рдпрд╛ рд╣реИред рдпрд╣ рд╕рдм рдЖрд╕рд╛рди рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХреНрдпреВрдм рд╕реНрд╡рдпрдВ рдирд╣реАрдВ рдЪрд▓рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдХрд┐рдирд╛рд░реЗ XOY, XOZ, YOZ рд╡рд┐рдорд╛рдиреЛрдВ рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рд╣реИрдВ (рдЕрд░реНрдерд╛рдд, рдЪреМрд░рд╛рд╣реЗ рдХреЗ рдмрд┐рдВрджреБ рдХреЗ рдХрдо / рдЕрдзрд┐рдХ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдФрд░ 4 рдХреЛрдиреЗ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреА рддреБрд▓рдирд╛ рдХрд░рдХреЗ рд╕рдм рдХреБрдЫ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)редрдЦреИрд░, рдлрд┐рд░ рд╣рдо рдЪреЗрд╣рд░реЗ рдХреЛ рдШреБрдорд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВредрдЪреЗрд╣рд░рд╛ рдШреБрдорд╛рдирд╛
рдЪреЗрд╣рд░реЗ рдХреЗ рд░реЛрдЯреЗрд╢рди рдХреЛ рдЪреЗрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдИрдЬреАрдЗрдВрдЧрдЯрд╛рдЗрдорд░ рдХреНрд▓рд╛рд╕ рдмрдирд╛рдИ, рдЬреЛ рдХрд┐ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реАред рд╕рд┐рд╕реНрдЯрдордЯрд╛рдЗрдорд░ред рдЪрд┐рдорд░, рд╕рд┐рдВрдЧрд▓рдЯрди рдбрд┐рдЬрд╛рдЗрди рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рддрддреНрд╡ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рдХрд┐рдпрд╛ рддрд╛рдХрд┐ рд╕рдВрдпреЛрдЧ рд╕реЗ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рджреЛ рдЪреЗрд╣рд░реЗ рди рдШреВрдореЗрдВред рдПрдХ рд░рди рд╡реИрд░рд┐рдПрдмрд▓ рднреА рд╣реИ рдЬреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд░реЛрдЯреЗрд╢рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЪрд▓ рд░рд╣реА рд╣реИ рдпрд╛ рдирд╣реАрдВ рдФрд░ рдирдИ рд░реЛрдЯреЗрд╢рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рддрдм рддрдХ рд╢реБрд░реВ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдкрд┐рдЫрд▓реЗ рдПрдХ рд╕рдорд╛рдкреНрдд рди рд╣реЛ рдЬрд╛рдПредрдИрдЬрд┐рдВрдЧрдЯрд╛рдЗрдорд░ рд╡рд░реНрдЧ рдХреА рдПрдХ рд╡рд╕реНрддреБ рдХреА рдЕрд╡рдзрд┐ рд╕рдВрдкрддреНрддрд┐ рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдореЗрдВ рд░реЛрдЯреЗрд╢рди рдХреА рдЕрд╡рдзрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреА рд╣реИредрд░реЛрдЯреЗрд╢рди рд╣реА рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ:- рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕рдордп рдмрдЪ рдЬрд╛рддрд╛ рд╣реИ
- рдЯрд╛рдЗрдорд░ рдкреНрд░рддрд┐ 100 рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдореЗрдВ рдПрдХ рдмрд╛рд░ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред
- , rotatePart , angles . , .
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; } }
, X, Y, Z,
100 , , , .
, glControl1.Invalidate();, Render , cube , angles , . , .
- rotatePart , duration .
, ( Render , , ).
positions ( , , ), . тАФ , , .
, :

рдЗрд╕рд▓рд┐рдП, рддрддреНрд╡ рдХрд┐рдирд╛рд░реЛрдВ рдХреЗ рдПрдХ рд╕рд░рдгреА рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдЫреЛрдЯреЗ рдХреНрдпреВрдмреНрд╕ рдХреЗ 8 рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдШреВрд░реНрдгрди рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рд░реЛрдЯреЗрд╢рди рдореИрдЯреНрд░рд┐рдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рдЧреБрдгрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИредрдлрд┐рд░ glControl1.Invalidate () рдкрд░ рдХреЙрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ; рд░реЗрдВрдбрд░ рд╡рд┐рдзрд┐ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХреНрдпреВрдм рд╡рд┐рдзрд┐ рдХреЛ рдмреБрд▓рд╛рдПрдЧрд╛, рдЬреЛ рдирдП рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рдХреНрдпреВрдмреНрд╕ рдХреЛ рджрд┐рдЦрд╛рдПрдЧрд╛ рдФрд░ рддрджрдиреБрд╕рд╛рд░ рдШреБрдорд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛редрдЕрдм рдореИрдВ рд╕рдордЭрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдкрджреЛрдВ рдХреЗ рд╕рд░рдгреА рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХреНрдпреЛрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпреВрдм рдХрд┐рд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИ (27 рдХреНрдпреВрдмреНрд╕, 27 рд╕реНрдерд┐рддрд┐)ред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд░реВрдмрд┐рдХ рдХреЗ рдХреНрдпреВрдм рдХреЗ рдЪреЗрд╣рд░реЗ рдХреЛ рдШреБрдорд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдЫреЛрдЯреЗ рдХреНрдпреВрдмреНрд╕ рд▓рдЧрд╛рддрд╛рд░ рдЕрдкрдирд╛ рд╕реНрдерд╛рди рдмрджрд▓ рджреЗрдВрдЧреЗ, рдФрд░ рдЖрдкрдХреЛ рдПрдХреНрд╕ рдЕрдХреНрд╖ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ "рдШреБрдорд╛рдиреЗ рд╡рд╛рд▓реЗ рдХреНрдпреВрдм рдирдВрдмрд░ 3 90 рдбрд┐рдЧреНрд░реА" рдЬреИрд╕реА рдЖрдЬреНрдЮрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрдорд╛рдВрдб рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ рдХреНрдпреВрдм рдЦрдбрд╝реЗ рд╣реИрдВред рд╕реНрдерд┐рддрд┐ 3 рдкрд░, рдПрдХреНрд╕ рдЕрдХреНрд╖ рдХреЗ рдЖрд╕рдкрд╛рд╕ 90 рдбрд┐рдЧреНрд░реАред тАЭрдЕрдм рдореИрдВ рд╕рдордЭрд╛рддрд╛ рд╣реВрдБ рдХрд┐ рдХреНрдпреЛрдВ рдореИрдВ рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рдШрди рдХреЛ рдШреБрдорд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдХреЛрдг рдХреЛрдгреЛрдВ рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ рд╢реВрдиреНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░реАрд╕реЗрдЯ рдХрд░рддрд╛ рд╣реВрдБред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдореБрдбрд╝рдиреЗ рдХрд╛ рдХреНрд░рдо рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИред рдПрдХреНрд╕ рдЕрдХреНрд╖ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рд░реЛрдЯреЗрд╢рди, рдлрд┐рд░ рд╡рд╛рдИ рдЕрдХреНрд╖ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рд░реЛрдЯреЗрд╢рди рд╡рд╛рдИ рдЕрдХреНрд╖ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рд░реЛрдЯреЗрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рд╣реА рдирд╣реАрдВ рд╣реИ, рдФрд░ рдлрд┐рд░ рдПрдХреНрд╕ рдЕрдХреНрд╖ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рд░реЛрдЯреЗрд╢рдиредрдпрджрд┐ рдЖрдк рдХреНрдпреВрдмреНрд╕ рдХреЗ рд░реЛрдЯреЗрд╢рди рдХреЗ рдХреЛрдг рдХреЛ рдХрднреА рднреА рд░реАрд╕реЗрдЯ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреНрдпреВрдм рд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд╣реИ рдХрд┐ рд░реЛрдЯреЗрд╢рди рдПрдиреАрдореЗрд╢рди рд▓рд╛рдЧреВрдХрд░рддрд╛ рд╣реИ рд╕рд┐рд░реНрдл рдкрд╣рд▓реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рддреАрди рдШреБрдорд╛рд╡, рдФрд░ рдлрд┐рд░ рднреА, рдпрджрд┐ рд╡реЗ рдЗрд╕ рдХреНрд░рдо рдореЗрдВ рд╣реИрдВ: рдПрдХреНрд╕ рдХреЗ рдЖрд╕рдкрд╛рд╕, рд╡рд╛рдИ рдХреЗ рдЖрд╕рдкрд╛рд╕, рдЬреЗрдб рдХреЗ рдЖрд╕рдкрд╛рд╕ред GL.Rotate(angle.X, Vector3.UnitX); GL.Rotate(angle.Y, Vector3.UnitY); GL.Rotate(angle.Z, Vector3.UnitZ);
рдкреНрд░рддреНрдпреЗрдХ рдХреНрдпреВрдм рдХреЗ рд░реЛрдЯреЗрд╢рди рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЛ рдпрд╛рдж рд░рдЦрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЖрдкрдХреЗ рдкрд╛рд╕ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдШреБрдорд╛рд╡реЛрдВ рдХрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЯреНрд░реЗрд╕ред рдХрд┐рдирд╛рд░реЛрдВ рдХреЗ рд╕рд░рдгреА рдореЗрдВ рдЫреЛрдЯреЗ рдХреНрдпреВрдмреНрд╕ рдХреЗ рдХреЛрдиреЗ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╣реЛрддреЗ рд╣реИрдВ, рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рд░ рдХреНрдпреВрдм рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рд░реЛрдЯреЗрд╢рди рдореИрдЯреНрд░рд┐рдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рдЧреБрдгрд╛ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рдЗрд╕ рдХреНрдпреВрдм рдХреЗ рд╕рднреА рдШреБрдорд╛рд╡реЛрдВ рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдХреЛ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдХрд┐рдирд╛рд░реЛрдВ рдХреЗ рдПрд░реЗ рдХреЗ рддрддреНрд╡ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдХреНрдпреВрдм рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИредрдкреВрд░реЗ рд░реБрдмрд┐рдХ рдХреЗ рдХреНрдпреВрдм рдХрд╛ рд░реЛрдЯреЗрд╢рди
рдкреВрд░реЗ рд░реБрдмрд┐рдХ рдХреЗ рдШрди рдХрд╛ рдШреБрдорд╛рд╡ рдХреЗрд╡рд▓ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдмрджрд▓рдиреЗ рд╕реЗ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рд╣реИрдВрдбрд▓рд░ рдорд╛рдЙрд╕рдбрд╛рдЙрди, рдорд╛рдЙрд╕рдореЛрд╡, рдорд╛рдЙрд╕рдЕрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рдорд╛рдЙрд╕ рдиреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╡рд┐рдВрдбреЛ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдХрд┐рддрдирд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдЖрдВрджреЛрд▓рдиреЛрдВ рдХреЛ рдКрд░реНрдзреНрд╡рд╛рдзрд░ рдФрд░ рдХреНрд╖реИрддрд┐рдЬ рд░реВрдк рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд░реЛрдЯреЗрд╢рди рдХреЛрдг рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИредViewPoint рд╡рд░реНрдЧ рдХреЗ vp рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдЧреБрдг, рдЬреЛ X- рдЕрдХреНрд╖ рдФрд░ Y- рдЕрдХреНрд╖ рд╕реЗ рдХреЛрдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдКрдкрд░ рдЪрд┐рддреНрд░ рджреЗрдЦреЗрдВ), рдФрд░ ViewPoint рд╡рд░реНрдЧ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рдЕрдВрджрд░, рдХреИрдорд░реЗ рдХреЗ рдирдП рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЙрд▓реНрдЯрд╛ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рдлрд┐рд░ рдПрдХ рдирдпрд╛ рдореЙрдбрд▓ рд╡реНрдпреВ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: G_modelview = Matrix4.LookAt(vp.viewX, vp.viewY, vp.viewZ, 0, 0, 0, 0, vp.orintation_y, 0);
рдкрд╣рд▓реЗ 3 рддрддреНрд╡ рдХреИрдорд░реЗ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ,рджреВрд╕рд░реЗ 3 рддрддреНрд╡ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреИрдорд░реЗ рдХреЛ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдХреЗрдВрджреНрд░ рдореЗрдВ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛редрдЕрдВрддрд┐рдо 3 рддрддреНрд╡ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреИрдорд░рд╛ рдХреИрд╕реЗ рдШреБрдорд╛рдпрд╛ рдЬрд╛рддрд╛рд╣реИ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рдИ рдЕрдХреНрд╖ рдпрд╛ рддреЛ рдКрдкрд░ рд╣реЛрдЧрд╛ рдпрджрд┐ vp.orintation_y == 1, рдпрд╛ рдиреАрдЪреЗ рдЕрдЧрд░ vp.orintation_y == -1 рдЗрд╕рдХреЗрд▓рд┐рдП рд╣реИредрдмрд╛рдХреА рд╕рдм рдХреБрдЫ, рдореИрдВ рдЗрд╕рдХрд╛ рдЕрд░реНрде рдирд╣реАрдВ рджреЗрдЦрддрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд░рд╣реЗрдЧрд╛ред рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рдЖрдк рдпрд╣рд╛рдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: http: //xn--c1abmgrdmpk4e.xn--p1ai/files/opengl.zip