Clicking on objects?

Hi there.

I found the page in the manual about clicking on 3d objects, but when I try to implement it, it says that myTraverser is not defined. I know how to define variables, but what would I type for this one? I don’t know what type it is.

Thanks

Well, until you post the code, it’s hard to guess. Probably, you didn’t define the collision traverser… :wink:
This answer doesn’t help, I know. Try to search forums. There are numerous examples here how to click on 3d objects. You can compare them with your code, and find the missing part.

Ok so here is my code so far. All the commented out parts I just added to make it run like it used to. I am sure I can improve on this a lot, but this is still a learning process.

import direct.directbase.DirectStart
from pandac.PandaModules import *

from direct.task import Task
from direct.actor import Actor
from direct.interval.IntervalGlobal import *
from pandac.PandaModules import CollisionTraverser,CollisionNode
from pandac.PandaModules import CollisionHandlerQueue,CollisionRay
import math

##pickerNode=CollisionNode('mouseRay')
##pickerNP=camera.attachNewNode(pickerNode)
##pickerNode.setFromCollideMask(GeomNode.getDefaultCollideMask())
##pickerRay=CollisionRay()
##pickerNode.addSolid(pickerRay)
##myTraverser.addCollider(pickerNP, myHandler)

def planets():
  Lava = loader.loadModel("Models/Lava planet")
  Lava.reparentTo(render)
  Lava.setPos(0,0,0)
  Lava.setHpr(0,0,0)
  spin1 = Lava.hprInterval(duration=10, hpr=VBase3(360, 0, 0)) 
  spin1.loop()
  Lava.setShaderAuto()
  #Lava.setTag('Planet', 1)

  Ice = loader.loadModel("Models/Ice planet")
  Ice.reparentTo(render)
  Ice.setPos(3,-6,0)
  Ice.setHpr(0,0,0)
  Ice.setScale(1.5,1.5,1.5)
  spin2 = Ice.hprInterval(duration=15, hpr=VBase3(360, 0, 0)) 
  spin2.loop()
  Ice.setShaderAuto()
  #Ice.setTag('Planet', 2)

  Poison = loader.loadModel("Models/Poison planet")
  Poison.reparentTo(render)
  Poison.setPos(-4,-5,0)
  Poison.setHpr(0,0,0)
  Poison.setScale(0.8,0.8,0.8)
  spin3 = Poison.hprInterval(duration=6, hpr=VBase3(360, 0, 0)) 
  spin3.loop()
  Poison.setShaderAuto()
  #Poison.setTag('Planet', 3)

##def Pickobject():
##   mpos=base.mouseWatcherNode.getMouse()
##   pickerRay.setFromLens(base.camNode, mpos.getX(), mpos.getY())
##
##   myTraverser.traverse(render)
##   #assume for simplicity's sake that myHandler is a CollisionHandlerQueue
##   if myHandler.getNumEntries() > 0:
##      myHandler.sortEntries() #this is so we get the closest object
##      pickedObj=myHandler.getEntry(0).getIntoNodePath()
##      pickedObj=pickedObj.findNetTag('Planet')
##      if not pickedObj.isEmpty():
##         handlePickedObject(pickedObj)

sky = loader.loadModel("Models/Star plane")
sky.reparentTo(render)
sky.setPos(0,0,-10)
sky.setHpr(0,30,0)

directionalLight = DirectionalLight( "directionalLight" )
directionalLightNP = render.attachNewNode( directionalLight.upcastToPandaNode() )
directionalLightNP.setHpr(65,-45,0)
render.setLight(directionalLightNP)

dlight = DirectionalLight('dlight')
dlnp = render.attachNewNode(dlight)
dlnp.lookAt(sky)
sky.setLight(dlnp)

def Camera(task):
  base.camera.setPos(0,-20,30)
  base.camera.setHpr(0,-60, 0)
  return Task.cont

taskMgr.add(Camera, "Camera")

planets()

run()

You didn’t define collision traverser in your code (what is “myTraverser”? Your Python doesn’t know it). And I believe you need to read manual, mate :slight_smile: It is very helpful: Collision Traversers

So then what would I put in for ‘traverser name’? Or does it not matter?
And then the from object would just be what I’m clicking on?

what he means is.
you havent created the object named “myTraverser”. which is supposed to be a collision-traverser instance in yourcase.
so basically its like you try to do “print x” but you didnt define x yet. so python doesnt know what x is. same here. it does not know what myTraverser is supposed to be. so unless you create it, it wont work.

putting

 myTraverser = CollisionTraverser()

in front of your first myTraverser.something() call should do the trick

Ok it works now, so now I just need to make it do something. Thanks.