[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 2 из 3
  • «
  • 1
  • 2
  • 3
  • »
Форум Panda3D - по русски » Panda3D » Общие вопросы » взять координаты объекта
взять координаты объекта
akzyДата: Среда, 12.06.2013, 18:02 | Сообщение # 16
Лейтенант
Группа: Пользователи
Сообщений: 55
Награды: 0
Репутация: 3
Статус: Offline
прошло 2 недели тупняка...я так до конца и не смог разобраться с мешами и списками геометрии
ninth если будет немного времени, можеш показать пример, как набор мешей (набор кубиков,геом) можно быстро изменять (удалять/добавить). Тк чтобы удалить или добавить, я удаляю всю созданную ноду для геома и заново создаю с изменениями.
код покажу вечером, как доберусь до него.


Сообщение отредактировал akzy - Среда, 12.06.2013, 18:04
 
ninthДата: Четверг, 13.06.2013, 08:11 | Сообщение # 17
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
Вообще-то так и делается. Тот же майнкрафт работает именно так. Изменять уже созданную геометрию возможности нет. Точнее есть возможность поменять положение вершин, но удалять их или добавлять новые - нет.
 
akzyДата: Суббота, 15.06.2013, 21:59 | Сообщение # 18
Лейтенант
Группа: Пользователи
Сообщений: 55
Награды: 0
Репутация: 3
Статус: Offline
спасибо за наводку
появилось 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))

         self.cnpquad    =render.attachNewNode(CollisionNode('cnquad'))
         self.cnpquad.node().addSolid(self.quad)
         self.cnpquad.node().addSolid(self.quad2)
         self.cnpquad.node().addSolid(self.quad3)
         #self.cnpquad.node().setFromCollideMask(BitMask32.bit(1))
         #self.cnpquad.show()

         base.cTrav=CollisionTraverser()
         collisionHandler = CollisionHandlerEvent()

         pickerNode=CollisionNode('mouseraycnode')
         pickerNP=base.camera.attachNewNode(pickerNode)
         self.pickerRay=CollisionRay()
         pickerNode.addSolid(self.pickerRay)
         base.cTrav.addCollider(pickerNP, collisionHandler)

         collisionHandler.addInPattern('%fn-into-%in')
         collisionHandler.addOutPattern('%fn-out-%in')

         #** Let's manage now the collision events:

         # 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Дата: Воскресенье, 16.06.2013, 09:01 | Сообщение # 19
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
Здесь, имхо два варианта - либо делать каждую грань отдельно, либо вместо событий использовать queqe и смотреть по смене нормали.
 
akzyДата: Вторник, 18.06.2013, 00:40 | Сообщение # 20
Лейтенант
Группа: Пользователи
Сообщений: 55
Награды: 0
Репутация: 3
Статус: Offline
ninth если будет немного времени, тыкни на пример с простой реализацией проверки по маске ( образец по паттернам тут не очень подходит насколько я понял,а в пандовских примерах всё в основном на паттернах)
PS может мне сразу в bullet залезть или тут пока помоделировать...


Сообщение отредактировал akzy - Вторник, 18.06.2013, 00:41
 
ninthДата: Вторник, 18.06.2013, 05:46 | Сообщение # 21
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
Оно тебе надо? ) Bullet в смысле )
Чем стандартный пример с масками не устраивает? http://www.panda3d.org/manual/index.php/Bitmask_Example
 
akzyДата: Среда, 19.06.2013, 01:31 | Сообщение # 22
Лейтенант
Группа: Пользователи
Сообщений: 55
Награды: 0
Репутация: 3
Статус: Offline
(5.46... а ты рано встаёш :))
буллет для некоторой физики хотел приклеить, но не уверен,что он подойдёт на 100%.
не знаеш, как реализовать гравитацию как на планете, т.е в точке? (кроме как чисто считать ускорение вручную)
есть вариант при перемещении смещать вектор тяги, и как бы это почти единственный вариант, но вдруг есть чтото кошернее

Добавлено (19.06.2013, 01:31)
---------------------------------------------
а вопрос задал, тк не смог этот пример прикрутить к CollisionPolygon и mouseRay, буду продолжать эксперименты

Сообщение отредактировал akzy - Вторник, 18.06.2013, 09:55
 
ninthДата: Среда, 19.06.2013, 10:13 | Сообщение # 23
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
Вариант "поздно ложусь" тоже имеет право на жизнь )

