glosm - 3D рендер для OpenStreetMap

AMDmi3,

А если, к примеру, мосту/виадуку проставить height и min_height - будут ли они отрисовываться как объёмная дорожка, висящая в воздухе? Можно ли это добавить, если не будет?

П.С. Запостил в карту, жду выгрузку для проверки…

Сделал выгрузку через экспорт отсюда: http://osm.org/go/5@OzCD9O

Валится в корку:

Starting program: /home/serega/glosm/glosm/viewer/glosm-viewer /tmp/map.osm
Loading…
Loaded XML in 0.050 seconds

Program received signal SIGSEGV, Segmentation fault.
0xb7f9a040 in std::_List_const_iterator<Vector2 >::operator++ (this=0xbfffe524) at /usr/lib/gcc/i686-pc-linux-gnu/4.4.3/include/g+±v4/bits/stl_list.h:223
223 _M_node = _M_node->_M_next;
(gdb) bt full
#0 0xb7f9a040 in std::_List_const_iterator<Vector2 >::operator++ (this=0xbfffe524) at /usr/lib/gcc/i686-pc-linux-gnu/4.4.3/include/g+±v4/bits/stl_list.h:223
No locals.
#1 0xb7f94454 in CreateSmartVerticalLines (geom=…, vertices=…, minz=0, maxz=12000, minslope=5, way=…) at /home/serega/glosm/glosm/libgeomgen-default/src/DefaultGeometryGenerator.cc:91
i = {_M_node = 0x8135510}
prev = {_M_node = 0xbfffe630}
next = {_M_node = 0x0}
cosminslope = 0.99619469809174555
#2 0xb7f994b2 in WayDispatcher (geom=…, datasource=…, way=…) at /home/serega/glosm/glosm/libgeomgen-default/src/DefaultGeometryGenerator.cc:516
minz = 0
maxz = 12000
t = {_M_node = 0x0}
vertices = {<std::_List_base<Vector2, std::allocator<Vector2 > >> = {
_M_impl = {<std::allocator<std::_List_node<Vector2 > >> = {<__gnu_cxx::new_allocator<std::_List_node<Vector2 > >> = {}, }, _M_node = {_M_next = 0x8135510,
_M_prev = 0x8127ca8}}}, }
#3 0xb7f99a72 in DefaultGeometryGenerator::GetGeometry (this=0xbfffe918, geom=…, bbox=…) at /home/serega/glosm/glosm/libgeomgen-default/src/DefaultGeometryGenerator.cc:553
w = {_M_current = 0x8149640}
ways = {<std::_Vector_base<OsmDatasource::Way, std::allocatorOsmDatasource::Way >> = {
_M_impl = {<std::allocatorOsmDatasource::Way> = {<__gnu_cxx::new_allocatorOsmDatasource::Way> = {}, }, _M_start = 0x8144e60, _M_finish = 0x814aae0,
M_end_of_storage = 0x814ee60}}, }
temp = {lines
= {<std::_Vector_base<Vector3, std::allocator<Vector3 > >> = {
_M_impl = {<std::allocator<Vector3 >> = {<__gnu_cxx::new_allocator<Vector3 >> = {}, }, _M_start = 0x8194518, _M_finish = 0x81a4460,
M_end_of_storage = 0x81ac518}}, }, triangles = {<std::_Vector_base<Vector3, std::allocator<Vector3 > >> = {
_M_impl = {<std::allocator<Vector3 >> = {<__gnu_cxx::new_allocator<Vector3 >> = {}, }, _M_start = 0x813e9d8, _M_finish = 0x81412c4,
M_end_of_storage = 0x81419d8}}, }, quads = {<std::_Vector_base<Vector3, std::allocator<Vector3 > >> = {
_M_impl = {<std::allocator<Vector3 >> = {<__gnu_cxx::new_allocator<Vector3 >> = {}, }, _M_start = 0x817c510, _M_finish = 0x818fbc0,
M_end_of_storage = 0x8194510}}, }}
#4 0xb7fd75de in GeometryTile (this=0xbfffe8f8, projection=…, ds=…, ref=…, bbox=…) at /home/serega/glosm/glosm/libglosm-client/src/GeometryTile.cc:37
g = {lines
= {<std::_Vector_base<Vector3, std::allocator<Vector3 > >> = {
_M_impl = {<std::allocator<Vector3 >> = {<__gnu_cxx::new_allocator<Vector3 >> = {}, }, _M_start = 0x0, _M_finish = 0x0,
M_end_of_storage = 0x0}}, }, triangles = {<std::_Vector_base<Vector3, std::allocator<Vector3 > >> = {
_M_impl = {<std::allocator<Vector3 >> = {<__gnu_cxx::new_allocator<Vector3 >> = {}, }, _M_start = 0x0, _M_finish = 0x0,
M_end_of_storage = 0x0}}, }, quads = {<std::_Vector_base<Vector3, std::allocator<Vector3 > >> = {
_M_impl = {<std::allocator<Vector3 >> = {<__gnu_cxx::new_allocator<Vector3 >> = {}, }, _M_start = 0x0, _M_finish = 0x0,
_M_end_of_storage = 0x0}}, }}
translated = {<std::_Vector_base<Vector3, std::allocator<Vector3 > >> = {
_M_impl = {<std::allocator<Vector3 >> = {<__gnu_cxx::new_allocator<Vector3 >> = {}, }, _M_start = 0x0, _M_finish = 0x1,
_M_end_of_storage = 0x1}}, }
#5 0xb7fd6c90 in GeometryLayer (this=0xbfffe8f4, projection=…, datasource=…) at /home/serega/glosm/glosm/libglosm-client/src/GeometryLayer.cc:32
No locals.
#6 0x0804a22c in real_main (argc=2, argv=0xbfffea34) at /home/serega/glosm/glosm/viewer/Main.cc:238
osm_datasource = { = {vptr.OsmDatasource = 0xb7fcde08}, = {}, nodes = {_vptr.id_map = 0xb7fcde50, static chunk_size = 1048576, nbuckets = 2048,
buckets = 0x807ebb0, count = 3567,
chunks = {<std::_Vector_base<id_map<unsigned int, OsmDatasource::Node, 0, 1, 1048576>::hash_node*, std::allocator<id_map<unsigned int, OsmDatasource::Node, 0, 1, 1048576>::hash_node*> >> = {
_M_impl = {<std::allocator<id_map<unsigned int, OsmDatasource::Node, 0, 1, 1048576>::hash_node*>> = {<__gnu_cxx::new_allocator<id_map<unsigned int, OsmDatasource::Node, 0, 1, 1048576>::hash_node*>> = {}, }, _M_start = 0x8073118, _M_finish = 0x807311c, M_end_of_storage = 0x807311c}}, }, last_chunk_free = 1045009, current_ptr = 0xb531def8}, ways = {
_vptr.id_map = 0xb7fcde40, static chunk_size = 1048576, nbuckets = 512, buckets = 0x80d9488, count = 592,
chunks = {<std::_Vector_base<id_map<unsigned int, OsmDatasource::Way, 0, 1, 1048576>::hash_node*, std::allocator<id_map<unsigned int, OsmDatasource::Way, 0, 1, 1048576>::hash_node*> >> = {
_M_impl = {<std::allocator<id_map<unsigned int, OsmDatasource::Way, 0, 1, 1048576>::hash_node*>> = {<__gnu_cxx::new_allocator<id_map<unsigned int, OsmDatasource::Way, 0, 1, 1048576>::hash_node*>> = {}, }, _M_start = 0x80731d8, _M_finish = 0x80731dc, M_end_of_storage = 0x80731dc}}, }, last_chunk_free = 1047984, current_ptr = 0xb2315f08}, relations = {
vptr.id_map = 0xb7fcde30, static chunk_size = 1048576, nbuckets = 2, buckets = 0x80e12d8, count = 4,
chunks = {<std::Vector_base<id_map<unsigned int, OsmDatasource::Relation, 0, 1, 1048576>::hash_node*, std::allocator<id_map<unsigned int, OsmDatasource::Relation, 0, 1, 1048576>::hash_node*> >> = {M_impl = {<std::allocator<id_map<unsigned int, OsmDatasource::Relation, 0, 1, 1048576>::hash_node*>> = {<gnu_cxx::new_allocator<id_map<unsigned int, OsmDatasource::Relation, 0, 1, 1048576>::hash_node*>> = {}, }, M_start = 0x80dee48, M_finish = 0x80dee4c, M_end_of_storage = 0x80dee4c}}, }, last_chunk_free = 1048572, current_ptr = 0xb0f0e058},
InsideWhich = PreloadedXmlDatasource::NONE, tag_level
= 0, last_node
= {map = 0xbfffe858, current = 0xb531dee8}, last_way
= {map = 0xbfffe87c, current = 0xb2315ed8}, last_relation
= {
map = 0xbfffe8a0, current = 0xb0f0e044}, bbox
= {left = 1319310000, bottom = 431046700, right = 1319436000, top = 431186600}}
geometry_generator = { = {vptr.GeometryDatasource = 0xb7fa1e98}, datasource = @0xbfffe854}
layer = { = {vptr.Layer = 0xb7fded28}, = {}, tile = { = {vptr.Tile = 0xb7fded98, reference = {x = 1319373000,
y = 431116650}}, = {}, lines
= {M_ptr = 0x0}, triangles = {M_ptr = 0x0}, quads = {M_ptr = 0x0}}, projection = {project
= 0x804c124 <viewer+4>,
unproject
= 0xb7ff5b00}}
height = 7124
#7 0x0804a43c in main (argc=2, argv=0xbfffea34) at /home/serega/glosm/glosm/viewer/Main.cc:262
No locals.
(gdb)

