простая программа - вид Земли с орбиты

Автор vnn, 11.05.2006 21:00:32

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

vnn

а никто не знает  простого способа включить в программу вид Земли  с орбиты для произвольных координат, т.е.  как бы это сделать на любом языке (С, С++, С*, FORTRAN, PASCAL, ...), но без ипользования специальных библиотек.

N2H4

Пишите на любом языке программу, которая показывает вид Земли с орбиты с произвольными параметрами. Потом указываете желаемые координаты и любуетесь.  :wink:
Это если без специальных библиотек.

vnn

ЦитироватьПишите на любом языке программу, которая показывает вид Земли с орбиты с произвольными параметрами. Потом указываете желаемые координаты и любуетесь.  :wink:
Это если без специальных библиотек.

Да велосипед не хочется изобретать, контуры материков вращать в 3D итд итп
Например, в IDL это встроено в среду программирования, задача ведь типичная - должно быть простое решение и для обычных языков программирования

N2H4

Так IDL, если это то о чем я подумал, пошел как раз из всяких ГИС задач, для него это может быть и типично.
А универсальные языки "(С, С++, С*, FORTRAN, PASCAL, ...)" создавались для более универсальных задач, типа более "простые" алгоритмы программировать. Поэтому для них крутить Землю в 3Д совсем не типично.
Вообщем либо ищите готовую библиотеку, либо пишите свою. А лучше используйте IDL раз там все встроено.

vnn

ЦитироватьТак IDL, если это то о чем я подумал, пошел как раз из всяких ГИС задач, для него это может быть и типично.
А универсальные языки "(С, С++, С*, FORTRAN, PASCAL, ...)" создавались для более универсальных задач, типа более "простые" алгоритмы программировать. Поэтому для них крутить Землю в 3Д совсем не типично.
Вообщем либо ищите готовую библиотеку, либо пишите свою. А лучше используйте IDL раз там все встроено.

IDL пошел от задач научной обработки поэтому в него много чего дополнительного встроено. Проблемма в том что это надо загнать soft в embedded среду где ничего кроме С и С++ нет. На мобильниках же крутят Землю - чтож все заново разрабатывают что ли

N2H4

А этот  IDL в C++ случайно свой код не транслирует?

vnn

ЦитироватьА этот  IDL в C++ случайно свой код не транслирует?
Вообще-то конверторы есть, но всякие штуки типа построения проекции Земли с определенными координатами - в закрытых библиотеках.

foogoo

Цитироватьа никто не знает  простого способа включить в программу вид Земли  с орбиты для произвольных координат, т.е.  как бы это сделать на любом языке (С, С++, С*, FORTRAN, PASCAL, ...), но без ипользования специальных библиотек.

Возмите J-Track с NASA. Он доступен в исходниках на JAVA.
http://science.nasa.gov/Realtime/JTrack/Spacecraft.html

http://science.nasa.gov/realtime/JTrack/FAQ.html
ЦитироватьIs the source code available?

    Yes and no.  You are welcome to request the source code through NASA's Technology Transfer program.  Visit http://nasasolutions.com for contact information.  Refer to J-Track and Patrick Meyer/FD42 when making the request.  Also, visit http://nexus.nasa.gov for more information.

N2H4

Значит не судьба, придется писать самому. Напишите свою библиотеку  и продавайте ее по спекулятивной цене  :) .

Подозреваю, что даже если найти какую-нибудь библиотеку под C++, то перевод ее во встраиваемый вариант без проблем не обойдется.  Ресурсы-то вся эта 3Д графика жрет не маленькие.

Andy_K64

Есть у нас такая программа. И самопальная библиотека. Все написано на Фортране. Протестирована, в основном, для орбит высотой 170-450 км, т.е. для орбитальных станций и кораблей. В понедельник вернется из командировки основной автор и держатель исходных кодов, спрошу его. Правда, там нет 3D прибамбасов, карта местности примитивная, хотя и достаточно точная.

Filas

Исходники на С можно взять из программы Celestia (http://www.shatters.net/celestia/index.html). Это программа с открытым кодом, так что пользуйтесь. Другое дело, что программа может гораздо больше и вам придется покопаться в поисках нужного кода.

Dio

Цитироватьа никто не знает простого способа включить в программу вид Земли с орбиты для произвольных координат, т.е. как бы это сделать на любом языке (С, С++, С*, FORTRAN, PASCAL, ...), но без ипользования специальных библиотек.
Поищите готовый COM контрол. Не может быть, чтобы никто не делал такого.

Если все-таки не найдется, можно создать модель для OGL при помощи программ, которые это умеют (вероятно, подойдет 3d studio или что-то аналогичное, плохо знаю эту механику) и работать дальше при помощи системной поддержки OGL, которая сейчас есть и в Win и в Ux. Относительно легко можно будет сделать вращение, освещение, всякие повороты и т.п., и все будет на высоком идейно-художественном уровне. Причем в среде Win такие программы трехмерного моделирования, уверен на 99%, поддерживают COM, т.е., на ура встраиваются в программу на С++ непосредственно.

Однако, во втором случае все не слишком просто. Я бы сказал, что месяцок на такие игры можно угробить легко.

Andy_K64

ЦитироватьПишите на любом языке программу, которая показывает вид Земли с орбиты с произвольными параметрами. Потом указываете желаемые координаты и любуетесь.  :wink:
Это если без специальных библиотек.
А что значит "с произвольными парамтерами"? А как эти параметры задаются? А задается направление линии визирования и наблюдаемое поле зрение?

Dio

ЦитироватьДа там два часа работы с отладкой :) . Это если не использовать опенгл и директ3д. С ними побольше, но будет быстрее.
Хотя нет, тоже два часа, проблемма потом это встроить в другую программу.
Если эту штуку предполагается кудато встраивать, то лучше написать рей-трассер. Для небольших окон работать будет достаточно быстро.
Даже не знаю, что и сказать. У меня другой профиль. Мне кажется, что тут только задание модели может занять приличное время, в зависимости от обстоятельств.