Цитата (akzy)
не знаеш, как реализовать гравитацию как на планете, т.е в точке? (кроме как чисто считать ускорение вручную)

Скорее всё же руками считать

Цитата (akzy)
тк не смог этот пример прикрутить к CollisionPolygon и mouseRay

Хм. а в чём проблема возникла?
 
akzyДата: Среда, 19.06.2013, 14:01 | Сообщение # 24
Лейтенант
Группа: Пользователи
Сообщений: 55
Награды: 0
Репутация: 3
Статус: Offline
скорее всего, просто не вижу ошибку свою,
а в оде- луч не видит препятствий
Код
class collider2(DirectObject):
      def __init__(self):
          self.name="collider"

          self.menu       = S_hint()
          self.menu.showmenu()
          self.menu.debugConsole()

          self.geomt= 0
          self.acp =(0,0,0) # active cell point
          self.acn =(0,0,0) # active cell normal
          self.acs=False    #status :True=cell is highlighted

          base.cTrav = CollisionTraverser()
          # Create a handler for the events.
          self.collHandler = CollisionHandlerQueue()

          self.makecq()
          self.cnpquad    =render.attachNewNode(CollisionNode('cnquad'))
          self.cnpquad.node().addSolid(self.qto)
          self.cnpquad.node().addSolid(self.qbo)
          self.cnpquad.node().addSolid(self.qle)
          self.cnpquad.node().addSolid(self.qri)
          self.cnpquad.node().addSolid(self.qfr)
          self.cnpquad.node().addSolid(self.qba)
      def destroy(self):
          """clean up my stuff."""
          #self.ignoreAll()
          # remove colliders, subnodes and such
          self.pickerNP.remove()
          self.traverser.clearColliders()
      def mouseTask2(self,task):
          if base.mouseWatcherNode.hasMouse():
              mpos = base.mouseWatcherNode.getMouse()
              self.pickerRay.setFromLens(base.camNode, mpos.getX(), mpos.getY())

              self.menu.text[0]=str(mpos.getX())
              self.menu.text[1]=str(mpos.getY())
              self.traverser.traverse(self.pickerNP)

          return task.cont
      def makecq(self):
          x=0
          y=0
          z=0
          #left side
          self.qle =CollisionPolygon(Point3(x, y, z), Point3(x, y, z+1),
                     Point3(x, y+1, z+1), Point3(x, y+1, z))
          #front side
          self.qfr=CollisionPolygon(Point3(x+1, y, z), Point3(x+1, y, z+1),
                     Point3(x, y, z+1), Point3(x, y, z))
          #right
          self.qri =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))
          #back side
          self.qba =CollisionPolygon(Point3(x, y+1, z), Point3(x, y+1, z+1),
                     Point3(x+1, y+1, z+1), Point3(x+1, y+1, z))
          #top side
          self.qto=CollisionPolygon(Point3(x, y, z+1), Point3(x+1, y, z+1),
                     Point3(x+1, y+1, z+1), Point3(x, y+1, z+1))
          #bottom
          self.qbo =CollisionPolygon(Point3(x, y, z), Point3(x, y+1, z),
                     Point3(x+1, y+1, z), Point3(x+1, y, z))
collider=collider2()

(комментирую по привычке на английском и мало)
Прикрепления: 9626972.jpg (78.3 Kb)


Сообщение отредактировал akzy - Среда, 19.06.2013, 14:14
 
ninthДата: Среда, 19.06.2013, 14:13 | Сообщение # 25
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
Если этот кусок кода относится к назначению масок, тогда я не вижу где собственно сами маски назначаются?
 
akzyДата: Среда, 19.06.2013, 14:26 | Сообщение # 26
Лейтенант
Группа: Пользователи
Сообщений: 55
Награды: 0
Репутация: 3
Статус: Offline
понял,сейчас покажу( старую часть кода выложил)
 
ninthДата: Среда, 19.06.2013, 14:39 | Сообщение # 27
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
self.pickerNP.node().setCollideMask(mask)
назначает Into маску, а не From, как по-идее должно быть.
 
akzyДата: Пятница, 21.06.2013, 14:21 | Сообщение # 28
Лейтенант
Группа: Пользователи
Сообщений: 55
Награды: 0
Репутация: 3
Статус: Offline
пробовал по разному, не подхватывает коллизию почему то
можно попросить тебя если будет 10 минут, набросать пример детекта коллизий между мышей и CollisionPolygon?
 
