I want to use Blender and bpy to create sinusoidal struts. I have been using Python with VTK in the past, but it is causing some trouble and I feel Blender might be the better solution.
An example of what I want to create is depicted below. It is planar in a sense that only one axis is modified with a
sin (or in this case
cos) function. It is also tilted by 45°, but that's not the big hurdle.
Since I am very new to Blender, I googled around a bit and found this: http://wiki.theprovingground.org/blender-py-mathmesh
It contains the following code that creates a surface that is modified with
import bpy import math # mesh arrays verts =  faces =  # mesh variables numX = 10 numY = 10 # wave variables freq = 1 amp = 1 scale = 1 #fill verts array for i in range (0, numX): for j in range(0,numY): x = scale * i y = scale * j z = scale*((amp*math.cos(i*freq))+(amp*math.sin(j*freq))) vert = (x,y,z) verts.append(vert) #fill faces array count = 0 for i in range (0, numY *(numX-1)): if count < numY-1: A = i B = i+1 C = (i+numY)+1 D = (i+numY) face = (A,B,C,D) faces.append(face) count = count + 1 else: count = 0 #create mesh and object mesh = bpy.data.meshes.new("wave") object = bpy.data.objects.new("wave",mesh) #set mesh location object.location = bpy.context.scene.cursor_location bpy.context.scene.objects.link(object) #create mesh from python data mesh.from_pydata(verts,,faces) mesh.update(calc_edges=True)
I just can't rewrite it to just creating a strut, though. Originally, I created the points using the following approach with
vtk, but when I try this in Blender I get error messages (
'Unsupported operand type(s) for /: "tuple" and "int"' on the line where I define
y in the function).
def strut(x, node_dist=5, amp=1): """Takes 1D array x, creates shape and normalizes it to fit the length of the cosine function.""" x = x * 2 / node_dist * np.pi # normalize length to fit [-4pi; 4pi] y = amp / 2 * np.cos(x) + amp / 2 # adjusting position and amplitude return y a = np.linspace(-2 * node_dist, 2 * node_dist, points_per_line) b = strut(a, node_dist, amp) - node_dist / 2. c = strut(a, node_dist, amp) + node_dist / 2. for i in range(0, a.shape, 1): if strut_number == 1: x = a[i] y = b[i] z = c[i]
If I could just get some help with being able to define how many points on the line I want(-> smoothness) and how to define the shape (ideally quadratic) around the strut I could figure the rest out myself. I hope my question is specific enough and not too odd. Thanks for any help!