Exemple #1
0
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