我试图按照Panda3D的文档了解他们的子弹物理。到目前为止,他们的教程一开始效果很好,所以我想尝试他们的角色移动代码示例。当我将他们的代码复制并修改到我的工作区时,事情并不顺利。有了这句话;"self.attachNewNode(playerNode(";,它告诉我,起初,自我并没有被定义。我决定删除它,得到一个错误,说世界NP没有定义。
在调查worldNP时,我发现Panda3D的文档中没有手动声明。self.worldNP似乎是在Panda3D中预定义的,类似于它们的基类。我相信我可能错过了某种导入语句,并将对象初始化为worldNP作为其构造函数的一部分。此外,他们在手册中的提及仅针对Panda3D的子弹物理。
至于代码,这是我所知道的:
import direct.directbase.DirectStart
from panda3d.core import Vec3
from panda3d.bullet import BulletWorld
from panda3d.bullet import BulletPlaneShape
from panda3d.bullet import BulletRigidBodyNode
from panda3d.bullet import BulletBoxShape
from panda3d.bullet import BulletCharacterControllerNode
from panda3d.bullet import BulletCapsuleShape
from panda3d.bullet import ZUp
base.cam.setPos(0, -10, 0)
base.cam.lookAt(0, 0, 0)
# World
world = BulletWorld()
world.setGravity(Vec3(0, 0, -9.81))
height = 1.75
radius = 0.4
shape = BulletCapsuleShape(radius, height - 2*radius, ZUp)
playerNode = BulletCharacterControllerNode(shape, 0.4, 'Player')
playerNP = self.worldNP.attachNewNode(playerNode) # This is where self.worldNP is being mentioned
playerNP.setPos(-2, 0, 14)
playerNP.setH(45)
playerNP.setCollideMask(BitMask32.allOn())
world.attachCharacter(playerNP.node())
def update(task):
dt = globalClock.getDt()
world.doPhysics(dt)
world.doPhysics(dt)
return task.cont
taskMgr.add(update, 'update')
base.run()
注意:我知道"import-directbase.DirectStart"已被弃用。尽管如此,我不认为这是我在世界NP问题上的罪魁祸首
这是关于Python的一个相当基本的问题,我建议您学习一些Python教程,因为Panda3D手册假设您具备基本的Python知识。
该示例中的Panda3D手册假设您已将代码放入一个类中,并将worldNP
定义为其成员,其中可能包含位于场景根的节点。在您的情况下,也许用render
(默认场景的根(替换它就足够了。