Ahh, fair enough.
Well, if we don’t find the source of the problem before you return to that computer, I would be interested in seeing those errors nevertheless, I think.
Ah, I’m glad that you did find a way! 
Ah, thank you for clarifying! (I see that serega has already addressed another way of doing this, so I won’t belabour the matter.)
For my part, I’m not really evading the question–I think that I’ve just felt that I don’t have much to say on the matter, and so have simply answered where I felt that I had answers.
In short, it’s very seldom indeed that I’ve used that feature–it’s not one that I’ve often found myself wanting, I think. Thus I don’t have experience from which to speak.
That said, looking over the relevant manual page, I note that it indicates that one usually doesn’t have to call “resetPrevTransform”–it’s generally done automatically by ShowBase.
And indeed, I’ve hacked together a quick text-program that shows the use of “setFluidPos”, in which it does seem to work as expected. Note that lines related to “fluid movement” are marked with a comment that reads “NB!”, and that I do not use “resetPrevTransform”!
from panda3d.core import loadPrcFile, loadPrcFileData
loadPrcFileData("", "show-frame-rate-meter #t")
# I'm limiting the clock's frame-rate so that
# it's easier to have a moving object go so fast
# that it "skips over" an obstacle.
loadPrcFileData("", "clock-mode limited")
loadPrcFileData("", "clock-frame-rate 10")
from direct.showbase.ShowBase import ShowBase
from panda3d.core import CollisionTraverser, CollisionSphere, CollisionCapsule, CollisionHandlerEvent, CollisionNode, NodePath
class Game(ShowBase):
def __init__(self):
ShowBase.__init__(self)
# The traverser
self.cTrav = CollisionTraverser()
self.cTrav.setRespectPrevTransform(True) # NB!
# The collision-handler
# For simplicity's sake, this is just
# an "event" handler, with a simple
# print-statement in the associated
# method.
self.handler = CollisionHandlerEvent()
self.handler.addInPattern("%fn")
self.accept("collisionObject", self.collisionDetected)
# The fast-moving object.
# See the "update" method for the code
# that moves it.
collisionNode = CollisionNode("collisionObject")
solid = CollisionSphere(0, 0, 0, 0.2)
collisionNode.addSolid(solid)
self.collisionNP = render.attachNewNode(collisionNode)
#### Place the object somewhere useful
#### for demonstrative purposes,
#### and make it visible
self.collisionNP.setPos(20, 50, 0)
self.collisionNP.show()
self.cTrav.addCollider(self.collisionNP, self.handler)
# A simple obstacle for the above
# object to collide with
wallNode = CollisionNode("wall")
solid = CollisionCapsule(0, 0, -10, 0, 0, 10, 0.2)
wallNode.addSolid(solid)
np = render.attachNewNode(wallNode)
#### Again, place the object and
#### make it visible
np.setPos(-10, 50, 0)
np.show()
# Set up a task to update the
# game's logic each frame
self.taskMgr.add(self.update, "update")
def update(self, task):
# Get the time since the last frame
dt = self.clock.getDt()
# Move the object fluidly
self.collisionNP.setFluidPos(self.collisionNP, -20 * dt, 0, 0) # NB!
return task.cont
def collisionDetected(self, entry):
# A simple collision-response: print a message!
print ("Collision detected!")
app = Game()
app.run()