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 sin
:
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 numpy
+ 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[0], 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!