Не будет. Добавить будет непросто, потому что нет способа указать насколько один объект выше другого в какой-то точке, а для мостов и точки такой быть не может. height для дорог малоприменимы, объекты мостов не приняты. Пока планируется только что-то на базе layer.

Сегфолт у меня не повторяется, пока выключил функцию где он возникает.

AMDmi3 что скажете на счет управления камерой только при зажатой правой клавиши мыши? ( писал выше что имею ввиду, чтобы курсор не пропадал )

Сотни вариантов управления будут когда оформится что-то более Google Earth образное. Сейчас есть более важные задачи, но patches, как водится, welcome.

Значит если отрисовывать мосты или переходы сейчас, то только из “маленьких кусочков building=yes с указаными размерами и высотами”. Хотя это всё конечно несколько поспешно, хотя и забавно :slight_smile:

Сегфолт полечился. И на карте приморья и на мособласти. Спасибо.

Ждём новых версий! :slight_smile:

Жуть то какая.

ну раз уж хочется мостов - то для начала надо рельеф из strm :wink: Ну а потом уже просто - если bridge=yes, то соединяем начало и конец моста по плоскости, а не по рельефу! Но это так, мечты…

Рельеф поможет только частично. О мостах вообще мало данных, в частности расстояния до нижележащего объекта нет, контура моста нет, уклонов нет. Можно будет разве что изгибать веи в ε-окрестности точки пересечения на основании layer.

