[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Форум Panda3D - по русски » Panda3D » Для начинающих » ДеЦЦкий сад "ПандЁнок"
ДеЦЦкий сад "ПандЁнок"
ninthДата: Среда, 06.05.2009, 15:46 | Сообщение # 31
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
По скорости, getElevation, конечно имеет преимущество, однако, как ты заметил, он не сможет работать с мешами, а я в дальнейшем планирую размещать на террайне меш-элементы.
 
ninthДата: Среда, 13.05.2009, 03:23 | Сообщение # 32
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
Урок 5.
 
3dmaxДата: Среда, 13.05.2009, 03:53 | Сообщение # 33
Генерал-майор
Группа: Проверенные
Сообщений: 334
Награды: 0
Репутация: 1
Статус: Offline
То есть персонаж будет бежать туда, куда клацнем мышью?
 
ninthДата: Среда, 13.05.2009, 11:45 | Сообщение # 34
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
Ну да. Пока персонажа у нас нет - для наглядности только печатаем в вывод координаты куда ткнули мышой.
 
nuclear_Дата: Суббота, 23.05.2009, 14:38 | Сообщение # 35
Сержант
Группа: Пользователи
Сообщений: 27
Награды: 0
Репутация: 0
Статус: Offline
Помогите, что-то так и не работает пикер. В консоль выдает "0",следовательно луч с террайном не сталкивается,но почему и как исправить?
Code
import direct.directbase.DirectStart
from direct.task import Task
from direct.actor import Actor
from pandac.PandaModules import PortalNode
from pandac.PandaModules import CollisionTraverser,CollisionNode
from pandac.PandaModules import CollisionHandlerQueue,CollisionRay
from pandac.PandaModules import Point3,Vec3,Vec4,BitMask32

env = loader.loadModel("models/environment")
env.reparentTo(render)
env.setScale(0.25,0.25,0.25)
env.setPos(-8,42,0)
env.node().setIntoCollideMask(BitMask32.bit(1))

p anda = loader.loadModel("models/box")
panda.setScale(2,2,2)
panda.reparentTo(render)
panda.node().setIntoCollideMask(BitMask32.bit(1))
picker = CollisionTraverser()            #Make a traverser
pq     = CollisionHandlerQueue()         #Make a handler
     #Make a collision node for our picker ray
pickerNode = CollisionNode('mouseRay')
  #Attach that node to the camera since the ray will need to be positioned
#relative to it
pickerNP = base.camera.attachNewNode(pickerNode)
#Everything to be picked will use bit 1. This way if we were doing other
#collision we could seperate it
pickerNode.setFromCollideMask(BitMask32.bit(1))
pickerNode.setIntoCollideMask(BitMask32.allOff())
pickerRay = CollisionRay()               #Make our ray
pickerNode.addSolid(pickerRay)      #Add it to the collision node
#Register the ray as something that can cause collisions
picker.addCollider(pickerNP, pq)
def mouseTask( task):
  if base.mouseWatcherNode.hasMouse():
   mpos = base.mouseWatcherNode.getMouse()
   pickerRay.setFromLens(base.camNode, mpos.getX(), mpos.getY())   
   picker.traverse(env)
   print pq.getNumEntries()
   for i in xrange(pq.getNumEntries()):
    pos=pq.getEntry(i).getSurfacePoint(render)
    panda.setPos(pos)
  return Task.cont
mouseTask = taskMgr.add(mouseTask, 'mouseTask')
run()
 
ninthДата: Суббота, 23.05.2009, 15:35 | Сообщение # 36
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
Вместо env.node().setIntoCollideMask(BitMask32.bit(1)) используй

Code
nodes=env.findAllMatches('**/+GeomNode')
for n in nodes.asList():
     n.node().setIntoCollideMask(BitMask32.bit(1))

дело в том, что загружаемая карта содержит кучу узлов, а ты обращаешься только к корневому, поэтому мы ищем все узлы, являющиеся геометрией и устанавливаем маску для них.
Структуру можно напечатать в вывод, выполнив env.ls()

 
A-o-dДата: Суббота, 27.06.2009, 15:19 | Сообщение # 37
Рядовой
Группа: Пользователи
Сообщений: 13
Награды: 0
Репутация: 0
Статус: Offline
Блин, у меня чего-то не хочет работать control. переписал код, а при запуске говорит что не назначена глобальная vDir. И в location пара строк не пашет... закоментил их стало запускатся. ninth, можно у тебя исходники попросить этих 3х уроков?
 
ninthДата: Понедельник, 29.06.2009, 02:48 | Сообщение # 38
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
Держи, только здесь уже с изменениями - с кодом последнего невывешенного урока - сейчас "немного завал", поэтому не могу уделить время непосредственно описательной части, надеюсь через недельку - полторы немного разгребусь.
Прикрепления: megarpg.zip (872.0 Kb)
 
FertoVordalastrДата: Понедельник, 29.06.2009, 05:47 | Сообщение # 39
Сержант
Группа: Пользователи
Сообщений: 28
Награды: 0
Репутация: 0
Статус: Offline
запустил твой код. ругается, на ошибку
Code

           gnodes=self.terrain.getRoot().findAllMatches("+GeomNode")
           for gnode in gnodes:
               gnode.node().setIntoCollideMask(BitMask32.bit(1))

говорит, что NodePathCollection не итерабелен
вот тут вот: список объявляется без всяких скобок? или метод findAllMatches должен вернуть список?


Сообщение отредактировал FertoVordalastr - Понедельник, 29.06.2009, 05:53
 
ninthДата: Понедельник, 29.06.2009, 08:03 | Сообщение # 40
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
ммм.. в новой версии панды сделали NodePathCollection итерабельной.
В старой версии этот код должен выглядеть так for gnode in gnodes.asList():
 
FertoVordalastrДата: Понедельник, 29.06.2009, 09:09 | Сообщение # 41
Сержант
Группа: Пользователи
Сообщений: 28
Награды: 0
Репутация: 0
Статус: Offline
ясен... спс )))
потестил - все круто. ninth, ты пока разгребаешься там, я может пока попробую класс на игрока и инвентарь написать. может и получиться.
 
