acceleration a actor

Hello,

I try the fuction for acceleration a actor, but it don’t work. Could someone tell me, what I do wrong? Because I dont get it.

import direct.directbase.DirectStart
from pandac.PandaModules import CollisionTraverser,CollisionNode
from pandac.PandaModules import CollisionHandlerQueue,CollisionRay
from pandac.PandaModules import Filename
from pandac.PandaModules import PandaNode,NodePath,Camera,TextNode
from pandac.PandaModules import Vec3,Vec4,BitMask32
from direct.gui.OnscreenText import OnscreenText
from direct.actor.Actor import Actor
from direct.task.Task import Task
from direct.showbase.DirectObject import DirectObject
import random, sys, os, math


MYDIR=os.path.abspath(sys.path[0])
MYDIR=Filename.fromOsSpecific(MYDIR).getFullpath()

class World(DirectObject):

    def __init__(self):
        
        self.keyMap = {"left":0, "right":0, "forward":0, "cam-left":0, "cam-right":0}
        base.win.setClearColor(Vec4(0,0,0,1))

        
        self.environ = loader.loadModel("models/world")      
        self.environ.reparentTo(render)
        self.environ.setPos(0,0,0)
        
        auto1StartPos = self.environ.find("**/start_point").getPos()
        self.auto1 = Actor("models/carnsx")
        self.auto1.reparentTo(render)
        self.auto1.setScale(.5)
        self.auto1.setPos(auto1StartPos)
        self.auto1.speed = 0 # current speed 
        self.auto1.maxSpeed = 60.0 # maximum speed 
        self.auto1.acceleration = 0.3 # acceleration rate 
        
        self.floater = NodePath(PandaNode("floater"))
        self.floater.reparentTo(render)

        self.accept("escape", sys.exit)
        self.accept("arrow_left", self.setKey, ["left",1])
        self.accept("arrow_right", self.setKey, ["right",1])
        self.accept("arrow_up", self.setKey, ["forward",1])
        self.accept("arrow_left-up", self.setKey, ["left",0])
        self.accept("arrow_right-up", self.setKey, ["right",0])
        self.accept("arrow_up-up", self.setKey, ["forward",0])

        taskMgr.add(self.move,"moveTask")

        self.prevtime = 0
        self.isMoving = False
       
        base.disableMouse()
        base.camera.setPos(self.auto1.getX(),self.auto1.getY()+50,15)
        
        self.cTrav = CollisionTraverser()

        self.auto1GroundRay = CollisionRay()
        self.auto1GroundRay.setOrigin(0,0,1000)
        self.auto1GroundRay.setDirection(0,0,-1)
        self.auto1GroundCol = CollisionNode('auto1Ray')
        self.auto1GroundCol.addSolid(self.auto1GroundRay)
        self.auto1GroundCol.setFromCollideMask(BitMask32.bit(0))
        self.auto1GroundCol.setIntoCollideMask(BitMask32.allOff())
        self.auto1GroundColNp = self.auto1.attachNewNode(self.auto1GroundCol)
        self.auto1GroundHandler = CollisionHandlerQueue()
        self.cTrav.addCollider(self.auto1GroundColNp, self.auto1GroundHandler)

        self.camGroundRay = CollisionRay()
        self.camGroundRay.setOrigin(0,0,1000)
        self.camGroundRay.setDirection(0,0,-1)
        self.camGroundCol = CollisionNode('camRay')
        self.camGroundCol.addSolid(self.camGroundRay)
        self.camGroundCol.setFromCollideMask(BitMask32.bit(0))
        self.camGroundCol.setIntoCollideMask(BitMask32.allOff())
        self.camGroundColNp = base.camera.attachNewNode(self.camGroundCol)
        self.camGroundHandler = CollisionHandlerQueue()
        self.cTrav.addCollider(self.camGroundColNp, self.camGroundHandler)


    def setKey(self, key, value):
        self.keyMap[key] = value
    

    def move(self, task):

        elapsed = task.time - self.prevtime


        base.camera.lookAt(self.auto1)
        camright = base.camera.getNetTransform().getMat().getRow3(0)
        camright.normalize()

        startpos = self.auto1.getPos()


        if (self.keyMap["left"]!=0):
            self.auto1.setH(self.auto1.getH() + elapsed*300)
        if (self.keyMap["right"]!=0):
            self.auto1.setH(self.auto1.getH() - elapsed*300)
        if (self.keyMap["forward"]!=0): 
        if self.auto1.speed < self.auto1.maxSpeed: 
            if self.auto1.speed + self.auto1.acceleration > self.auto1.maxSpeed: 
                self.auto1.speed = self.auto1.maxSpeed 
            else: 
                # add to the speed, each frame                
                self.auto1.speed += self.auto1.acceleration 

        # move a certain distance with current speed 
        dist = self.auto1.speed/10            
        angle = self.auto1.getH()*math.pi/180.0 
        dx = dist*math.sin(angle) 
        dy = dist*-math.cos(angle) 
        self.auto1.setPos(self.getX()+dx,self.getY()+dy,self.getZ()) 
            

        camvec = self.auto1.getPos() - base.camera.getPos()
        camvec.setZ(0)
        camdist = camvec.length()
        camvec.normalize()
        if (camdist > 10.0):
            base.camera.setPos(base.camera.getPos() + camvec*(camdist-20))
            camdist = 20.0
        if (camdist < 5.0):
            base.camera.setPos(base.camera.getPos() - camvec*(5-camdist))
            camdist = 5.0

        self.cTrav.traverse(render)

        entries = []
        for i in range(self.auto1GroundHandler.getNumEntries()):
            entry = self.auto1GroundHandler.getEntry(i)
            entries.append(entry)
        entries.sort(lambda x,y: cmp(y.getSurfacePoint(render).getZ(),
                                     x.getSurfacePoint(render).getZ()))
        if (len(entries)>0) and (entries[0].getIntoNode().getName() == "terrain"):
            self.auto1.setZ(entries[0].getSurfacePoint(render).getZ())
        else:
            self.auto1.setPos(startpos)

        self.prevtime = task.time
        return Task.cont


w = World()
run()

there seems to be an indentation error right after
if (self.keyMap[“forward”]!=0):
might be forum-layout-related but there should be an indentation. or else python will complain.

next thing is… you can replace this one

        angle = self.auto1.getH()*math.pi/180.0
        dx = dist*math.sin(angle)
        dy = dist*-math.cos(angle)
        self.auto1.setPos(self.getX()+dx,self.getY()+dy,self.getZ()) 

with :

self.auto1.setX(self.auto1, dist)

or setY if your car is rotated in a way it would drive a long that axis.
nice that panda can take care of it eh? just supply a nodepath as first argument to any setPos /Rotation and panda will set the vales relative to the node you supplied, works for setting it relative to itself,too. :slight_smile:

thats what i see right now.
the other possibility is that your collision isnt working at all and your car thus gets re-set to his last position so it appears to be not moving.