So, habe ein bisschen Zeit gefunden da mal zu tüfteln. Is irgendwie ein arrg langer Code geworden … ni so geil, aber ich denke dass es erstmal funktioniert. Theoretisch sollte jetzt immer der kürzeste Abstand vom Punkt zum Objekt plus Polygonindex berechnet werden.
Worauf ich hinaus will soll zwar kein LiveUpdateZeusch sein, aber ich bange um die Performance … mal schauen.

PointPolygonobjectDistance(point, polygonobject)
Parameters
point = globaler Vektor
polygonobject = das Polygonobject
return: list
distance = kürzeste Distanz zw. Punkt und Objekt
vector = globaler Vektor auf Objekt
polyID = Index des Polygons
import c4d
import math
#Welcome to the world of Python
def IsInTriXY(tp0, tp1, tp2, p):
dvs = [(tp^c4d.Vector(1,1,0))-(p^c4d.Vector(1,1,0)) for tp in [tp0, tp1, tp2]]
return int(sum([c4d.utils.GetAngle(dvs[i], dvs[(i+1)%3]) for i in xrange(3)])*1000) == int(math.pi*2*1000)
def DistanceVectorTriXY(tp0, tp1, tp2, p):
return min([c4d.utils.PointLineSegmentDistance2D(tp0, tp1, p), c4d.utils.PointLineSegmentDistance2D(tp1, tp2, p), c4d.utils.PointLineSegmentDistance2D(tp2, tp0, p)], key=lambda t: t[0])
def GetTriMatrix(p0, p1, p2):
off = (p0+p1+p2)/3
aim = ((p1+p2)/2-p0).GetNormalized()
third = aim.Cross(p1-p2).GetNormalized()
up = aim.Cross(third).GetNormalized()
return c4d.Matrix(off, aim, up, -third)
def PointPolygonobjectDistance(point, polygonobject):
mg = polygonobject.GetMg()
pnts = [p*mg for p in polygonobject.GetAllPoints()]
plys = polygonobject.GetAllPolygons()
distance = 100000000.0
vector = c4d.Vector()
polyID = -1
for index, ply in enumerate(plys):
if ply.IsTriangle(): tris = ([pnts[ply.a],pnts[ply.b],pnts[ply.c]],)
else: tris = ([pnts[ply.a],pnts[ply.b],pnts[ply.c]], [pnts[ply.a],pnts[ply.c],pnts[ply.d]])
for tri in tris:
triMg = GetTriMatrix(tri[0], tri[1], tri[2])
triPoints = [p*~triMg for p in tri]
pointInM = point*~triMg
if IsInTriXY(triPoints[0], triPoints[1], triPoints[2], pointInM):
if int(distance*10000) > int(abs(pointInM.z)*10000):
distance = abs(pointInM.z)
vector = (pointInM^c4d.Vector(1,1,0))*triMg
polyID = index
else:
tup = DistanceVectorTriXY(triPoints[0], triPoints[1], triPoints[2], pointInM)
d = math.sqrt(tup[0]**2+pointInM.z**2)
if int(distance*10000) > int(d*10000):
distance = d
vector = tup[1]*triMg
polyID = index
return distance, vector, polyID
def main():
obj = op.GetObject()
A = doc.SearchObject("A")
dist, vec, index = PointPolygonobjectDistance(A.GetRelPos(), obj)
Grüße
rownn
PS: @pyrael, besten Dank für die Zeilen. 
rownnDistancePointPoly.c4d (307 KB)