Applying turbulence to a grid of clones [SOLVED]
On 11/05/2015 at 00:26, xxxxxxxx wrote:
I'm rather new at python and up to this point I've fought the urge to post my newbie questions, but I can't seem to find any resources on how to apply turbulent noise to a 3d grid of clones.
I'm using cinema's matrix object to generate the grid and a python effector for what will soon, hopefully, be the turbulent rotation (I only want to effect the rotation). When I compile the code below, each element is rotated the same amount, but my desired result looks like what you get when you use the turbulence setting on a random deformer:
My question is, how can I apply turbulence to the 3d grid as a whole to get a result similar to the picture? Here's what I have so far:
def main() :
md = mo.GeGetMoData(op)
if md==None: return False
cnt = md.GetCount()
marr = md.GetArray(c4d.MODATA_MATRIX)
fall = md.GetFalloffs()
for i in reversed(xrange(0, cnt)) :
pos = marr.off
rot = utils.MatrixToHPB(marr)
scale = c4d.Vector(marr.v1.GetLength(), marr.v2.GetLength(), marr.v3.GetLength())
rot = c4d.Vector(c4d.utils.noise.Turbulence(c4d.Vector(rot.x, rot.y, rot.z), 4, False))
marr = utils.HPBToMatrix(rot)
marr.off = pos
marr.v1 = marr.v1.GetNormalized() * scale.x
marr.v2 = marr.v2.GetNormalized() * scale.y
marr.v3 = marr.v3.GetNormalized() * scale.z
md.SetArray(c4d.MODATA_MATRIX, marr, True)
_ _ _ return True___
_ _ _______________________________________________
_ _ Thanks.__
_ _ Robert__
On 12/05/2015 at 03:35, xxxxxxxx wrote:
there are a bunch of issues with your code. The main problem is, that you are not accessing the array (marr) correctly. And you might want to set your Python Effector to "Full Control" instead of parameter control, then you don't return a value from main.
Here's something I came up with:
import math import c4d from c4d.modules import mograph as mo #Welcome to the world of Python def main() : md = mo.GeGetMoData(op) if md==None: return 1.0 # False marr = md.GetArray(c4d.MODATA_MATRIX) for i in xrange(0, len(marr)) : pos = marr[i].off turb = c4d.utils.noise.Turbulence(pos, 4, False) # Sampling at position, Turbulence delivers -1 to 1 # get rotation matrices rotx = c4d.utils.MatrixRotX(turb * math.pi) roty = c4d.utils.MatrixRotY(turb * math.pi) rotz = c4d.utils.MatrixRotZ(turb * math.pi) # rotate marr[i] *= rotx marr[i] *= roty marr[i] *= rotz md.SetArray(c4d.MODATA_MATRIX, marr, True)
Hope this helps and is at least similar to what you are after.
On 14/05/2015 at 14:02, xxxxxxxx wrote:
Thank you, Andreas.
This is much closer to what I'm after.
Now they're all facing different, seemingly random directions, but if I scale the grid down enough I think I can start to see some order in the rotations. So I think.. I just have to figure out how to up the noise scale...? I have an example from someone else where noise scale is controlled by incorporating the grid resolution and the ids of each element. Somehow.
Looking forward to it
On 15/05/2015 at 00:07, xxxxxxxx wrote:
There are a bunch of parameters you could change to the outcome:
- maybe you don't want to sample by position
- or you may want to scale the sampling points by scaling down the vector that goes into Turbulence
- perhaps you don't want full plus/minus 180 degree rotation, change factor on building rotation matrices
- number of octaves on Turbulence should also have an effect
On 15/05/2015 at 00:42, xxxxxxxx wrote:
pos = marr[i].off/500
Pow, pow, pow. Yes, that second method worked perfectly.
Many thanks, Andreas, especially for taking the time to write out some code.