private void openGLControl1_OpenGLDraw(object sender, RenderEventArgs args) { gl.Enable(OpenGL.GL_DEPTH_TEST); gl.DepthFunc(OpenGL.GL_LEQUAL); gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT); gl.MatrixMode(OpenGL.GL_MODELVIEW); gl.Enable(OpenGL.GL_TEXTURE_2D); #region Вращение камеры вокруг солнца if (rotate_cam) { float TimeDelta = 0.15f; gl.Rotate(rotate_cam_Angle * TimeDelta, 0, 1, 0); //Камеры rotate_cam_Angle += 1; //Добовляем 1 градус } else { rotate_cam_Angle = 0;//Если вращение отключеноь,то вовзращаемся в начальную позицию } #endregion #region Туман if (fog) { gl.PushMatrix(); float[] fogColor = new float[4] { 0.25f, 0.25f, 0.25f, 1.0f }; // Цвет тумана gl.Enable(OpenGL.GL_FOG); // Включает туман (GL_FOG) gl.Fog(OpenGL.GL_FOG_MODE, OpenGL.GL_EXP); // Выбираем тип тумана GL_EXP,GL_EXP2,GL_LINEAR gl.Fog(OpenGL.GL_FOG_COLOR, fogColor); // Устанавливаем цвет тумана gl.Fog(OpenGL.GL_FOG_DENSITY, 0.02f); // Насколько густым будет туман gl.Hint(OpenGL.GL_FOG_HINT, OpenGL.GL_DONT_CARE); // Вспомогательная установка тумана gl.Fog(OpenGL.GL_FOG_START, -10.0f); // Глубина, с которой начинается туман gl.Fog(OpenGL.GL_FOG_END, 1.0f); // Глубина, где туман заканчивается. gl.PopMatrix(); } else { gl.Disable(OpenGL.GL_FOG); } #endregion #region исуем солнце Tsun.Bind(gl);//устанавливаем текстуру солнца gl.PushMatrix(); gl.Rotate(day * sunRP, 0, 1, 0); //вращение солнца gl.Rotate(-270, 0, 0); gl.Color(1f, 1f, 1f); //Цвет которым оно светит gl.Sphere(Qsun, 1.5f, 40, 40); //Прорисовываем квадрик gl.PopMatrix(); #endregion #region Звезды и создвездия if (stars) { Tstars.Bind(gl);//Текестура звезд #region исование звезд gl.PointSize(1.5f); gl.Enable(OpenGL.GL_POINT_SMOOTH); gl.Begin(BeginMode.Points); for (int i = 0; i < n; i++) { //gl.Color(5f, 5f, 5f); gl.Color(colorGrey[i], colorGrey[i], colorGrey[i]); //gl.Color(cl_Grey, cl_Grey, cl_Grey); gl.Vertex(x[i], y[i], z[i]); } gl.End(); gl.Disable(OpenGL.GL_POINT_SMOOTH); #endregion #region исование созвездия gl.PointSize(3); gl.Enable(OpenGL.GL_POINT_SMOOTH); gl.Begin(OpenGL.GL_POINTS); foreach (float[] vertex in constellation_LittleBear) { gl.Vertex(vertex[0] - 10, vertex[1] + 3, -30); } gl.End(); gl.Color(1.0f, 1.0f, 1.0f); gl.Begin(OpenGL.GL_LINE_STRIP); foreach (float[] vertex in constellation_LittleBear) { gl.Vertex(vertex[0] - 10, vertex[1] + 3, -30); } gl.End(); #endregion } #endregion #region исуем орбиты планетам gl.Color(0.2f, 0.2f, 0.2f, 1f);//Цвет орит if (orbits) { gl.Enable(OpenGL.GL_SMOOTH); gl.Enable(OpenGL.GL_LINE_STIPPLE); gl.LineStipple(1, 0x00FF); drawOrbit(2); //Орбита Меркурия drawOrbit(3); //Орбита Венеры drawOrbit(4); //Орбита Земли drawOrbit(5); //Орбита Марса drawOrbit(7); //Орбита Юпитера drawOrbit(9); //Орбита Сатурна drawOrbit(11); //Орбита Урана drawOrbit(13); //Орбита Нептуна gl.Disable(OpenGL.GL_SMOOTH); gl.Disable(OpenGL.GL_LINE_STIPPLE); } #endregion initlighting();//Источник света(Солнце) gl.LoadIdentity(); #region Вкл/Выкл Туман if (fog) //Если туман включен { gl.ClearColor(0.1f, 0.1f, 0.1f, 0f); //Очищаем экран.Цвет фона. } else { gl.ClearColor(0.0f, 0.0f, 0.0f, 0f);//Очищаем экран.Цвет фона } #endregion gl.LookAt(0, view, 15, 0, 0, 0, 0, 1, 0); gl.Rotate(15, 1, 0, 0); #region исуем планеты солнечной системы gl.PushMatrix(); #region Меркурий gl.PushMatrix(); gl.Rotate(mercury * day, 0, 1, 0);//Вокруг солнца gl.Translate(2, 0, 0); gl.Color(0.5f, 0.5f, 0.5f); //gl.Rotate(rt, 0, 1, 0);//Вокруг себя //drawSphere(0.12f, 25, 25); Tmercury.Bind(gl); gl.Sphere(Qmercury, 0.12f, 25, 25); gl.PopMatrix(); #endregion #region Венера gl.PushMatrix(); gl.Rotate(venus * day, 0, 1, 0);//Вокруг солнца gl.Translate(3, 0, 0); gl.Color(0.7f, 0.7f, 0.0f, 0.01f); //gl.Rotate(rt, 0, 1, 0);//Вокруг себя //drawSphere(0.12f, 25, 25); Tvenus.Bind(gl); gl.Sphere(Qvenus, 0.12f, 25, 25); gl.PopMatrix(); #endregion #region Земля gl.PushMatrix(); gl.Rotate(eath * day, 0, 1, 0);//Вокруг солнца gl.Translate(4, 0, 0); gl.Color(0.0f, 1.0f, 1.0f); Teath.Bind(gl); gl.Rotate(day * eathRP, 0, 1, 0); //вращение вокруг себя gl.PushMatrix(); gl.Rotate(-270, 0, 0); //Развернуть планету правильно к солнцу gl.Sphere(Qeath, 0.25f, 25, 25); gl.PopMatrix(); #region Луна gl.PushMatrix(); gl.Rotate((moon + moonRP) * day, 0, 1, 0);//Вращение луны Вокруг земли gl.Translate(0.5, 0, 0); gl.Color(0.5f, 0.5f, 0.5f); //drawSphere(0.06f, 15, 15);//Луна Tmoon.Bind(gl); gl.Sphere(Qmoon, 0.06f, 15, 15); gl.PopMatrix(); #endregion gl.PopMatrix(); #endregion #region Марс gl.PushMatrix(); gl.Rotate(mars * day, 0, 1, 0);//Вокруг солнца gl.Translate(5, 0, 0); gl.Color(0.7f, 0.1f, 0.1f, 0.01f); //gl.Rotate(rt, 0, 1, 0);//Вокруг себя //drawSphere(0.22f, 25, 25); Tmars.Bind(gl); gl.Rotate(day * marsRP, 0, 1, 0); //вращение вокруг себя gl.PushMatrix(); gl.Rotate(-270, 0, 0); //Развернуть планету правильно к солнцу gl.Sphere(Qmars, 0.22f, 25, 25); gl.PopMatrix(); gl.PopMatrix(); #endregion #region Юпитер gl.PushMatrix(); gl.Rotate(jupiter * day, 0, 1, 0);//Вокруг солнца gl.Translate(7, 0, 0); gl.Color(0.8235f, 0.7373f, 0.6824f, 1f); //gl.Rotate(rt, 0, 1, 0);//Вокруг себя //drawSphere(0.5f, 25, 25); Tjupiter.Bind(gl); gl.Rotate(day * jupiterRP, 0, 1, 0); //вращение вокруг себя gl.PushMatrix(); gl.Rotate(-270, 0, 0); //Вокруг себя gl.Sphere(Qjupiter, 0.5f, 25, 25); gl.PopMatrix(); float io_or = 1.77f; float europe_or = 3.55f; float ganimed_or = 7.15f; float calisto_or = 16.69f; //Орибиты юпитера #region Спутник ИО gl.PushMatrix(); gl.Rotate((jupiter + io_or) * day, 0, 0.5f, 0);//Вращение луны Вокруг земли gl.Translate(0.7, 0, 0); gl.Color(0.5f, 0.5f, 0.5f); //drawSphere(0.06f, 15, 15);//Луна //Tmoon.Bind(gl); IntPtr satellite = iniQuadric(); gl.Sphere(satellite, 0.03642f, 10, 10); gl.PopMatrix(); #endregion #region Спутник Европа gl.PushMatrix(); gl.Rotate((jupiter + europe_or) * day, 0, 0.5f, 0);//Вращение луны Вокруг земли gl.Translate(1, 0, 0); gl.Color(0.5f, 0.5f, 0.5f); //drawSphere(0.06f, 15, 15);//Луна //Tmoon.Bind(gl); satellite = iniQuadric(); gl.Sphere(satellite, 0.03122f, 10, 10); gl.PopMatrix(); #endregion #region Спутник Ганимед gl.PushMatrix(); gl.Rotate((jupiter + ganimed_or) * day, 0, 0.5f, 0);//Вращение луны Вокруг земли gl.Translate(1.5, 0, 0); gl.Color(0.5f, 0.5f, 0.5f); //drawSphere(0.06f, 15, 15);//Луна //Tmoon.Bind(gl); satellite = iniQuadric(); gl.Sphere(satellite, 0.0526f, 10, 10); gl.PopMatrix(); #endregion #region Спутник Каллисто gl.PushMatrix(); gl.Rotate((jupiter + calisto_or) * day, 0, 0.5f, 0);//Вращение луны Вокруг земли gl.Translate(1.9, 0, 0); gl.Color(0.5f, 0.5f, 0.5f); //drawSphere(0.06f, 15, 15);//Луна //Tmoon.Bind(gl); satellite = iniQuadric(); gl.Sphere(satellite, 0.0482f, 10, 10); gl.PopMatrix(); #endregion gl.PopMatrix(); #endregion #region Сатурн gl.PushMatrix(); gl.Rotate(saturn * day, 0, 1, 0);//Вокруг солнца gl.Translate(9, 0, 0); gl.Color(1f, 0.66f, 0.117f, 1.0f); //gl.Rotate(rt, 0, 1, 0);//Вокруг себя gl.Color(0.8824f, 0.7451f, 0.5451f, 1f); gl.Rotate(25, 0, 0); drawOrbit(0.9f); drawOrbit(0.85f); drawOrbit(0.75f); drawOrbit(0.65f); gl.Rotate(-25, 0, 0); //drawSphere(0.5f, 25, 25); Tsaturn.Bind(gl); gl.Rotate(day * saturnRP, 0, 1, 0); //вращение вокруг себя gl.PushMatrix(); gl.Rotate(-270, 0, 0); //Вокруг себя gl.Sphere(Qsaturn, 0.5f, 25, 25); gl.PopMatrix(); gl.PopMatrix(); #endregion #region Уран gl.PushMatrix(); gl.Rotate(uranus * day, 0, 1, 0);//Вокруг солнца gl.Translate(11, 0, 0); gl.Color(0.6196f, 0.7451f, 0.8314f, 1f); //gl.Rotate(rt, 0, 1, 0);//Вокруг себя //drawSphere(0.3f, 25, 25); Turanus.Bind(gl); gl.Sphere(Quranus, 0.3f, 25, 25); gl.PopMatrix(); #endregion #region Нептун gl.PushMatrix(); gl.Rotate(neptune * day, 0, 1, 0);//Вокруг солнца gl.Translate(13, 0, 0); gl.Color(0.4275f, 0.5451f, 0.7490f, 1f); //gl.Rotate(rt, 0, 1, 0);//Вокруг себя //drawSphere(0.3f, 30, 30); Tneptune.Bind(gl); gl.Sphere(Qneptune, 0.3f, 30, 30); gl.PopMatrix(); #endregion gl.PopMatrix(); #endregion gl.Disable(OpenGL.GL_LIGHT0);// gl.Disable(OpenGL.GL_LIGHTING); gl.Disable(OpenGL.GL_DEPTH_TEST); //gl.Disable(OpenGL.GL_TEXTURE_2D); if (!pause) { try { ///1 сек = 30 кадров(FrameRate), за 1 кадр прибовляем 6 часов ///1 секунда = 180 часов или 7 дней 5 часов к реальному маштабу day += hour * 6;//Добовляем по 6 часов } catch (Exception) { day = 0; } } }
private void openGLControl1_OpenGLDraw(object sender, RenderEventArgs args) { gl.Enable(OpenGL.GL_DEPTH_TEST); gl.DepthFunc(OpenGL.GL_LEQUAL); gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT); gl.MatrixMode(OpenGL.GL_MODELVIEW); gl.Enable(OpenGL.GL_TEXTURE_2D); #region Вращение камеры вокруг солнца if (rotate_cam) { float TimeDelta = 0.15f; gl.Rotate(rotate_cam_Angle * TimeDelta, 0, 1, 0); //Камеры rotate_cam_Angle += 1; //Добовляем 1 } else { rotate_cam_Angle = 0;//Если вращение отключеноь,то вовзращаемся в начальную позицию } #endregion #region Планета TPlanet.Bind(gl); //устанавливаем текстуру солнца gl.PushMatrix(); //отсутствие вращения gl.Rotate(planetDt * Planet, 0, 1, 0); //вращение солнца gl.Rotate(-5000, 0, 0); gl.Color(1f, 1f, 1f); //Цвет которым оно светит gl.Sphere(QPlanet, 3f, 40, 40); //Прорисовываем квадрик gl.PopMatrix(); #endregion #region Звезды Tstars.Bind(gl);//Текестура звезд gl.PointSize(1.5f); gl.Enable(OpenGL.GL_POINT_SMOOTH); gl.Begin(BeginMode.Points); for (int i = 0; i < n; i++) { //gl.Color(5f, 5f, 5f); gl.Color(colorGrey[i], colorGrey[i], colorGrey[i]); //gl.Color(cl_Grey, cl_Grey, cl_Grey); gl.Vertex(x[i], y[i], z[i]); } gl.End(); gl.Disable(OpenGL.GL_POINT_SMOOTH); #endregion initlighting();//Источник света gl.LoadIdentity(); gl.LookAt(0, view, 15, 0, 0, 0, 0, 1, 0); gl.Rotate(150, 1, 0, 0); #region Астероид //Вращение Астероида gl.PushMatrix(); gl.PushMatrix(); if (pause) { //gl.Translate(positionX, positionY, positionZ); gl.PushMatrix(); gl.PushMatrix(); //gl.Rotate(Asteroid * day, 0, 1, 0);//Вокруг планеты gl.Translate(positionX, positionY, positionZ); gl.Color(0.8235f, 0.7373f, 0.6824f, 1f); TAsteroid.Bind(gl); gl.Rotate(-5000, 0, 0);//Вокруг себя gl.Sphere(QAsteroid, 0.5f, 40, 50); gl.PopMatrix(); gl.PopMatrix(); } else { const float moonRP = 7.4194f; const float hour = 0.04167f; day += hour * 6; V = Math.Sqrt(p.vx * p.vx + p.vy * p.vy + p.vz * p.vz); normalVector_before = normalVector; double c = Math.Sqrt(p.x * p.x + p.y * p.y + p.z * p.z); if (c != 0) { normalVector = c; } if (normalVector > normalVector_before && b) { V = Math.Sqrt(p.vx * p.vx + p.vy * p.vy + p.vz * p.vz); double V1, V2; V1 = Math.Sqrt(gravity * planetMass / normalVector) * 1000000; V2 = Math.Sqrt(2 * gravity * planetMass / normalVector) * 1000000; if (V < V1) { koef = 1; } if (V > V1 && V < V2) { koef = 2; } if (V > V2) { koef = 3; } b = false; } switch (koef) { case 1: // окружность if (t__) { view = 30; t__ = false; } gl.PushMatrix(); gl.Rotate(moonRP * day, 0, 1, 1); //Вокруг солнца double g = Math.Sqrt(positionX * positionX + positionY * positionY + positionZ * positionZ); gl.Translate(positionX / g * 7, positionY / g * 7, positionZ / g * 7); gl.Color(0.8235f, 0.7373f, 0.6824f, 1f); TAsteroid.Bind(gl); gl.Sphere(QAsteroid, 1.12f, 25, 25); gl.PopMatrix(); break; case 2: // эллипс gl.PushMatrix(); gl.Rotate(moonRP * day, 0, 1, 1); //Вокруг солнца gl.Translate(positionX, positionY, positionZ); gl.Color(0.8235f, 0.7373f, 0.6824f, 1f); TAsteroid.Bind(gl); gl.Sphere(QAsteroid, 1.12f, 25, 25); gl.PopMatrix(); break; case 3: // все остальное p.x = positionX * distance; p.y = positionY * distance; p.z = positionZ * distance; CalcForces1(); MoveParticlesAndFreeForces(); //gl.Translate(p.x,p.y, p.z); double astPosX = p.x / normalVector * 10; double astPosY = p.y / normalVector * 10; double astPosZ = p.z / normalVector * 10; gl.Translate(astPosX, astPosY, astPosZ); // break; //} label26.Text = "p.x = " + p.x.ToString(); label27.Text = "p.vx = " + p.vx.ToString(); label28.Text = "f.x = " + f.x.ToString(); label29.Text = "p.x = " + p.x.ToString(); label30.Text = "p.y = " + p.y.ToString(); label31.Text = "p.z = " + p.z.ToString(); label32.Text = "distance = " + normalVector; label33.Text = "V = " + V; break; } gl.Color(0.8235f, 0.7373f, 0.6824f, 1f); TAsteroid.Bind(gl); gl.Rotate(-5000, 0, 0);//Вокруг себя gl.Sphere(QAsteroid, 0.5f, 40, 50); gl.PopMatrix(); gl.PopMatrix(); #endregion void CalcForces1() { double r = (1 / (p.x * p.x + p.y * p.y + p.z * p.z)); double r_1 = Math.Sqrt(r); double fabs = gravity * asteroidMass * planetMass * r; if (fabs < fmax) { f.x = fabs * p.x * r_1; f.y = fabs * p.y * r_1; f.z = fabs * p.z * r_1; } else { fabs = fmax; } } void MoveParticlesAndFreeForces() { double dvx = f.x * dt / asteroidMass; double dvy = f.y * dt / asteroidMass; double dvz = f.z * dt / asteroidMass; p.x += (p.vx + dvx / 2) * dt; p.y += (p.vy + dvy / 2) * dt; p.z += (p.vy + dvz / 2) * dt; p.vx += dvx; p.vy += dvy; p.vy += dvz; } gl.Disable(OpenGL.GL_LIGHT0); gl.Disable(OpenGL.GL_LIGHTING); gl.Disable(OpenGL.GL_DEPTH_TEST); gl.Disable(OpenGL.GL_TEXTURE_2D); if (!pause) { try { planetDt += hour * 6; } catch (Exception) { planetDt = 0; } } } }