прошло 2 недели тупняка...я так до конца и не смог разобраться с мешами и списками геометрии ninth если будет немного времени, можеш показать пример, как набор мешей (набор кубиков,геом) можно быстро изменять (удалять/добавить). Тк чтобы удалить или добавить, я удаляю всю созданную ноду для геома и заново создаю с изменениями. код покажу вечером, как доберусь до него.
Сообщение отредактировал akzy - Среда, 12.06.2013, 18:04
Вообще-то так и делается. Тот же майнкрафт работает именно так. Изменять уже созданную геометрию возможности нет. Точнее есть возможность поменять положение вершин, но удалять их или добавлять новые - нет.
спасибо за наводку появилось 2 небольших вопроса- 1. Генерю CollisionPolygon как стены куба, в пределах 10 единиц от камеры, объединяю в ноду и присоединяю к рендеру. Вопрос- событие на коллайд возникает только при входе в объект ноды, а при перемещении внутри- нет, как можно отследить,что мыши перешла на другую грань?
Код
x=0 y=0 z=0 #left side self.quad =CollisionPolygon(Point3(x, y, z), Point3(x, y, z+1), Point3(x, y+1, z+1), Point3(x, y+1, z)) x=0 y=0 z=0 #front side self.quad2=CollisionPolygon(Point3(x+1, y, z), Point3(x+1, y, z+1), Point3(x, y, z+1), Point3(x, y, z)) #right self.quad3 =CollisionPolygon(Point3(x+1, y+1, z), Point3(x+1, y+1, z+1), Point3(x+1, y, z+1), Point3(x+1, y, z))
# if you went from step3 and step4, here should not be mysteries for you self.accept('mouseraycnode-into-cnquad', self.collideEventIn) self.accept('mouseraycnode-out-cnquad', self.collideEventOut) self.pickingEnabled=False self.accept('mouse1', self.mousePick, ['down']) self.accept('mouse1-up', self.mousePick, ['up']) #base.cam.setPos(-15,-15,15) #base.cam.lookAt(5, 5, 5)
def collideEventIn(self,entry): print str(entry) # here how we get the references of the two colliding objects to show their names ASA this happen np_from=entry.getFromNodePath() np_into=entry.getIntoNodePath() self.acs=True self.acp=entry.getSurfacePoint(render) self.acn=entry.getSurfaceNormal(render) self.menu.text[2]='mouse in '+str(self.acp) self.menu.text[3]='normal '+str( self.acn) #print str( entry.getSurfaceNormal(render)) # we need also to raise a flag to inform the mousePick routine that the picking is now active self.pickingEnabled=True self.cnpquad.show()
#** This function will be called as the ray will leave smiley (the FROM ray goes OUT the smiley) def collideEventOut(self,entry): self.acs=False # now we update the flag to inform mousePick routine that the picking is actually no more self.pickingEnabled=False self.cnpquad.hide()
self.menu.text[2]='mouse out' np_into=entry.getIntoNodePath() #print str(entry) #np_into.getParent().setColor(1.0, 1.0, 1.0, 1) def mousePick(self,status): if self.pickingEnabled: if status == 'down': self.menu.text[2]='mouse pick down'
if status == 'up': self.menu.text[2]='mouse pick up'
ninth если будет немного времени, тыкни на пример с простой реализацией проверки по маске ( образец по паттернам тут не очень подходит насколько я понял,а в пандовских примерах всё в основном на паттернах) PS может мне сразу в bullet залезть или тут пока помоделировать...
Сообщение отредактировал akzy - Вторник, 18.06.2013, 00:41
(5.46... а ты рано встаёш :)) буллет для некоторой физики хотел приклеить, но не уверен,что он подойдёт на 100%. не знаеш, как реализовать гравитацию как на планете, т.е в точке? (кроме как чисто считать ускорение вручную) есть вариант при перемещении смещать вектор тяги, и как бы это почти единственный вариант, но вдруг есть чтото кошернее
Добавлено (19.06.2013, 01:31) --------------------------------------------- а вопрос задал, тк не смог этот пример прикрутить к CollisionPolygon и mouseRay, буду продолжать эксперименты
Сообщение отредактировал akzy - Вторник, 18.06.2013, 09:55
пробовал по разному, не подхватывает коллизию почему то можно попросить тебя если будет 10 минут, набросать пример детекта коллизий между мышей и CollisionPolygon?
def __init__(self): self.name="collider" self.geomt= 0 self.acp =(0,0,0) # active cell point self.acn =(0,0,0) # active cell normal
# Для base.cTrav процедура traverse вызывается автоматически # в каждом цикле прорисовки base.cTrav = CollisionTraverser() base.cTrav.showCollisions(render) # Create a handler for the events. self.collHandler = CollisionHandlerQueue()
Cпасибо, понял, где тупил теперь. Странно, но производительность даже если считает по маскам, падает значительно... +как я думаю- панда должна просчитывать только для объектов с масками же коллизии, не затрагивая "всю местность", но похоже, это не так опять... (полез на оффорум)
Добавлено (23.06.2013, 14:23) --------------------------------------------- обнаружил,что если создавать ноду, self.collnode=render.attachNewNode(CollisionNode(collnode)) и потом удалять self.collnode.removeNode() производительность постепенно падает, на оффоруме пишут,что нода всё ещё остаётся в памяти. Но в этом случае думаю она ещё и влияет на работу. Н знаешь, в чём ещё может быть причина?
Сообщение отредактировал akzy - Воскресенье, 23.06.2013, 14:23