I have a similar question about the moving 3d object. I don’t know if I should start a new post to discuss this issue. If I have done something wrong, please let me know.
My problem is that when I click on an object, it moves the CollisionSphere instead of moving the 3D object.
Here is my code:
import sys
from direct.showbase.ShowBase import ShowBase
from direct.showbase.ShowBaseGlobal import globalClock
from panda3d.core import CollisionNode, CollisionSphere, BitMask32, CollisionTraverser, CollisionHandlerQueue, \
CollisionRay
keyMap = {
"up": False,
"down": False,
"left": False,
"right": False,
"rotate": False,
}
def updateKeyMap(key, state):
keyMap[key] = state
class MyApp(ShowBase):
def __init__(self):
ShowBase.__init__(self)
self.cam.setPos(0, -20, 0)
# quit when esc is pressed
self.accept('escape', sys.exit)
self.disableMouse()
# pick obj
self.pickedObj = None
# self.jack = self.loader.loadModel("models/jack")
# self.jack.setHpr(0, 180, 180)
# self.jack.reparentTo(self.render)
panda = self.loader.loadModel("models/panda")
panda.reparentTo(self.render)
panda.setPos(0, 10, 0)
panda.setScale(0.5, 0.5, 0.5)
cNodePanda = panda.attachNewNode(CollisionNode('cnode_panda'))
cNodePanda.node().addSolid(CollisionSphere(0, 0, 5, 5))
cNodePanda.show()
# set pointer
self.picker = CollisionTraverser()
self.picker.showCollisions(self.render)
self.pq = CollisionHandlerQueue()
self.pickerNode = CollisionNode('mouseRay')
self.pickerNP = self.cam.attachNewNode(self.pickerNode)
self.pickerNode.setFromCollideMask(BitMask32.bit(1))
self.pickerRay = CollisionRay()
self.pickerNode.addSolid(self.pickerRay)
self.picker.addCollider(self.pickerNP, self.pq)
self.accept("g", self.createTree)
self.accept("mouse1", self.mouseClick)
# obj move
self.accept("arrow_left", updateKeyMap, ["left", True])
self.accept("arrow_left-up", updateKeyMap, ["left", False])
self.accept("arrow_right", updateKeyMap, ["right", True])
self.accept("arrow_right-up", updateKeyMap, ["right", False])
self.accept("arrow_up", updateKeyMap, ["up", True])
self.accept("arrow_up-up", updateKeyMap, ["up", False])
self.accept("arrow_down", updateKeyMap, ["down", True])
self.accept("arrow_down-up", updateKeyMap, ["down", False])
self.accept("space", updateKeyMap, ["rotate", True])
self.accept("space-up", updateKeyMap, ["rotate", False])
self.speed = 4
self.angle = 0
# print(self.camera.getPos())
self.taskMgr.add(self.update, "update")
def createTree(self):
object = self.loader.loadModel("jack")
object.reparentTo(self.render)
object.setPos(self.cam, (0, 10, 0))
cNodeObj = object.attachNewNode(CollisionNode('jack'))
cNodeObj.node().addSolid(CollisionSphere(0, 0, 1, 1))
cNodeObj.show()
cNodeObj.setCollideMask(BitMask32.bit(1))
def mouseClick(self):
print('mouse click')
# check mouse exist
if self.mouseWatcherNode.hasMouse():
# mouse position
m_pos = self.mouseWatcherNode.getMouse()
# set the ray position
self.pickerRay.setFromLens(self.camNode, m_pos.getX(), m_pos.getY())
self.picker.traverse(self.render)
# highlight the node if we hit something
if self.pq.getNumEntries() > 0:
self.pq.sortEntries()
self.pickedObj = self.pq.getEntry(0).getIntoNodePath()
print('click on ' + self.pickedObj.getName())
else:
self.pickedObj =None
def update(self, task):
dt = globalClock.getDt()
if self.pickedObj != None:
print(self.pickedObj.getName() + " exist")
x = self.pickedObj.getPos().getX()
y = self.pickedObj.getPos().getY()
z = self.pickedObj.getPos().getZ()
h = self.pickedObj.getH()
p = self.pickedObj.getP()
r = self.pickedObj.getR()
pos = self.pickedObj.getPos()
# pos = self.jack.getPos()
if keyMap["left"]:
print("left")
pos.x -= self.speed * dt
self.pickedObj.setX(x-0.1)
if keyMap["right"]:
pos.x += self.speed * dt
if keyMap["up"]:
pos.z += self.speed * dt
if keyMap["down"]:
pos.z -= self.speed * dt
if keyMap["rotate"]:
self.angle += 1
self.jack.setH(self.angle)
# self.jack.setPos(pos)
self.pickedObj.setPos(pos)
else:
print("obj not pick")
return task.cont
app = MyApp()
app.run()
Have you solved this problem? Can you provide a coding example?
Thanks for reading this comment.