Рельеф мне интересен не только ради мостов. С ним в любом случае реалистичнее выглядит. К примеру у нас есть многоэтажки в городе, стоящие вдоль склона, так вот, первый подъезд имеет 9 этажей, а четвёртый - уже 10. При этом крыши зданий - на одном уровне, а этаж добавляется “снизу” за счёт уклона. И наоборот, когда секции здания одной этажности идут ступенями по той-же причине.

Когда-нибудь и до рельефа руки дойдут.

Без использования узнаваемых 3D моделей картинка все равно будет только частично похожей, так что загоняться с переменной высоттой зданий в зависимости от склона, и выработке сложных алгоритмов рисования мостов(которые все равно не будут похожи на настоящие т.к. разными архитекторами строились) это ИХМО чересчур. И так будет красиво.

Когда-нибудь и подробные 3D модели будут, и текстуры, никуда не деться от этого. Чем дальше, тем популярнее идея добавить к OSM третье измерение тем или иным способом. Так что нужно поступательно двигаться в этом направлении!

Вот одна из самых первых разработок на тему 3D OSM: http://www.osm-3d.org/ - там есть рельеф, только у меня оно не запускается.

У меня тоже пишет missing plugin

А у меня жалуется на отсутствие достаточного количества оперативки. :frowning:

Разработчик - тайный агент фирмы Hynix! :smiley:

PS - сравнил тут рендер с реальностью - довольно-таки похоже!

Различается в основном линия горизонта - но это опять-же из-за отсутствия рельефа. Но всё равно мне очень нравится!

PPS - а в каком виде glosm “потребляет” building:height? в формате “40 m” будет работать, или единица измерения мешает?

Значит слишком большой дамп открыли.

Ъ, спасибо, я как раз искал что-нибудь такое.

Скорее, из-за того, что в glosm земля плоская.

Будет, но всякие ft и yd будут считаться теми же метрами.

Трубы не хватает. Срочно нарисовать! :slight_smile: