Russian Qt Forum
Ноябрь 01, 2024, 03:13
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
2D и 3D графика
>
3D планеты, помогите новичку
Страниц: [
1
]
2
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: 3D планеты, помогите новичку (Прочитано 14833 раз)
spirits25
Гость
3D планеты, помогите новичку
«
:
Октябрь 01, 2010, 20:09 »
Проблема в том, что графикой ранее не занимался, но "неожиданно" (как это обычно и бывает=)) понадобилось в гуи проекте вставить окошко с графикой. всё прошло нормально, кроме самой графики. необходимо отобразить планету (собственно Земля), спутник, Луну и Солнце, причём всё это
желательно
должно вращаться вокруг Земли. параметры орбиты спутника задаются кеплеровской шестёркой координат. Луна и Солнце вращаются по кругу относительно Земли. На планеты наложены простые текстуры. За любую помощь буду благодарен. Ранее уже получал советы из разряда "юзай glut", но проблема в том, что моё основное внимание уделено мат.расчётам (а именно влиянию различных параметров на изменение орбиты).
Посему, если кто обладает исходниками, знаниями, советами - заранее спасибо=)
«
Последнее редактирование: Август 24, 2012, 12:31 от spirits25
»
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: 3D планеты, помогите новичку
«
Ответ #1 :
Октябрь 01, 2010, 22:00 »
Мне кажется что гораздо проще (и намного полезнее) сделать это руками вместо чтобы забивать голову изучением OpenGL. Нужно немного:
- понятие про камеру/перспективу (ну или еще проще в изометрии)
- уметь находить пересечение луча со сферой (в рамках школьной программы)
- формулы сферического наложения текстуры (я подскажу когда дело до этого дойдет)
- ну и помножить на диффузный косинус (расчет света)
Ото и все
Записан
vipet
Бывалый
Offline
Сообщений: 452
Re: 3D планеты, помогите новичку
«
Ответ #2 :
Октябрь 01, 2010, 23:03 »
Поддерживаю предыдущего оратора. Не надо заморачиваться с лишними либами.
Юзай QGraphicsView/QGraphicsScene + State Machine Framework (чтобы крутилось все красиво)
Записан
navrocky
Гипер активный житель
Offline
Сообщений: 817
Погроммист
Re: 3D планеты, помогите новичку
«
Ответ #3 :
Октябрь 02, 2010, 01:37 »
Цитировать
что графикой ранее не занимался.... необходимо отобразить планету (собственно Земля), спутник, Луну и Солнце... На планеты наложены простые текстуры
Цитата: vipet от Октябрь 01, 2010, 23:03
Не надо заморачиваться с лишними либами.
...
Юзай QGraphicsView/QGraphicsScene
хохо ну и советы... и сделает он это за полтора дня.. и тормозить это ниразу не будет...
Мне кажется OpenGL тут однозначно. Ну или тогда уж спрайтики рисовать QPainter'ом...
Записан
Гугль в помощь
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: 3D планеты, помогите новичку
«
Ответ #4 :
Октябрь 02, 2010, 11:24 »
Цитата: navrocky от Октябрь 02, 2010, 01:37
хохо ну и советы... и сделает он это за полтора дня.. и тормозить это ниразу не будет...
Мне кажется OpenGL тут однозначно. Ну или тогда уж спрайтики рисовать QPainter'ом...
OpenGL часто неизбежен, но у человека случай специфический - по существу ему полигоны не нужны. Гораздо быстрее найти пересечение луча со сферой чем молотить тонны полигонов. Так что не исключено что ручная реализация обгонит крутой GPU
Другое дело тут надо думать, а не либы прикручивать. Ну это уж кому как.
Записан
navrocky
Гипер активный житель
Offline
Сообщений: 817
Погроммист
Re: 3D планеты, помогите новичку
«
Ответ #5 :
Октябрь 03, 2010, 00:32 »
Цитировать
OpenGL часто неизбежен, но у человека случай специфический - по существу ему полигоны не нужны. Гораздо быстрее найти пересечение луча со сферой чем молотить тонны полигонов.
Предлагаешь ему трассировку лучей забацать?
Цитировать
Так что не исключено что ручная реализация обгонит крутой GPU
Вот уж не думаю... судя по демкам с трассировкой 320x200 почти не тормозит
Записан
Гугль в помощь
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: 3D планеты, помогите новичку
«
Ответ #6 :
Октябрь 03, 2010, 11:51 »
Цитата: navrocky от Октябрь 03, 2010, 00:32
Предлагаешь ему трассировку лучей забацать?
А что здесь бацать? Это не BSP строить, тут "только сферы". Берем пиксель, x, y есть. z = фокальному расстоянию. Луч готов. Центры сфер и радиусы известны. Для каждой решаем квадратное уравнение (изучалось в 6-м классе). Выбираем ближайшее пересечение по лучу. Шейдим пиксель, берем следующий. Так же легко получаются др. эффекты, напр. сферы могут бросать тень друг на друга. Или планета может иметь атмосферу (показать ободок). Или сияние (glow).
Ну конечно все это пригодно только для сфер. Если напр. потребуется космический корабль - придется запрягать OpenGL, то да
Записан
spirits25
Гость
Re: 3D планеты, помогите новичку
«
Ответ #7 :
Октябрь 03, 2010, 13:56 »
Спутник точно будет не сфера, хоть и очень близкое к ней. Так что в итоге посоветуете? нужно простое отображение без "особой крутости и красоты"=) главное в программе чтобы траектория менялась в зависимости от изменения параметров орбиты.
Записан
ufna
Гость
Re: 3D планеты, помогите новичку
«
Ответ #8 :
Октябрь 03, 2010, 14:03 »
а вид нужен именно 3д, чтобы можно было сцену вращать?
Записан
spirits25
Гость
Re: 3D планеты, помогите новичку
«
Ответ #9 :
Октябрь 03, 2010, 15:21 »
да, с простым объектом у меня получилось. Вот например 3D пирамиду (которую можно вращать относительно всех 3-х осей) я в гуи окно нормально поместил.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: 3D планеты, помогите новичку
«
Ответ #10 :
Октябрь 03, 2010, 16:36 »
Цитата: spirits25 от Октябрь 03, 2010, 13:56
Спутник точно будет не сфера, хоть и очень близкое к ней.
А что? Если напр сфероид (сплюснутая сфера) то нет проблем,
((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 корня получившегося квадратного уравнения. Это расстояния по лучу с передней и задней стенками сфероида
Цитата: spirits25 от Октябрь 03, 2010, 13:56
Так что в итоге посоветуете?
Как уже говорилось, с более сложными объектами придется привлекать OpenGL. А так - смотрите сами что Вам больше нравится
Записан
spirits25
Гость
Re: 3D планеты, помогите новичку
«
Ответ #11 :
Октябрь 03, 2010, 17:58 »
хорошо, буду разбираться=) начну с рисования сферы Земли.
Может сразу подскажите как это с помощью openGL делается?=)
Записан
spirits25
Гость
Re: 3D планеты, помогите новичку
«
Ответ #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
Сообщений: 11445
Re: 3D планеты, помогите новичку
«
Ответ #13 :
Октябрь 03, 2010, 19:43 »
Цитата: spirits25 от Октябрь 03, 2010, 19:17
вот код нашёл
Хмм... ну вообще-то с OpenGL в первый раз надо хотя бы недельку "маны покурить" (как говорит молодежь). Там надо довольно много знать, это нормально. Кстати там есть ф-ция для создания сферы.
Цитата: spirits25 от Октябрь 03, 2010, 19:17
//=== Команды OpenGL для изображения одного треугольника
void Graphics::setTria (double *v1, double *v2, double *v3)
Для 3D есть одна "народная примета" как отличить хороший пример на С++ от плохого: просто смотрите как реализован класс "3D точка". Если его вообще нет, то смело бросайте этот пример в trash, ничего хорошего Вы в нем не найдете.
Записан
spirits25
Гость
Re: 3D планеты, помогите новичку
«
Ответ #14 :
Октябрь 03, 2010, 20:04 »
Цитировать
Кстати там есть ф-ция для создания сферы.
не подскажете? вся проблема в том, что этого времени нет. Да и openGL меня интересует в самой меньшей степени, так как дальше им заниматься не собираюсь (другие планы). Просто пришлось по теме диплома его использовать. Если сможете помочь, буду признателен. только не надо заставлять учить, было бы время и желание - так бы и сделал=)
Записан
Страниц: [
1
]
2
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...