ModelScreenShot.py 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import direct
  2. from pandac.PandaModules import loadPrcFileData
  3. from direct.showbase.DirectObject import DirectObject
  4. from direct.directbase.DirectStart import *
  5. from pandac.PandaModules import *
  6. import direct.gui.DirectGuiGlobals as DGG
  7. from direct.gui.DirectGui import *
  8. from direct.task import Task
  9. from direct.directnotify import DirectNotifyGlobal
  10. import math
  11. from operator import *
  12. import ModelScreenShotGlobals
  13. class ModelScreenShot(DirectObject):
  14. notify = DirectNotifyGlobal.directNotify.newCategory("ModelScreenShot")
  15. def __init__(self):
  16. # Grab a list of models to capture screenshots of from an array in
  17. # the globals file
  18. self.modelsToView = ModelScreenShotGlobals.models
  19. self.models = []
  20. # Attach all the models listed to render and save a pointer to them
  21. # in an array. Then hide the model.
  22. for model in self.modelsToView:
  23. m = loader.loadModel(model)
  24. m.reparentTo(render)
  25. self.models.append(m)
  26. m.hide()
  27. # Set a nice farplane far, far away
  28. self.lens = base.camera.getChild(0).node().getLens()
  29. self.lens.setFar(10000)
  30. # Hide the cursor
  31. self.props = WindowProperties()
  32. self.props.setCursorHidden(0)
  33. base.win.requestProperties(self.props)
  34. # Method for getting the distance to an object from the camera
  35. def getDist(obj, lens):
  36. rad = obj.getBounds().getRadius()
  37. fov = lens.getFov()
  38. dist = rad / math.tan(deg2Rad(min(fov[0], fov[1]/2.0)))
  39. return dist
  40. # Determin the optimal camera position
  41. def getOptCamPos(obj, dist):
  42. cen = obj.getBounds().getCenter()
  43. camPos = VBase3(cen.getX(), -dist, cen.getZ())
  44. return camPos
  45. # Generate screenshots
  46. def generatePics():
  47. for model in self.models:
  48. model.show()
  49. base.camera.setPos(getOptCamPos(model, getDist(model, self.lens)))
  50. uFilename = model.getName().replace('.egg','.jpg')
  51. self.notify.info("screenshot %s camera pos: %s" % (uFilename, base.camera.getPos()))
  52. base.graphicsEngine.renderFrame()
  53. base.screenshot(namePrefix = uFilename, defaultFilename = 0)
  54. model.hide()
  55. generatePics()
  56. mss = ModelScreenShot()
  57. run()