mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-04 19:08:55 -04:00
Use selection sphere
This commit is contained in:
parent
aca6c38b51
commit
db9f6f3568
@ -561,7 +561,7 @@ class SelectionRay(SelectionQueue):
|
|||||||
self.collider.setDirection( dir )
|
self.collider.setDirection( dir )
|
||||||
self.ct.traverse( targetNodePath )
|
self.ct.traverse( targetNodePath )
|
||||||
self.sortEntries()
|
self.sortEntries()
|
||||||
|
|
||||||
def pickGeom3D(self, targetNodePath = render,
|
def pickGeom3D(self, targetNodePath = render,
|
||||||
origin = Point3(0), dir = Vec3(0,0,-1),
|
origin = Point3(0), dir = Vec3(0,0,-1),
|
||||||
skipFlags = SKIP_HIDDEN | SKIP_CAMERA ):
|
skipFlags = SKIP_HIDDEN | SKIP_CAMERA ):
|
||||||
@ -623,3 +623,61 @@ class SelectionSegment(SelectionQueue):
|
|||||||
# Determine collision entry
|
# Determine collision entry
|
||||||
return self.findCollisionEntry(skipFlags)
|
return self.findCollisionEntry(skipFlags)
|
||||||
|
|
||||||
|
|
||||||
|
class SelectionSphere(SelectionQueue):
|
||||||
|
# Wrapper around collision sphere
|
||||||
|
def __init__(self, parentNP = render, numSpheres = 1):
|
||||||
|
# Initialize the superclass
|
||||||
|
SelectionQueue.__init__(self, parentNP)
|
||||||
|
self.colliders = []
|
||||||
|
self.numColliders = 0
|
||||||
|
for i in range(numSpheres):
|
||||||
|
self.addCollider(CollisionSphere(Point3(0), 1))
|
||||||
|
|
||||||
|
def addCollider(self, collider):
|
||||||
|
# Record new collision object
|
||||||
|
self.colliders.append(collider)
|
||||||
|
# Add the collider to the collision Node
|
||||||
|
self.collisionNode.addSolid( collider )
|
||||||
|
self.numColliders += 1
|
||||||
|
|
||||||
|
def setCenter(self, i, center):
|
||||||
|
c = self.colliders[i]
|
||||||
|
c.setCenter(center)
|
||||||
|
|
||||||
|
def setRadius(self, i, radius):
|
||||||
|
c = self.colliders[i]
|
||||||
|
c.setRadius(radius)
|
||||||
|
|
||||||
|
def setCenterRadius(self, i, center, radius):
|
||||||
|
c = self.colliders[i]
|
||||||
|
c.setCenter(center)
|
||||||
|
c.setRadius(radius)
|
||||||
|
|
||||||
|
def isEntryBackfacing(self, entry):
|
||||||
|
# If dot product of collision point surface normal and
|
||||||
|
# ray from sphere origin to collision point is positive, we are
|
||||||
|
# looking at the backface of the polygon
|
||||||
|
v = Vec3(entry.getFromIntersectionPoint() -
|
||||||
|
entry.getFrom().getCenter())
|
||||||
|
n = entry.getFromSurfaceNormal()
|
||||||
|
# Normalize and check angle between to vectors
|
||||||
|
v.normalize()
|
||||||
|
return v.dot(n) >= 0
|
||||||
|
|
||||||
|
def pick(self, targetNodePath, skipFlags):
|
||||||
|
self.ct.traverse( targetNodePath )
|
||||||
|
self.sortEntries()
|
||||||
|
return self.findCollisionEntry(skipFlags)
|
||||||
|
|
||||||
|
def pickGeom(self, targetNodePath = render,
|
||||||
|
skipFlags = SKIP_HIDDEN | SKIP_CAMERA ):
|
||||||
|
self.collideWithGeom()
|
||||||
|
return self.pick(targetNodePath, skipFlags)
|
||||||
|
|
||||||
|
def pickBitMask(self, bitMask = BitMask32.allOff(),
|
||||||
|
targetNodePath = render,
|
||||||
|
skipFlags = SKIP_HIDDEN | SKIP_CAMERA ):
|
||||||
|
self.collideWithBitMask(bitMask)
|
||||||
|
return self.pick(targetNodePath, skipFlags)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user