Russian Qt Forum
Сентябрь 30, 2024, 12:29 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: 3D планеты, помогите новичку  (Прочитано 14777 раз)
spirits25
Гость
« : Октябрь 01, 2010, 20:09 »

Проблема в том, что графикой ранее не занимался, но "неожиданно" (как это обычно и бывает=)) понадобилось в гуи проекте вставить окошко с графикой. всё прошло нормально, кроме самой графики. необходимо отобразить планету (собственно Земля), спутник, Луну и Солнце, причём всё это желательно должно вращаться вокруг Земли. параметры орбиты спутника задаются кеплеровской шестёркой координат. Луна и Солнце вращаются по кругу относительно Земли. На планеты наложены простые текстуры. За любую помощь буду благодарен. Ранее уже получал советы из разряда "юзай glut", но проблема в том, что моё основное внимание уделено мат.расчётам (а именно влиянию различных параметров на изменение орбиты).
Посему, если кто обладает исходниками, знаниями, советами - заранее спасибо=)
« Последнее редактирование: Август 24, 2012, 12:31 от spirits25 » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Октябрь 01, 2010, 22:00 »

Мне кажется что гораздо проще (и намного полезнее) сделать это руками вместо чтобы забивать голову изучением OpenGL. Нужно немного:

- понятие про камеру/перспективу (ну или еще проще в изометрии)
- уметь находить пересечение луча со сферой (в рамках школьной программы)
- формулы сферического наложения текстуры (я подскажу когда дело до этого дойдет)
- ну и помножить на диффузный косинус (расчет света)

Ото и все 
Записан
vipet
Бывалый
*****
Offline Offline

Сообщений: 452


Просмотр профиля
« Ответ #2 : Октябрь 01, 2010, 23:03 »

Поддерживаю предыдущего оратора. Не надо заморачиваться с лишними либами.

Юзай QGraphicsView/QGraphicsScene + State Machine Framework (чтобы крутилось все красиво)
Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #3 : Октябрь 02, 2010, 01:37 »

Цитировать
что графикой ранее не занимался....  необходимо отобразить планету (собственно Земля), спутник, Луну и Солнце... На планеты наложены простые текстуры

Не надо заморачиваться с лишними либами.
...
Юзай QGraphicsView/QGraphicsScene

хохо ну и советы... и сделает он это за полтора дня.. и тормозить это ниразу не будет...

Мне кажется OpenGL тут однозначно. Ну или тогда уж спрайтики рисовать QPainter'ом...
Записан

Гугль в помощь
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Октябрь 02, 2010, 11:24 »

хохо ну и советы... и сделает он это за полтора дня.. и тормозить это ниразу не будет...

Мне кажется OpenGL тут однозначно. Ну или тогда уж спрайтики рисовать QPainter'ом...
OpenGL часто неизбежен, но у человека случай специфический - по существу ему полигоны не нужны. Гораздо быстрее найти пересечение луча со сферой чем молотить тонны полигонов. Так что не исключено что ручная реализация обгонит крутой GPU  Улыбающийся  Другое дело тут надо думать, а не либы прикручивать. Ну это уж кому как.
Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #5 : Октябрь 03, 2010, 00:32 »

Цитировать
OpenGL часто неизбежен, но у человека случай специфический - по существу ему полигоны не нужны. Гораздо быстрее найти пересечение луча со сферой чем молотить тонны полигонов.
Предлагаешь ему трассировку лучей забацать?

Цитировать
Так что не исключено что ручная реализация обгонит крутой GPU  Улыбающийся
Вот уж не думаю... судя по демкам с трассировкой 320x200 почти не тормозит Веселый
Записан

Гугль в помощь
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Октябрь 03, 2010, 11:51 »

Предлагаешь ему трассировку лучей забацать?
А что здесь бацать? Это не BSP строить, тут "только сферы". Берем пиксель, x, y есть. z = фокальному расстоянию. Луч готов. Центры сфер и радиусы известны. Для каждой решаем квадратное уравнение (изучалось в 6-м классе). Выбираем ближайшее пересечение по лучу. Шейдим пиксель, берем следующий. Так же легко получаются др. эффекты, напр. сферы могут бросать тень друг на друга. Или планета может иметь атмосферу (показать ободок). Или сияние (glow).

Ну конечно все это пригодно только для сфер. Если напр. потребуется космический корабль - придется запрягать OpenGL, то да
Записан
spirits25
Гость
« Ответ #7 : Октябрь 03, 2010, 13:56 »

Спутник точно будет не сфера, хоть и очень близкое к ней. Так что в итоге посоветуете? нужно простое отображение без "особой крутости и красоты"=) главное в программе чтобы траектория менялась в зависимости от изменения параметров орбиты.
Записан
ufna
Гость
« Ответ #8 : Октябрь 03, 2010, 14:03 »

а вид нужен именно 3д, чтобы можно было сцену вращать?
Записан
spirits25
Гость
« Ответ #9 : Октябрь 03, 2010, 15:21 »

