[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 4 из 4
  • «
  • 1
  • 2
  • 3
  • 4
Форум Panda3D - по русски » Panda3D » Для начинающих » Tilemap rendering (генерация поверхности на основе набора тайлов)
Tilemap rendering
soosДата: Пятница, 01.07.2011, 10:47 | Сообщение # 46
Майор
Группа: Пользователи
Сообщений: 82
Награды: 1
Репутация: 0
Статус: Offline
Quote (serg-kkz)
Ты всё заткнул в иницилизацию

Ничего подобного. Методы add_tile_type(), add_tile() и bake(), соответственно, добавляют новый тип поверхности, добавляют на поверхность тайл в (х,у) и генерят меш. Инициализация делает только то, что нужно.
 
serg-kkzДата: Пятница, 01.07.2011, 10:52 | Сообщение # 47
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
Точно, только приглядетья надо. Отступы всего пробел.

ООП  -  
 
soosДата: Пятница, 01.07.2011, 10:55 | Сообщение # 48
Майор
Группа: Пользователи
Сообщений: 82
Награды: 1
Репутация: 0
Статус: Offline
Quote (serg-kkz)
Отступы всего пробел

Я использую табы. Надо будет преобразовать перед вставкой сюда.
 
serg-kkzДата: Пятница, 01.07.2011, 23:52 | Сообщение # 49
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
Посмотрел код и... здесь надо призадуматься, дело в том что циклом создаётся пул вершин и записывается в GeomVertexData разом, а в случае когда надо добавлять или удалять не сколько вершин нужно использовать другой метод что то вроде добавление к существующей структуре. Даже набросал код где динамически меняется положение полигона, но не добавление.

После загрузки нужно нажать кнопку 'g' для генерации полигона.
кнопки 'x','y' задать новые координаты(просто прибавлением на 1)
так же 'q' можно поменять номера вертексов(в принципе не нужно)
и заново нажать 'g'
Прикрепления: Rec_v0.py (2.1 Kb)


ООП  -  

Сообщение отредактировал serg-kkz - Суббота, 02.07.2011, 00:04
 
serg-kkzДата: Суббота, 02.07.2011, 08:23 | Сообщение # 50
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
Как вариант можно хранить предыдущие данные где то например в списке, потом генерировать геометрию исходя из данных списка, а добавление и удаление производить со списком.

soos кажись я тупанул в предущем коде допустив ошибку в одном месте, я нашёл решение, попоже выложу.

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

Code
from pandac.PandaModules import *  
import direct.directbase.DirectStart
from direct.showbase.DirectObject import DirectObject

class LoaderMap(DirectObject):
     def __init__(self):
         self.node = GeomNode('gnode')
         self.gvd = GeomVertexData('name', GeomVertexFormat.getV3t2(), Geom.UHStatic)     
         self.geom = Geom(self.gvd)
         self.prim = GeomTriangles(Geom.UHStatic)
         self.vertex = GeomVertexWriter(self.gvd, 'vertex')
         self.texcoord = GeomVertexWriter(self.gvd, 'texcoord')
         self.tex = loader.loadTexture('1.png')
         self.x = 0
         self.y = 0
         self.accept('x',self.x1)
         self.accept('y',self.y1)
         self.accept('g',self.add_vert)
         self.Vert0 = 0
         self.Vert1 = 1
         self.Vert2 = 2
         self.Vert3 = 3
         self.nomer_GeomState = 0
     def x1(self):
         self.x +=1
     def y1(self):
         self.y +=1
     def add_vert(self):
         self.vertex.addData3f(self.x-0.5, self.y+0.5, 0)
         self.texcoord.addData2f(1, 1)  
         self.vertex.addData3f(self.x-0.5, self.y-0.5, 0)
         self.texcoord.addData2f(1, 0)
         self.vertex.addData3f(self.x+0.5, self.y+0.5, 0)
         self.texcoord.addData2f(0, 1)
         self.vertex.addData3f(self.x+0.5, self.y-0.5, 0)
         self.texcoord.addData2f(0, 0)
         self.prim.addVertices(self.Vert0, self.Vert1, self.Vert2, self.Vert3)
         self.prim.addVertices(self.Vert2, self.Vert1)
         self.geom.addPrimitive(self.prim)
         self.node.addGeom(self.geom)
         self.node.setGeomState(self.nomer_GeomState,  
                    self.node.getGeomState(self.nomer_GeomState).addAttrib(TextureAttrib.make(self.tex)))
         self.nomer_GeomState +=1
         self.prim.closePrimitive()
         terrain = render.attachNewNode(self.node)
         terrain.analyze()
         self.vert()
     def vert(self):
         self.Vert0 += 4
         self.Vert1 += 4
         self.Vert2 += 4
         self.Vert3 += 4
          
LoaderMap()
run()


Pядом положи текстурку 1.png

После загруки нажми кнопку g и найди камерой тайл
нажми x или y и снова g


ООП  -  

Сообщение отредактировал serg-kkz - Суббота, 02.07.2011, 13:26
 
soosДата: Пятница, 08.07.2011, 18:33 | Сообщение # 51
Майор
Группа: Пользователи
Сообщений: 82
Награды: 1
Репутация: 0
Статус: Offline
Пытаюсь оптимизировать этот. Теперь bake() выдаёт ошибку:

Code

     terrain.bake()
   File "terrain_poligons_right.py", line 64, in bake
     self.geoms[i]['geom'].addPrimitive(self.geoms[i]['prim'])
AssertionError: primitive->check_valid(cdata->_data.get_read_pointer()) at line
370 of c:\buildslave\release_sdk_win32\build\panda3d\panda\src\gobj\geom.cxx

Не могу понять что не так. print'ом выводил и geom и prim, оба существуют и выглядят нормально. Смотрел исходники панды, там тоже никаких комментариев нет. Может кто сталкивался с такой ошибкой?
 
serg-kkzДата: Пятница, 08.07.2011, 19:35 | Сообщение # 52
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
До оптимизации работало нет? что конкретно опимизировал и где, а то не понять, судя по ошибки нет точек которые надо дабавить.

ООП  -  

Сообщение отредактировал serg-kkz - Пятница, 08.07.2011, 19:38
 
serg-kkzДата: Пятница, 08.07.2011, 20:21 | Сообщение # 53
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
eek
Quote (soos)
print'ом выводил и geom и prim, оба существуют и выглядят нормально.

eek


ООП  -  

Сообщение отредактировал serg-kkz - Пятница, 08.07.2011, 20:22
 
soosДата: Пятница, 08.07.2011, 20:43 | Сообщение # 54
Майор
Группа: Пользователи
Сообщений: 82
Награды: 1
Репутация: 0
Статус: Offline
Разобрался вроде. Я тормозил просто. У каждого Geom'а свои Vertex'ы, я это не учёл.
 
serg-kkzДата: Суббота, 09.07.2011, 17:38 | Сообщение # 55
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
В следующий раз гляди в исходниках ОС, там комментарии есть по таким ошибкам wink

ООП  -  
 
serg-kkzДата: Воскресенье, 10.07.2011, 19:29 | Сообщение # 56
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
Ещё в целях оптимизации используй текстуры в формате bmp, у меня шустрей как то рендерятся 10 000 полигонов, чем с png.

ООП  -  
 
ninthДата: Понедельник, 11.07.2011, 02:50 | Сообщение # 57
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
Это не должно влиять - всё равно при загрузке в видеопамять всё преобразуется в "сырой" формат, хоть jpg, хоть png, хоть bmp. Единственное, они могут иметь разное кол-во бит, bmp вроде только 24 поддерживает, а png - все 32 может из-за этого.
 
serg-kkzДата: Понедельник, 11.07.2011, 10:11 | Сообщение # 58
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
Здесь наверное так и есть, когда я пытаюсь через фотошоп сохранить текстуры из примера 1.png, 2.png, 3.png в формат dds через плагин NVIDIA, у меня выскакивает сообщение что альфа канал будет потерян. Хотя слой не активирован, но видимо под возможности для альфа слоя добавляются дополнительные биты. Пробовал другие png, то сообщения не было. Хотя быстроты в FPS не очень заметно, но ощущение есть... может кажется...

ООП  -  
 
Форум Panda3D - по русски » Panda3D » Для начинающих » Tilemap rendering (генерация поверхности на основе набора тайлов)
  • Страница 4 из 4
  • «
  • 1
  • 2
  • 3
  • 4
Поиск: