def deviate(branch_angle, branching, twist, initial_phyllotaxic_angle, plagiotropism_buds, gravitropism_buds, parent_direction, i, j): direction = parent_direction.normalized() axis = direction.to_track_quat('X', 'Z') * Vector((0.0, 0.0, 1.0)) deviate_dir = Quaternion(axis, branch_angle) * direction offset = 0.0 if branching == 1: offset = 2.4 elif branching == 2: offset = 1.5708 + twist elif branching == 3: offset = 2.4 elif branching == 4: offset = 0.7854 + twist elif branching == 5: offset = 0.6283 elif branching == 6: offset = 0.5236 phyllotaxis_angle = initial_phyllotaxic_angle + offset * i phyllotaxis_angle += 6.2832 * j / branching phyllotaxis_angle %= 6.2832 flat_dir = parent_direction.copy() flat_dir.z = 0.0 horizontal = 1.0 - (abs(parent_direction.angle(flat_dir, 0.0)) / 1.5708) if parent_direction.x == 0.0 and parent_direction.y == 0.0: horizontal = 0.0 plagio = plagiotropism_buds * horizontal if plagio > 1.0: plagio = 1.0 if phyllotaxis_angle < 1.5708: phyllotaxis_angle = (1.0 - plagio) * phyllotaxis_angle elif phyllotaxis_angle < 4.7124: phyllotaxis_angle = plagio * 3.1416 + (1.0 - plagio) * phyllotaxis_angle else: phyllotaxis_angle = plagio * 6.2832 + (1.0 - plagio) * phyllotaxis_angle deviate_dir = Quaternion(direction, phyllotaxis_angle) * deviate_dir flat_deviate_dir = deviate_dir.copy() flat_deviate_dir.z = 0.0 strength = (1.0 - horizontal) * plagiotropism_buds deviate_dir = deviate_dir.lerp(flat_deviate_dir, strength) if gravitropism_buds < 0.0: vector_up = Vector((0.0, 0.0, 1.0)) deviate_dir = deviate_dir.lerp(vector_up, -gravitropism_buds) else: vector_down = Vector((0.0, 0.0, -1.0)) deviate_dir = deviate_dir.lerp(vector_down, gravitropism_buds) return deviate_dir