Dio

Цитировать
ЦитироватьМне кажется, что тут только задание модели может занять приличное время, в зависимости от обстоятельств.
Да ну, какя модель? Земли? Она не нужна. Берем текстуру с поверхностью Земли. И строим две матрицы. Одна отображает кородинаты с текстуры на сферу. Вторая со сферы на плоскость(окно).
Если имеется ввиду модель движения по орбите, то этого вроде не требуется. Хотя тоже проблемма не великая.
Это не 3D, однако.
Потом, даже в этом случае при построении проекции надо учитывать ориенировку камеры, ее параметры и (наверное, желательно) положение Солнца. От пяти степеней свободы, преобразование будет довольно длинным, а его еще выписать надо.

ДмитрийК

Все правильно. Поскольку объект один и весьма простой формы, все делается с пол-пинка :)

Для каждого пиксела в окне сначала проверяем попадает ли он в круг. Если нет то пропускаем, если совсем близко к краю то вычисляем альфу (для анти-алиасинга), иначе альфу ставим в единицу. Затем считаем широту и долготу где луч зрения пересекается с шаром, переводим в координаты текстуры, интерполируем, умножаем на альфу. Затем берем текстуру рельефа, подобным же образом интерполируем, считаем градиенты, соответственно получаем вектор нормали в этой точке. Поворачиваем его в пространстве в соответствии в широтой и долготой, определяем угол между ним и направлением на солнце. Если блоьше 180 то берем текстуру ночной стороны, иначе считаем скалярное произведение между отраженным вектором и лучом зрения, в соответствии с ним подмешиваем желто-белого (чтобы блик от солнца сделать). По хорошему для этого еще одну текстуру надо взять с коэффицентами спекулярного отражения потому как вода и снег больше блестят. Еще считаем угол между нормалью к поверхности шара и лучом зрения и соответственно подмешиваем бело-голубого, чтобы атмосферную дымку добавить.

Вот и всего делов-то :) Ничего не забыл? Ах да, еще самый край атмосферы сделать и облака намотать :)

Dio

ЦитироватьВсе правильно. Поскольку объект один и весьма простой формы, все делается с пол-пинка :)
Я бы не назвал Землю объектом простой формы.

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

Опять же, если я все правильно понял, это не будет работать, если высота съемки не специально велика, а фокусное расстояние объектива не специально мало. Т.е., это все же более-менее 2D на сфере, а не реальное 3D.

Впрочем, я действительно малосведущ в этих делах и могу страшно заблуждаться.

goran d

esli podhodit GPL biblioteka mojno izpolzavat urezanuyu mesagl (eto openGL) no v opnengl tojhe ne malo koda nado pisat
drugaia mini opengl biblioteka - tinygl

ДмитрийК

ЦитироватьВ 1000 строк кода (на С++) предложенная-то схема уложится, ежели с 0?
Должна, куды она денется.
ЦитироватьКакие уж тут 2 часа или пол-пинка, к чему такой оптимизм?
А там смайлик стоит :)
А если серьезно то в простейшем варианте (грубо, без интерполяции, освешения и пр.), получится всего строчек 10-20. Надо "всего-лишь" посчитать обратную перспективную проекцию для сферы. Ну да, будет там синус на косинусе сидеть и арктангенсом погонять :) ну вот на это час, час на все остальное :)
Разумеется в OpenGL это все само собой получается, а может можно и готовый COM-control или applet  найти но автор же попросил  embedded.

ЦитироватьОпять же, если я все правильно понял, это не будет работать, если высота съемки не специально велика, а фокусное расстояние объектива не специально мало.
Сказано же - "вид с орбиты". Этож какое "не специально малое" фокусное расстояние должно быть :)

X

Нарисовать с помощью OpenGL или Direct 3D сферу и натянуть на нее битмап с картой Земли действительно очень просто.
Рекомендую, однако:
http://www.shatters.net/celestia
3D-модель Солнечной системы и beyond очень хорошего качества на основе OpenGL. Хорошая поддержка больших текстур. Атмосферы, облака, тени, звезды, туманности и прочая, прочая, прочая. Импорт и отображение пользовательских объектов (всякие КА, астероиды и проч.), поддерживается формат 3DS. Открытый проект, все исходные тексты доступны. Большая коллекция объектов, много соучастников проекта. Используется в ESTEC как стандарт для задач визуализации.
Это решение, конечно, не простое, но доступное (бесплатное, правда некоторые авторы пытаются продавать свои плагины и объекты), высокого качества и легко приспосабливаемое к конкретным задачам.