4
$\begingroup$

Goal: I am trying to create a helix made of stacks of an object.

How I tried to do it:

  1. I created an Archimedian Spiral with the desired dimenisons
  2. Since the object itself always is distorted when I use the Array Modifier fitting a curve, I created a plane. I set the plane to be the parent of the object and turned on face instancing for the plane.
  3. I added an Array Modifier (fit curve) to the plane and set the desired repeat distance. Further, I added a Curve Modifier and selected the spiral for both modifiers. The result for the planes is pretty much what I desire. However, the child object of the plane still rotates and gets distorted in a weird way, instead of keeping the original orientation and scale relative to the plane. The result looks like this: spiral with distorted main object

In the following picture, you can see the object and the plane as I initially parented them. This is also how I would want the object to apply to the planes along the spiral. desired orientation and location of the object relative to the planes

Is there a simple way to do it? A very tedious solution would be to align the object to each plane manually. I once extracted the planes as individual objects and tried to transform the respective orientations to the objects. The problem was that the resulting orientations did not match the actual orientations of the planes, which means that I would have ended up aligning everything manually. If anyone knows a simple way to reliably place the objects on the planes (ideally as in the second image), it would help me a lot too.

$\endgroup$
17
  • $\begingroup$ This is a perfect example for using geometry nodes! Did u ever consider it? $\endgroup$
    – Chris
    Commented Sep 2, 2022 at 10:19
  • $\begingroup$ The asker may not be familiar with GeoNodes, or even Blender in general, so there is probably a friendlier way of phrasing that comment, Chris. If you have a solution, maybe post a full answer and explanation instead of vaguely pointing in a direction? $\endgroup$
    – Onyx
    Commented Sep 2, 2022 at 10:38
  • $\begingroup$ Indeed, I am not familiar with geometry nodes and pretty new to Blender. Thanks for mentioning geometry nodes, though! I would highly appreciate if you could be more specific or refer to a suitable tutorial. Is it after creating the plane array, when I should use GeoNodes, or is it a completely different approach? $\endgroup$
    – Pat D
    Commented Sep 2, 2022 at 10:58
  • $\begingroup$ hello could you please make a drawing of what you're trying to achieve with the instances? for example is it supposed to stay vertical etc? $\endgroup$
    – moonboots
    Commented Sep 2, 2022 at 11:22
  • $\begingroup$ Hi, imagine you have the upper image with just the planes (without the object) along the spiral. Now, if you replace each plane with the object as in the second picture, you would have what I want to achieve. So, let's say the object in the second picture is parallel to the plane with the center of the object being on the plane. I want the object to be parallel to each of the planes in the spiral without being deformed. If I simply use the plane as the parent of the object, I get the the top picture, meaning that each object is not parallel to the planes and also deformed. I hope this helps! $\endgroup$
    – Pat D
    Commented Sep 2, 2022 at 11:49

1 Answer 1

8
$\begingroup$

An example how to do this in Geometry Nodes, best would be to use the Geometry Nodes wokspace layout by clicking it at the top menu bar.

  1. In your example you have a single object if I see it correctly (you don't need the plane for this version)? But if not, you can select all objects you want to place on the curve and press M > New Collection and give it a name.

  2. Select the Spiral object, go into the Geometry Nodes Editor window and click New. Now a new nodetree appears with just two nodes: a Group Input and a Group Output. Without giving a full tutorial let's just say this, the input provides the original data of the curve and sends it to the output so that it produces the curve. And we can manipulate things inbetween.

new nodetree

  1. Drag the object (or collection of objects) which you want to place along the curve from the Outliner into the nodetree. If it's a collection, make sure Separate Children is not enabled.

add collection

  1. Now add a new node, Shift+A > Add > Instances > Instance on Points (not to be confused with the Instances to Points node!) and plug it between Group Input and Group Output, the input's Geometry into Points input, the Instances output into the Geometry group output. The collection's Geometry output goes into Instance. Okay, too many similar confusing terms, here's a picture - you can immediately see that the objects are placed on the curve:

instances

  1. One object (collection) is placed on each vertex of the curve. If you are not happy with the amount, you can change it with a Resample Curve node (Shift+A > Add > Curve). You can set a different Count if you want a certain number of elements or a Length, if you want them all to be 0.2 meters apart from each other for example.

resampling the curve

  1. Now you have them all aligned just in the object's (collection's) default orientation. If you want to align them with the curve tangent, you need two more nodes: a Curve Tangent node (Shift+A > Add > Curve) and the Align Euler to Vector node (Shift+A > Add > Utilities). Plug the Tangent output of the first node into the Vector input of the second node, there select the alignment to Z and set Pivot to Auto. Then plug the Rotation output into the Rotation input of the Instance on Points node. Again, confusing terms, here's a picture:

align objects

This should do what you want if I understand the question correctly.

//EDIT: To rotate the instances on their local axes, you can plug a Rotate Euler node after the Align Euler to Vector node. Set it to Euler and Local and you can enter values in degrees for each axis. To increase the rotation per instance you can multiply the rotation per step with the indices of the instances. They always start with 0, so let's say you want 10°, the first won't be rotated, the next 1 × 10°, then 2 × 10° etc. To decide on which axis to rotate you can plug the degrees into a Combine XYZ node, however (although the Rotate Euler works with degrees), the Combine XYZ interprets them as radians. So to make it easy and not have to convert the rotation manually from degrees to radians, just plug a To Radians node after the multiplication. Many words again, hence an image and the blend file below. By the way, this would also work if you do the local rotation before the tangent alignment, you would just leave the Rotation input of the Rotate Euler node empty and instead plug the result into the Rotation input on the Align Euler to Vector node.

local rotation

$\endgroup$
2
  • 1
    $\begingroup$ Thanks a lot! For now it seems that your reply will solve all my problems. $\endgroup$
    – Pat D
    Commented Sep 2, 2022 at 13:49
  • 1
    $\begingroup$ And indeed it did! Thank you so much :-) $\endgroup$
    – Pat D
    Commented Sep 2, 2022 at 15:15

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .