main.py 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. from direct.showbase.ShowBase import ShowBase
  2. from panda3d.core import Plane, Vec3, Point3, CardMaker, MouseButton
  3. from direct.task import Task
  4. from direct.actor.Actor import Actor
  5. from direct.interval.IntervalGlobal import Sequence
  6. from panda3d import navigation
  7. from panda3d import navmeshgen
  8. from panda3d.core import PointLight,DirectionalLight
  9. from panda3d.core import LPoint3
  10. from panda3d.core import PTA_LVecBase3
  11. from panda3d.core import LVecBase3
  12. from panda3d.core import LineSegs
  13. from panda3d.core import NodePath
  14. import math
  15. import time
  16. class MyApp(ShowBase):
  17. def __init__(self):
  18. ShowBase.__init__(self)
  19. # Setting up light for better view.
  20. plight = PointLight('plight')
  21. plight.setColor((0.9, 0.9, 0.9, 0.5))
  22. plnp = render.attachNewNode(plight)
  23. plnp.setPos(10, 20, 0)
  24. render.setLight(plnp)
  25. dlight = DirectionalLight('dlight')
  26. dlight.setColor((0.8, 0.5, 0.5, 1))
  27. dlnp = render.attachNewNode(dlight)
  28. dlnp.setHpr(0, -60, 0)
  29. render.setLight(dlnp)
  30. # Loading the model
  31. self.scene = self.loader.loadModel("village.obj")
  32. self.scene.reparentTo(self.render)
  33. self.scene.setP(90)
  34. self.scene.setScale(0.25, 0.25, 0.25)
  35. self.scene.flatten_light()
  36. self.scene.setPos(-8, 42, 0)
  37. # mouseclick
  38. self.camera.setPos(0, 60, 500)
  39. self.camera.lookAt(0, 0, 0)
  40. z = 0
  41. self.plane = Plane(Vec3(0, 0, 1), Point3(0, 0, z))
  42. cm = CardMaker("blah")
  43. cm.setFrame(-100, 100, -100, 100)
  44. taskMgr.add(self.__getMousePos, "_YourClass__getMousePos")
  45. # mouseclick end
  46. # NavMeshBuilder is a class that is responsible for building the polygon meshes and navigation meshes.
  47. self.builder = navmeshgen.NavMeshBuilder()
  48. self.structBuilder = navmeshgen.BuildSettings()
  49. self.structBuilder.cell_size = 1;
  50. # Take Nodepath as input. Nodepath should contain the required geometry.
  51. self.builder.fromNodePath(self.scene)
  52. #self.builder.setActorRadius(5)
  53. self.builder.set_actor_height(10)
  54. self.navmesh = self.builder.build()
  55. self.navmeshnode = navigation.NavMeshNode("firstnavmeshnode",self.navmesh)
  56. self.navmeshnodepath = self.scene.attachNewNode(self.navmeshnode)
  57. self.accept("s",self.navmeshnodepath.show)
  58. self.accept("h",self.navmeshnodepath.hide)
  59. # uncomment below line to write to bam
  60. #self.navmeshnodepath.write_bam_file("firstnavmeshnode.bam")
  61. # uncomment below line to read from bam
  62. #self.navmesh = loader.loadModel("firstnavmeshnode.bam")
  63. self.tempActor = Actor("models/panda", {"walk" : "models/panda-walk"})
  64. self.tempActor.reparentTo(self.scene)
  65. self.pos1 = self.tempActor.getPos()
  66. self.pos2 = self.pos1
  67. self.query = navigation.NavMeshQuery(self.navmesh)
  68. # #self.query.setNavQuery(self.navmesh)
  69. self.query.nearestPoint(self.pos1)
  70. # print(pos1)
  71. self.tempActor.setPos(self.pos1)
  72. self.tempActor2 = Actor("models/panda", {"walk" : "models/panda-walk"})
  73. self.tempActor2.reparentTo(self.scene)
  74. # Load and transform the panda actor.
  75. self.pandaActor = Actor("models/panda-model",
  76. {"walk": "models/panda-walk4"})
  77. self.pandaActor.setScale(0.01, 0.01, 0.01)
  78. self.pandaActor.reparentTo(self.scene)
  79. self.pandaActor.loop("walk")
  80. self.pandaSequence = Sequence()
  81. self.pandaSequence.start()
  82. self.lineNodePath = NodePath()
  83. self.lineNodePath2 = NodePath()
  84. def __getMousePos(self,task):
  85. if base.mouseWatcherNode.hasMouse() and base.mouseWatcherNode.isButtonDown(MouseButton.one()):
  86. mpos = base.mouseWatcherNode.getMouse()
  87. pos3d = Point3()
  88. nearPoint = Point3()
  89. farPoint = Point3()
  90. base.camLens.extrude(mpos, nearPoint, farPoint)
  91. if self.plane.intersectsLine(pos3d,
  92. self.scene.getRelativePoint(camera, nearPoint),
  93. self.scene.getRelativePoint(camera, farPoint)):
  94. if abs(self.pos2[0]-pos3d[0]) < 1:
  95. return task.again
  96. self.pos2 = pos3d
  97. self.pos1 = self.pandaActor.get_pos()
  98. self.pandaSequence.finish()
  99. self.query.nearestPoint(self.pos2)
  100. # print(pos2)
  101. self.tempActor2.setPos(self.pos2)
  102. path = self.query.findPath(self.pos1, self.pos2);
  103. print("path.size(): ", len(path));
  104. self.pathLine = LineSegs()
  105. self.pathLine.setColor(0,1,0)
  106. self.pathLine.setThickness(5)
  107. self.pathLine2 = LineSegs()
  108. self.pathLine2.setColor(1,1,0)
  109. self.pathLine2.setThickness(5)
  110. for i in range(len(path)):
  111. self.pathLine.drawTo(path[i])
  112. self.pathLine.drawTo(self.pos2)
  113. self.lineNode = self.pathLine.create()
  114. self.lineNodePath.remove_node()
  115. self.lineNodePath = self.scene.attachNewNode(self.lineNode)
  116. self.lineNodePath.setZ(1)
  117. path = self.query.findStraightPath(self.pos1, self.pos2, 0);
  118. print("path.size(): ", len(path));
  119. for i in range(len(path)):
  120. self.pathLine2.drawTo(path[i])
  121. self.lineNode2 = self.pathLine2.create()
  122. self.lineNodePath2.remove_node()
  123. self.lineNodePath2 = self.scene.attachNewNode(self.lineNode2)
  124. self.lineNodePath2.setZ(2)
  125. self.pandaSequence = Sequence()
  126. current_dir = self.pandaActor.get_hpr()
  127. for i in range(len(path)-1):
  128. print(i, path[i], path[i+1])
  129. vec = [ path[i+1][0] - path[i][0] , path[i+1][1] - path[i][1] ]
  130. cosval = -1 * vec[1] / math.sqrt( vec[0]**2 + vec[1]**2 )
  131. theta = math.acos(cosval) * 180/math.pi
  132. if vec[0] < 0:
  133. theta = 360 - theta
  134. new_dir = LPoint3(theta, current_dir[1], current_dir[2])
  135. rotate_speed = 90
  136. #rotate_time = abs(theta-current_dir[0])/rotate_speed
  137. rotate_time = 0
  138. self.pandaSequence.append(self.pandaActor.hprInterval(rotate_time, new_dir, current_dir))
  139. speed = 6
  140. dist = math.dist(path[i+1],path[i])
  141. print(dist)
  142. self.pandaSequence.append(self.pandaActor.posInterval(dist/speed, path[i+1], path[i]))
  143. current_dir = new_dir
  144. self.pandaSequence.start()
  145. self.pos1 = self.pos2
  146. return task.again
  147. app = MyApp()
  148. app.run()