Over the days I wrote a little script which calculates the FieldLines of a charged mesh’s volume.

Usage:

- Add charges to the Object as a Particle System

(Every Partice represents a point charge) - Reconfigure Parameters of the script (charge and numSegments are the important ones)
- Run Script
- Get great results !

Todo: - Multible Particels as Field influence

- Make the whole thing animatable

- Positive charges

Have fun and let me see what you’re doing with it.

Demo Model Twisted Torus with FieldLines:

Screenshot:

Script:

import bpy,math

from mathutils import Vector

charge = 0.0001

numSegments = 250

w = 1

#get the first selected Object

object = bpy.context.selected_objects[0]

#get the charges in the Volume of the mesh (=Input)

charges = object.particle_systems[0].particles

#so for each “line” do the pyhisics calulation

for j, v in enumerate(object.data.vertices):

#for each segment of the line calculate the points for

#the field lines`#generate the resulting fieldline-curve fieldline = bpy.data.curves.new( name=object.name+'_fieldLine'+str(j), type='CURVE') fieldline.dimensions = '3D' polyline = fieldline.splines.new('POLY') #print the current progress of the calculations (how many fieldLines are #already generated) print(j,len(object.data.vertices)) polyline.points.add(numSegments-1) for i in range(numSegments): if(i == 0): #get the starting point of each fieldLine for easier access x = v.co.x y = v.co.y z = v.co.z else: #calculate the resulting field-vector by superposition(=Sum) #of the charge's force at the current point fx = 0 fy = 0 fz = 0 for c in charges: #Get the current vector which connects our fieldLines's point #with the current charge (From charge To point -> (From - To)) dx = x - c.location.x dy = y - c.location.y dz = z - c.location.z r = math.sqrt(dx*dx+dy*dy+dz*dz) fx += charge * (dx / (r*r*r)) fy += charge * (dy / (r*r*r)) fz += charge * (dz / (r*r*r)) x += fx y += fy z += fz`

`#add the fieldline's vertices to our calculated result polyline.points[i].co = (x, y, z, w) #paste the existing pydata into the object objectdata = bpy.data.objects.new(object.name+"FieldLine"+str(j), fieldline) objectdata.location = (0,0,0) #object origin bpy.context.scene.objects.link(objectdata) bpy.context.scene.update()`