/// <summary> /// моделируем планету /// </summary> /// <param name="pic">текстура</param> /// <param name="speed">скорость</param> /// <param name="remoteness">удаленность</param> /// <param name="radius">радиус</param> /// <param name="position">горизонально ровная позиция орбит планет</param> /// <param name="nx"></param> /// <param name="ny"></param> public CoordsPositions DrawPlanet(Bitmap pic, double speed, double rotateSpeed, double remoteness = 1.5, double radius = 0.2, double position = 238, int nx = 20, int ny = 20) { GLTexture.LoadTexture(pic); GL.Enable(EnableCap.Texture2D); GL.Enable(EnableCap.Light0); //освещение объектов GL.PushMatrix(); if (!viewFromAbove) { GL.Rotate(position, 1.0, 1.0, 1.0); } CoordsPositions coord = Sphere(radius, nx, ny, Math.Sin(speed) * remoteness, Math.Cos(speed) * remoteness, 0, rotateSpeed, true); GL.Begin(PrimitiveType.LineLoop); //GL.Vertex2(0.0f, 0.0f); //начальная позиция //Рисуем орбиту планеты вокруг солнца if (orbits) { float a = 0f; for (int i = 0; i <= 50; i++) { a = (float)i / 50.0f * 3.1415f * 2.0f; GL.Vertex2(Math.Sin(a) * remoteness, Math.Cos(a) * remoteness); } } GL.End(); GL.PopMatrix(); GL.Disable(EnableCap.Light0); GL.Disable(EnableCap.Texture2D); return(coord); }
/// <summary> /// Отрисовка сферы /// </summary> /// <param name="r">радиус</param> /// <param name="nx">Количество граней по горизонтали</param> /// <param name="ny">Количество граней по вертикали</param> /// <param name="sx">положение по координате X</param> /// <param name="sy">положение по координате Y</param> /// <param name="sz">положение по координате Z</param> /// <param name="speed">Скорость вращения вокруг своей оси</param> /// <param name="rotate_texture">вращать текстуру</param> public CoordsPositions Sphere(double r, int nx, int ny, double sx, double sy, double sz, double speed, bool rotate_texture = true) { int ix, iy; double x, y, z, tex_x, tex_y; for (iy = 0; iy < ny; ++iy) { tex_y = (double)iy / (double)ny; //начинаем рисовать четырехугольник GL.Begin(PrimitiveType.QuadStrip); for (ix = 0; ix <= nx; ++ix) { //вращение вокруг своей оси tex_x = (double)ix / (double)nx + (rotate_texture ? speed - Math.Floor(speed) : 0); x = r * Math.Sin(iy * Math.PI / ny) * Math.Cos(2 * ix * Math.PI / nx) + sx; y = r * Math.Sin(iy * Math.PI / ny) * Math.Sin(2 * ix * Math.PI / nx) + sy; z = r * Math.Cos(iy * Math.PI / ny) + sz; GL.Normal3(x, y, z); //нормаль направлена от центра GL.TexCoord2(tex_x, tex_y); //задаем координаты текстуры для вращения вокруг своей оси GL.Vertex3(x, y, z); //Задаем координаты точек //задаем координаты перемещения планет x = r * Math.Sin((iy + 1) * Math.PI / ny) * Math.Cos(2 * ix * Math.PI / nx) + sx; y = r * Math.Sin((iy + 1) * Math.PI / ny) * Math.Sin(2 * ix * Math.PI / nx) + sy; z = r * Math.Cos((iy + 1) * Math.PI / ny) + sz; GL.Normal3(x, y, z); GL.TexCoord2(tex_x, tex_y + 1.0 / (double)ny); GL.Vertex3(x, y, z); if (iy == 1 && ix == 1) { X = -x; } Y = -y; Z = -z; } GL.End(); } CoordsPositions coord = new CoordsPositions { X = X, Y = Y, Z = Z }; return(coord); }