Yeah, from research it is confirmed, because the CollisionRay goes though everything, I would imagine it is having trouble deciding what direction it is hitting the surface from, if that is the case I may be stumped to solved this at this time
it could be maybe the CollisionRay is such an old feature, it seems to work best with older Handlers like the HandlerQueue and single plane surfaces?
The multiple entries issue may be solvable, but I,m not using a HandlerQueue, I,am using HandlerPusher which works as a HandlerEvent, so how would priority work with that? does the event handler shoot out everything that was collided at that moment?
Because if so, I already implemented code to check which collision was closest to the character, but I wondering if it works correctly, because it is based on the perception that the handler event produces multiple entries from the same solid and point at the same moment, you can check it out below if you want.
def surface(self, entry):
entdist = (max(self.pactor.getPos(self.render), entry.getSurfacePoint(self.render)) - min(self.pactor.getPos(self.render), entry.getSurfacePoint(self.render))).length()
self.entsdist1.extend([abs(entdist)])
if "gravdet" in str(entry.getFromNodePath().getName()):
truesurf = entry.getSurfaceNormal(self.render) * -1
else:
truesurf = entry.getSurfaceNormal(self.render)
self.contact = 2
headsUp(self.quat, self.render.getQuat().getForward(), truesurf)
self.entsdist2.extend([self.quat.getUp()])
So I would have a this collision entry produce my upVector I need to position the character, then in my movement task if multiple entries are present (or believed to be present), it sorts out the closest one in the code block below. (though, this could be intensive to both the memory and cpu)
# - Gravity Dedection
if len(self.entsdist1) > 0 and len(self.entsdist2) > 0:
quatprio = self.entsdist1.index(min(self.entsdist1))
upVec = self.entsdist2[quatprio]
self.entsdist1 = []
self.entsdist2 = []
else:
upVec = self.render.getQuat().getUp()