Код:
#include <iostream>
#include<glut.h>
#include <windows.h>
#include <stdio.h>
#pragma warning(disable : 4996)
using namespace std;
const double G = 6.67 * pow(10, -11);
const double M = 5.97 * pow(10, 24), R = 6.37 * pow(10, 6);
const double pi = 3.1415926535;
double hzp;
float omega, T1, v;
GLfloat rx = 0; // Угол поворта сцены вокруг оси X
GLfloat ry = 0; // Угол поворта сцены вокруг оси Y
int mx, my; // Координаты мыши
bool ldown = false; // Нажата левая клавиша мыши?
bool rdown = false; // Нажата правая клавиша мыши?
GLuint list = 0;
float angle;
void speed()
{
// double omega = 0;
cout << "hzp=";
cin >> hzp;
omega = sqrt(G * M / pow((R + hzp), 3));
cout << "omega = " << omega << endl;
T1 = 2 * pi / omega;
cout << "T=" << T1 / 3600 << endl;
v = omega * (R + hzp);
cout << "v=" << v << endl;
}
void Init() // Инициализация OpenGL
{
glClearColor(0.5, 0.5, 0.75, 1); // Цвет фона
glEnable(GL_LIGHTING); // Включаем расчёт освещения
glEnable(GL_LIGHT0); // Включаем первый источник света
// Настраиваем источник света GL_LIGHT0
float light_ambient[4] = { 0.5, 0.5, 0, 0 };
float light_diffuse[4] = { 1.0,1.0,1.0,1.0 };
float light_specular[4] = { 0.0,1.0,0.0,1.0 };
float light_position[4] = { 1.0,1.0,1.0,0.2 };
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glEnable(GL_NORMALIZE); //делаем нормали одинаковой величины во избежание артефактов
glEnable(GL_DEPTH_TEST);
glEnable(GL_COLOR_MATERIAL);
glPopMatrix();
}
void Display() // Вывод изображения на экран
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
list = glGenLists(1);
glNewList(list, GL_COMPILE); //Создание дисплейного списка объекта (чайника)
glutSolidSphere(0.25, 30, 30);
glPushMatrix();//Сохраняем координаты первой сферы
glColor3f(0.3, 0.5, 0.9);//задаём цвет второй сферы
glTranslated(0.25 * (hzp + R) / R, 0.0, 0.0);//Сдвиг на 0.7 по оси x
glTranslated(-0.25 * (hzp + R) / R, 0.0, 0.0);//Перевод камеры в исходное положение
glRotatef(angle, 0.0, 0.0, 1.0);//Поворот вокруг начала координат
glTranslated(0.25 * (hzp + R) / R, 0.0, 0.0);//перевод камеры назад
glutSolidSphere(0.05, 50, 50);
glEndList();
glPushMatrix();
glRotatef(rx, 1, 0, 0);
glRotatef(ry, 0, 1, 0);
glCallList(list); // Вывод объекта на экран
glPopMatrix();
glutSwapBuffers(); // Смена переднего и заднего буферов экрана
}
void timer(int value)
{
glutTimerFunc(10, timer, 0);
Display();
angle++;
glRotatef(0.0, 0.0, 0.0, 1.0);
glutPostRedisplay();
}
void Mouse(int button, int state, int x, int y) //Обработка щелчков мыши
{
if (button == GLUT_LEFT_BUTTON) //Левая кнопка
{
switch (state)
{
case GLUT_DOWN: //Если нажата
ldown = true; //установить флаг
mx = x; //Запомнить координаты
my = y;
break;
case GLUT_UP:
ldown = false;
break;
}
}
}
void MouseMotion(int x, int y) //Перемешение мыши
{
if (ldown) // Левая кнопка
{
rx += 0.5 * (y - my); //Изменение угола поворота
ry += 0.5 * (x - mx);
mx = x;
my = y;
glutPostRedisplay(); //Перерисовать экран
}
}
void MousePassiveMotion(int x, int y)
{
char buf[80];
sprintf(buf, "Mouse coords is: x=%d; y=%d", x, y);
glutSetWindowTitle(buf);
}
int main(int argc, char* argv[])
{
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); // Задаём параметры окна
glutCreateWindow("GLUT Teapot"); // Создём окно
Init();
// Задаём функцию обратного вызова вывода изображения на экран
glutDisplayFunc(Display);
glutPassiveMotionFunc(MousePassiveMotion); // Обработчик перемещений грызуна при отжатой кнопке мыши
glutMotionFunc(MouseMotion); // Обработчик перемещений грызуна при зажатой кнопке мыши
glutMouseFunc(Mouse);
glutTimerFunc(10, timer, 0);
speed();
glutMainLoop();
return 0;
}
Чет вообще не понимаю с этими текстурами. Нужно на главную сферу наложить текстуры Земли. Не знаю с чего даже начать и можно ли вообще на такую сферу наложить или по вершинам придется перестраивать.