[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