A-o-dДата: Понедельник, 29.06.2009, 19:07 | Сообщение # 42
Рядовой
Группа: Пользователи
Сообщений: 13
Награды: 0
Репутация: 0
Статус: Offline
Клёво ))) Нашёл свои ошибки, спасибо

Добавлено (29.06.2009, 19:07)
---------------------------------------------
Кстати, гном переодически проваливается под ланшавт. А как привязать камеру к гному, читобы вокруг него вращалась?

 
ninthДата: Понедельник, 29.06.2009, 21:17 | Сообщение # 43
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
Странно, а закономерность есть? Скрин можно?
Нужно убрать обработку перемещения камеры при подведении мыши краю экрана и прикрепить J1 к root персонажа.
 
A-o-dДата: Понедельник, 29.06.2009, 21:49 | Сообщение # 44
Рядовой
Группа: Пользователи
Сообщений: 13
Награды: 0
Репутация: 0
Статус: Offline
Скрин прилолжил.

Теперь расскажу как такого добится )))

Выбираем самую высокую вершину и засылаем туда гнома, пока он в пути, выкручиваем колёсико мыши отдаляя локацию. Когда происходит удаление, панда уменьшает детализацию рельефа. Я так понимаю моделью гнома это воспринимается как перемещение по ровной плоскости, когда он добирается до точки назначения, приближаем поверхность. Вуаля, у нас отрисовался полный рельеф, а гном собственно остался в другой плоскости. Вобщем это видимо баг самой панды. Думаю нужно поставить ограничение на отдаление камеры...

Прикрепления: 8028927.jpg (74.0 Kb)


Сообщение отредактировал A-o-d - Понедельник, 29.06.2009, 21:51
 
FertoVordalastrДата: Вторник, 30.06.2009, 06:00 | Сообщение # 45
Сержант
Группа: Пользователи
Сообщений: 28
Награды: 0
Репутация: 0
Статус: Offline
у нас есть тестер ))) круто )
предлагаю повесить событие на колесо мыши с обновлением координаты высоты гнома.
не придется тогда заниматься глупостями типа: записывать координату куды нить. ломать голову с ЛОДом или ограничивать прокрутку.


Сообщение отредактировал FertoVordalastr - Вторник, 30.06.2009, 06:01
 
Форум Panda3D - по русски » Panda3D » Для начинающих » ДеЦЦкий сад "ПандЁнок"
Поиск: