示例#1
0
文件: Form1.cs 项目: lif0/SolarSystem
        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;
                }
            }
        }
示例#2
0
文件: Form1.cs 项目: Voronik1801/Fiz
        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;
                    }
                }
            }
        }