Untitled

 avatar
unknown
plain_text
a year ago
1.7 kB
5
Indexable
import bpy
from mathutils import Vector as vec
from math import exp, cos, sin, pi, atan2, fmod
from random import uniform

wall = 9.0
speed = 0.25
repulsion_strength=0.25
wall_repulsion_strength=0.5
alignment_strength=0.1
repulsion_zone_width=0.8
alignment_zone_width=1.0
keyframe_interval=10
frames=2000
print("hello")

Fish = bpy.data.collections['Fish'].objects
velocities = [vec([0,0,0])] * len(Fish)

for i,f in enumerate(Fish):
    ang = uniform(0, 2*pi)
    v = speed*vec((cos(ang), sin(ang), 0))
    velocities[i] = v
    f.location = vec((uniform(-wall,wall), uniform(-wall,wall), 0))
    f.keyframe_insert(data_path="location", frame=1)
    f.rotation_euler[2] = atan2(v.y, v.x) + pi
    f.keyframe_insert(data_path="rotation_euler", frame=1)

def calculate_wall_repulsion(position):
    repulsion = vec([0, 0, 0])
    for axis in range(2):
        if position[axis] > wall - repulsion_zone_width:
            repulsion[axis] -= wall_repulsion_strength * (wall - position[axis]) / repulsion_zone_width
        elif position[axis] < -wall + repulsion_zone_width:
            repulsion[axis] += wall_repulsion_strength * (-wall - position[axis]) / repulsion_zone_width
    return repulsion

for frame_no in range(1,int(frames/keyframe_interval)):
    for i,f in enumerate(Fish):
        p = f.location
        v = velocities[i]
        
        wall_repulsion = calculate_wall_repulsion(p)
        print(v, wall_repulsion)
        v += wall_repulsion
        
        p += v
        f.keyframe_insert(data_path="location", frame=frame_no*keyframe_interval)
        f.rotation_euler[2] = atan2(v.y, v.x) + pi
        f.keyframe_insert(data_path="rotation_euler", frame=frame_no*keyframe_interval)
        print(f.location)
        
Editor is loading...
Leave a Comment