да, с простым объектом у меня получилось. Вот например 3D пирамиду (которую можно вращать относительно всех 3-х осей) я в гуи окно нормально поместил.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Октябрь 03, 2010, 16:36 »

Спутник точно будет не сфера, хоть и очень близкое к ней.
А что? Если напр сфероид (сплюснутая сфера) то нет проблем,

((x - cx) * (x - cx)) / (a * a) + ((y - cy) * (y - cy)) / (b * b) + ((z - cz) * (z - cz)) / (c * c) = 1;
 //  поверхность сфероида, a, b, c - размеры по осям, cx, cy, cz - координаты центра

Задан луч 3 числа (rx, ry, rz), значит точку пересечения (x, y, z) можно записать как

x = rx * d;
y = ry * d;
z = rz * d;

Где d = расстояние вдоль луча. Подставляем эти (x, y, z) в уравнение сфероида, находим d как 2 корня получившегося квадратного уравнения. Это расстояния по лучу с передней и задней стенками сфероида

Так что в итоге посоветуете?
Как уже говорилось, с более сложными объектами придется привлекать OpenGL. А так - смотрите сами что Вам больше нравится
Записан
spirits25
Гость
« Ответ #11 : Октябрь 03, 2010, 17:58 »

хорошо, буду разбираться=) начну с рисования сферы Земли.
Может сразу подскажите как это с помощью openGL делается?=)
Записан
spirits25
Гость
« Ответ #12 : Октябрь 03, 2010, 19:17 »

вот код нашёл

//=== Команды OpenGL для изображения одного треугольника
void Graphics::setTria (double *v1, double *v2, double *v3)
{
//====== Нормаль и вершина задаются одним вектором
glNormal3dv(v1);
glVertex3dv(v1);
glNormal3dv (v2);
glVertex3dv(v2);
glNormal3dv(v3);
glVertex3dv(v3);
glEnd() ;
}

//====== Генерация внутренних треугольников

void Graphics::Split(double *v1, double *v2, double *v3)
{
//====== Промежуточные вершины
double v12[3], v23[3], v31[3];

for ( int i=0; i< 3; i++) {
//====== Можно не делить пополам,
//====== так как будем нормировать
v12 = v1+v2;
v23 = v2+v3;
v31 = v3+v1 ;
}

//====== Нормируем три новые вершины
scale(v12);
scale(v23);
scale(v31);
//====== и рисуем четыре треугольника
setTria(v1, v12, v31);
setTria (v2, v23, v12);
setTria(v3, v31, v23);
setTria(v12,v23, v31);
}

void Graphics::DrawScene()
{
static double angle = 3.0 * atan(1.0)/2.5, V = cos (angle), W = sin (angle),
v[12] [3] =
{{-V,0.,W}, {V,0.,W}, {-V,0.,-W},
 {V,0.,-W}, {0.,W,V}, {0.,W,-V},
 {0.,-W,V}, {0.,-W,-V}, {W,V,0.},
{-W,V,0.}, {W,-V,0.}, {-W,-V,0.}
};

static GLuint id[20][3] =
{
{0,1, 4}, {0,4, 9}, {9,4, 5}, {4,8, 5}, {4,1,8},
{8,1,10}, {8,10,3}, {5,8, 3}, {5,3, 2}, {2,3,7},
{7,3,10}, {7,10,6}, {7,6,11}, {11,6,0}, {0,6,1},
{6,10,1}, {9,11,0}, {9,2,11}, {9,5, 2}, {7,11,2}
};
glNewList(1,GL_COMPILE);
glColor3d (1., 0.4, 1.) ;
glBegin(GL_TRIANGLES);
for (int i = 0; i < 20; i++)
Split (v[id
  • ], v[id[1]], v[id [2] ]);
glEnd();
glEndList () ;
}

но тут scale с одним параметром и не работает поэтому.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #13 : Октябрь 03, 2010, 19:43 »

вот код нашёл
Хмм... ну вообще-то с OpenGL в первый раз надо хотя бы недельку "маны покурить" (как говорит молодежь). Там надо довольно много знать, это нормально. Кстати там есть ф-ция для создания сферы.

//=== Команды OpenGL для изображения одного треугольника
void Graphics::setTria (double *v1, double *v2, double *v3)
Для 3D есть одна "народная примета" как отличить хороший пример на С++ от плохого: просто смотрите как реализован класс "3D точка". Если его вообще нет, то смело бросайте этот пример в trash, ничего хорошего Вы в нем не найдете.
Записан
spirits25
Гость
« Ответ #14 : Октябрь 03, 2010, 20:04 »

Цитировать
Кстати там есть ф-ция для создания сферы.
не подскажете? вся проблема в том, что этого времени нет. Да и openGL меня интересует в самой меньшей степени, так как дальше им заниматься не собираюсь (другие планы). Просто пришлось по теме диплома его использовать. Если сможете помочь, буду признателен. только не надо заставлять учить, было бы время и желание - так бы и сделал=)
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.129 секунд. Запросов: 23.