Tut mir leid für die vielen Fehler. Die könnten daher kommen, dass ich den Code zuerst in Java programmiert hatte und ich mich in Python noch nicht ganz so gut auskenne
Die Idee ist es, dass ich in Leaf zufällige Punkte in einem gewissen Raum generieren möchte.
Der Branch Text Block soll mir den Stamm und die Äste zeichnen. Sie bestehen auch nur aus Punkten mit Information über die Richtung und die Koordinaten des Parent (damit man eine Linie zeichnen kann. Weiss leider nicht ob
Line der richtige Ansatz ist.
Der Tree Text Block ist der Block in dem alles passieren sollte.(Den habe ich ganz unten angehängt)
Link :
http://procworld.blogspot.ch/2011/02/sp ... ation.html
Hier kommt das Leaf her. Ich habe für den Baum verschiedene Text Blöcke angelegt. Einen für das Leaf, einen für Branch, einen für Tree und einen mit register() und unregister()
Code: Alles auswählen
from random import random
import bpy
from mathutils import Vector
def sphere(r,p):
r2 = r*r
while True:
x = (random()*2-1)*r
y = (random()*2-1)*r
z = (random()*2-1)*r
if x*x+y*y+z*z <= r2:
yield p+Vector((x,y,z))
class Leaf(object):
def __init__(self):
self.reached = False
self.pos.x = Vector.random(-5,5)
self.pos.y = Vector.random(-5,5)
self.pos.z = Vector.random(1,4)
self.add(sphere(5,Vector((0,0,8))))
def reached(self):
self.reached = True
def show(self):
self.pushMatrix()
self.translate(self.pos.x, self.pos.y, self.pos.z)
self.sphere(5,Vector((0,0,8)))
self.popMatrix()
Tree():
Code: Alles auswählen
from mathutils import Vector
from array import array
import bpy
from .Branch import Branch
def closest(pos, count, n, x, y, z):
d2 = 1e30
for i in range(n):
if count[i] > 1 : continue
dx, dy, dz = x-pos[i*3], y-pos[i*3+1], z-pos[i*3+2]
d = dx*dx + dy*dy + dz*dz
if d < d2:
d2 = d
ci = i
v = dx,dy,dz
return d2, ci, v
class Tree:
bl_space_type = 'VIEW_3D'
bl_region_type = 'TOOLS'
bl_label = 'Tools Tab Label'
bl_context = 'objectmode'
bl_category = 'SC'
def __init__(self):
self.branches = array[Branch(p)]
self.leaves = array[Leaf()]
i = 0
while(i < 1000):
self.leaves.add(Leaf())
i += 1
root = Branch(Vector(0,0,0), Vector(0, -1)) #hier sollte der erste Vektor die Position sein und der zweite die Richtung
self.branches.add(root)
current = Branch(root)
while not self.closeEnough(current):
trunk = Branch(current)
self.branches.add(trunk)
current = trunk
def grow(self):
for i in range (leaves.size()):
Leaf(l,leaves.get(i))
self.closestBranch = None
self.Vector.closestDir = None
self.record = -1
for i in range (branches.size()):
Branch(b,branches.get(i))
self.Vector.dir = Vector.sub(self.l.pos,self.b.pos)
self.d = self.dir.mag()
if (d < min_dist):
self.l.reached = None
break
elif(d > max_dist):
if (self.closest == None or d < self.record) :
self.closest = b
self.closestDir = dir
self.record = d
if (self.closest != None) :
self.closestDir.normalize()
self.closest.dir.add(closestDir)
self.closest.count+=1
for i in range (leaves.size()-1):
if (leaves.get(i).reached):
leaves.remove(i)
for i in range (leaves.size()-1):
if (leaves.get(i).reached):
leaves.remove(i)
i-=1
for i in range (branches.size()-1):
Branch(b,branches.get(i))
if (b.count > 0):
self.dir.b.div(b.count)
self.dir.b.normalize()
newB = newBranch(b)
branches.add(newB)
b.reset()
def show() :
for i in range (leaves.size()):
Leaf(l,leaves.get(i))
l.show()
i+=1
for i in range (branches,size()) :
Branch(b,branches.get(i))
i+=1
if (self.b.parent != None) :
line(self.b.pos.x, self.b.pos.y, self.b.pos.z, self.b.parent.pos.x, self.b.parent.pos.y, self.b.parent.pos.z)
Branch ():
Bei Branch(self.v, self.v) : will ich diese beiden Vektoren beschreiben. Leider gibt es einen Syntax Error
Code: Alles auswählen
from mathutils import Vector
import bpy
def dir(v):
n = len(v)//3
x=0
y=0
z=0
for i in range(n):
x += v[i*3 ]
y += v[i*3+1]
z += v[i*3+2]
return (x,y,z),x*x+y*y+z*z
class Branch:
def __init__(self, p):
self.v = Vector(p)
self.count = 0
self.len = 5
self.parent = p
self.pos = self.parent.next()
self.dir = self.parent.dir.copy()
self.saveDir = self.dir.copy()
Branch(self.v, self.v) :
parent = None
pos = v.copy()
dir = d.copy()
saveDir = dir.copy()
def reset(self):
self._count = 0
self._dir = self._saveDir.copy()
def nextv(self):
v = Vector.mult(dir, len);
nextv = Vector.add(pos, v);
return next;
Tut mir leid falls es noch irgendwelche offensichtliche Fehler hat.
Trotzdem danke, dass du immernoch hilfst.