ninthДата: Пятница, 21.06.2013, 16:35 | Сообщение # 29
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
держи
Код
# -*- coding: utf-8 -*-  
from panda3d.core import *
import direct.directbase.DirectStart

class collider2():  
      
     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()  
          
         pickerCollN         = CollisionNode('mouseRay')        
         pickerCamN          = base.camera.attachNewNode(pickerCollN)  
         pickerCollN.setFromCollideMask(BitMask32.bit(1))          
         pickerCollN.setIntoCollideMask(BitMask32.allOff())          
         self.pickerRay      = CollisionRay()
         pickerCollN.addSolid(self.pickerRay)
         NodePath(pickerCollN).show()
         base.cTrav.addCollider(pickerCamN, self.collHandler)  

         self.makecq()  
         self.cnpquad    =render.attachNewNode(CollisionNode('cnquad'))  
         self.cnpquad.node().addSolid(self.qto)  
         self.cnpquad.node().addSolid(self.qbo)  
         self.cnpquad.node().addSolid(self.qle)  
         self.cnpquad.node().addSolid(self.qri)  
         self.cnpquad.node().addSolid(self.qfr)  
         self.cnpquad.node().addSolid(self.qba)  
         self.cnpquad.setCollideMask(BitMask32.bit(1))
         self.cnpquad.show()
          
         base.taskMgr.add(self.mouseTask2, 'ray_task')
          
     def mouseTask2(self,task):  
         if base.mouseWatcherNode.hasMouse():  
             mpos = base.mouseWatcherNode.getMouse()  
             self.pickerRay.setFromLens(base.camNode, mpos.getX(), mpos.getY())  
             if self.collHandler.getNumEntries() > 0:
                 self.collHandler.sortEntries()
                 entry = self.collHandler.getEntry(0)
                 self.acp = entry.getSurfacePoint(render)
                 self.acn = entry.getSurfaceNormal(render)
                 print self.acp, self.acn
         return task.cont  

     def makecq(self):  
         x=0  
         y=0  
         z=0  
         #left side  
         self.qle =CollisionPolygon(Point3(x, y, z), Point3(x, y, z+1),  
                    Point3(x, y+1, z+1), Point3(x, y+1, z))  
         #front side  
         self.qfr=CollisionPolygon(Point3(x+1, y, z), Point3(x+1, y, z+1),  
                    Point3(x, y, z+1), Point3(x, y, z))  
         #right  
         self.qri =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))  
         #back side  
         self.qba =CollisionPolygon(Point3(x, y+1, z), Point3(x, y+1, z+1),  
                    Point3(x+1, y+1, z+1), Point3(x+1, y+1, z))  
         #top side  
         self.qto=CollisionPolygon(Point3(x, y, z+1), Point3(x+1, y, z+1),  
                    Point3(x+1, y+1, z+1), Point3(x, y+1, z+1))  
         #bottom  
         self.qbo =CollisionPolygon(Point3(x, y, z), Point3(x, y+1, z),  
                    Point3(x+1, y+1, z), Point3(x+1, y, z))  

collider=collider2()
run()
 
akzyДата: Воскресенье, 23.06.2013, 14:23 | Сообщение # 30
Лейтенант
Группа: Пользователи
Сообщений: 55
Награды: 0
Репутация: 3
Статус: Offline
Cпасибо, понял, где тупил теперь.
Странно, но производительность даже если считает по маскам, падает значительно...
+как я думаю- панда должна просчитывать только для объектов с масками же коллизии, не затрагивая "всю местность", но похоже, это не так опять...
(полез на оффорум)

Добавлено (23.06.2013, 14:23)
---------------------------------------------
обнаружил,что если создавать ноду,
self.collnode=render.attachNewNode(CollisionNode(collnode))
и потом удалять
self.collnode.removeNode()
производительность постепенно падает, на оффоруме пишут,что нода всё ещё остаётся в памяти. Но в этом случае думаю она ещё и влияет на работу. Н знаешь, в чём ещё может быть причина?


Сообщение отредактировал akzy - Воскресенье, 23.06.2013, 14:23
 
Форум Panda3D - по русски » Panda3D » Общие вопросы » взять координаты объекта
  • Страница 2 из 3
  • «
  • 1
  • 2
  • 3
  • »
Поиск: