[Bf-extensions-cvs] SVN commit: /data/svn/bf-extensions [866] branches/ivygen/ivy_test.py: == ivy ==

Florian Meyer florianfelix at web.de
Wed Jul 28 20:11:00 CEST 2010


Revision: 866
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-extensions&revision=866
Author:   testscreenings
Date:     2010-07-28 20:11:00 +0200 (Wed, 28 Jul 2010)

Log Message:
-----------
== ivy ==
- numerous small changes
- bug in collision --> can't find meshdata <-- still there
- in adhesion the meshdata is accessible somehow

Modified Paths:
--------------
    branches/ivygen/ivy_test.py

Modified: branches/ivygen/ivy_test.py
===================================================================
--- branches/ivygen/ivy_test.py	2010-07-28 16:28:35 UTC (rev 865)
+++ branches/ivygen/ivy_test.py	2010-07-28 18:11:00 UTC (rev 866)
@@ -178,12 +178,9 @@
     # list of containing Roots
     def __init__(self):
         self.ivyRoots = []
-        #self.ivyCollider = obj
 
     ivyRoots = []
     
-    ivyCollider = None
-    
     # the ivy size factor, influences the grow behaviour [0..0,1]
     ivySize = 1.0
     
@@ -195,7 +192,10 @@
     
     # maximum length of an ivy branch segment that is freely floating [0..1]
     maxFloatingLength = 8
-    
+
+    # maximum length of an ivy branch segment that is freely floating [0..1]
+    maxLength = 12
+
     # maximum distance for adhesion of scene object [0..1]
     maxAdhesionDistance = 0.1
 
@@ -222,7 +222,7 @@
 
 
     ######### one GROW iteration ######
-    def grow(self, props, data):
+    def grow(self, props, data, ob):
         
         # newRoots = []
         rootNr = 0
@@ -236,12 +236,16 @@
             #print('rootstart', root.ivyNodes[0].position)
             # RANDOM VECTOR
             
-            # check if it dies of old age
-            if prevIvy.length > self.maxFloatingLength:
+            # check if it dies of to much floating
+            if prevIvy.floatingLength > self.maxFloatingLength:
                 root.alive = False
                 continue
             
-            
+            # check if it dies of old age
+            if prevIvy.length > self.maxLength:
+                root.alive = False
+                continue
+
             randomVector = (mathutils.Vector((random.random()-0.5,
                                               random.random()-0.5,
                                               random.random()-0.5)) +
@@ -253,7 +257,11 @@
             # ADHESION VECTOR
             #adhesionVector = adhesion2(prevIvy.position, self.ivyCollider, data, props)
             adhesionVector = mathutils.Vector((0,0,0))
+            
+            adhesionVector = adhesion3(prevIvy.position, ob.data, data, props)
 
+            adhesionVector = adhesionVector.normalize() * -0.5
+            adhesionVector *= 0.1 / adhesionVector.length
             # GROW VECTOR
             growVector = (randomVector * props.ivyRandomWeight +
                           adhesionVector * props.ivyAdhesionWeight +
@@ -268,7 +276,7 @@
             ####################################################################################################
             ####################################################################################################
             ####### put in here for testing, until the error is fixed ##########################################
-            #climbing, new_pos = collision(self.ivyCollider, root, prevIvy.position + growVector + gravityVector)
+            climbing, new_pos = collision(ob, root, prevIvy.position + growVector + gravityVector)
             ####### delete, comment out when fixed #############################################################
             ####################################################################################################
             ####################################################################################################
@@ -279,17 +287,7 @@
             except:
                 pass
             #print('new_grow', growVector)
-            '''
-            try:
-                climbing, new_pos = collision(self.ivyCollider, root, prevIvy.position + growVector + gravityVector)
-                #print('old_Grow', growVector)
-                #update growVector in case of collision
-                growVector = new_pos - prevIvy.position - gravityVector
-                #print('new_Grow', growVector)
 
-            except:
-                print('---COLLISION FAILED---')
-            '''
 
             # create new IvyNode
             tmpIvy = IvyNode()
@@ -347,9 +345,9 @@
 
 def generateSamples(faces, mesh):
     samplePoints = []
-    rows = 6
+    rows = 3
     for face in faces:
-        print('face', face.index)
+        #print('face', face.index)
 
         # adding the vertcoordinates --> doesn't account for shared verts
         samplePoints += ([mesh.verts[i].co.copy() for i in face.verts])
@@ -481,30 +479,37 @@
 
 
 
-def adhesion3(NodePoint, mesh):
+def adhesion3(NodePoint, mesh, data, props):
+    
+    targetBoundingSphere = data[0]
+    minimum_dist = targetBoundingSphere[1] * props.ivyMaxAdhesionDist
+
     #get the closest faces
     #1. naive search
-    print('\nsorting faces')
+    #print('\nsorting faces')
     sortetFaces = sorted(mesh.faces, key=lambda face: (face.center - NodePoint).length)
 
+    if ((sortetFaces[0].center - NodePoint).length > minimum_dist):
+        return mathutils.Vector((0,0,0))
+
     # now generate oversampling points for the closest faces
-    samplePoints = generateSamples(sortetFaces[0:4], mesh) # generate samples for the 4 nearest faces
+    samplePoints = generateSamples(sortetFaces[0:1], mesh) # generate samples for the 4 nearest faces
 
     sortetSample = sorted(samplePoints, key=lambda point: (NodePoint - point).length)
 
     #debugmesh for the sampling points
-    meshFromPoints(sortetSample)
+    #meshFromPoints(sortetSample)
 
-    print('sortetSample - all: ', len(sortetSample))
+    #print('sortetSample - all: ', len(sortetSample))
 
     try:
         adhesionVector = NodePoint - sortetSample[0]
-        print('NodePoint', NodePoint)
-        print('sortetSample[0]', sortetSample[0])
+        #print('NodePoint', NodePoint)
+        #print('sortetSample[0]', sortetSample[0])
     except:
         adhesionVector = mathutils.Vector((0,0,0))
 
-    print(adhesionVector)
+    #print(adhesionVector)
     return adhesionVector
 
 def collision(ob, root, new_pos):
@@ -517,7 +522,7 @@
 
     ray_result = ob.ray_cast(old_pos, new_pos)
     if ray_result[2] != -1: # if collides with mesh
-        print('XXXXXXXXXXXXXXCollided with Object: ', ob.name)
+        #print('XXXXXXXXXXXXXXCollided with Object: ', ob.name)
     
         climbing = True
         face = ob.data.faces[ray_result[2]]
@@ -530,8 +535,8 @@
     
         new_pos += 2.0 * (projVec - new_pos)
 
-    else:
-        print('not colliding\n')
+    #else:
+        #print('not colliding\n')
     
     collisionResult = [climbing, new_pos]
     return climbing, new_pos
@@ -551,14 +556,8 @@
     #create main IvyObject stores all the IvyRoots.IvyNodes
     IVY = Ivy()
 
-    adVec = adhesion3(seedPoint, obj.data)
+    #adVec = adhesion3(seedPoint, obj.data)
 
-    #print('preLoop collider is', IVY.ivyCollider)
-
-    # set collider object
-    IVY.ivyCollider = collider
-    #print('setting collider to', IVY.ivyCollider.name)
-
     #empty the roots list
     IVY.ivyRoots = []
 
@@ -567,7 +566,7 @@
 
     #for now usercontrollable growiterations
     for i in range(props.ivyIter):
-        IVY.grow(props, data)
+        IVY.grow(props, data, obj)
 
     print('\nIvyNodes[root[0]:', len(IVY.ivyRoots[0].ivyNodes))
     print('IvyRoots:', len(IVY.ivyRoots))
@@ -589,7 +588,7 @@
                             default=0)
     ivyIter = IntProperty(name='Iterations',
                             min=0, soft_min=0,
-                            default=29)
+                            default=89)
     ivyGravityWeight = FloatProperty(name='Gravity Weight',
                             min=0,soft_min=0,
                             max=1,soft_max=1,
@@ -609,9 +608,9 @@
     ivyGlobScale = FloatProperty(name='Globel Scale',
                             min=0,soft_min=0,
                             default=1)
-    ivyMaxAdhesionDist = FloatProperty(name='Globel Scale',
+    ivyMaxAdhesionDist = FloatProperty(name='MaxAdhesionDist',
                             min=0,soft_min=0,
-                            default=0.000001)
+                            default=1)
 
     collider = None
 




More information about the Bf-extensions-cvs mailing list