Cinema4D tip - Random Walker Effector
Random Walker Python Effector for Cinema 4D Cloner: original code made by Colin Sebestyen and enhanced with the invaluable help of Frubelsa; explanation on how to set up User Data at the end of video.
Scenes shamelessly copied from Tendril "AutoStore".
Scene file for R18-21: https://drive.google.com/file/d/1SahMu3k2KFfR_C2L6RnYmFLxr9rPOxml/view?usp=sharing
/ / / / / / Python Code / / / / / /
import c4d
from c4d.modules import mograph as mo
from c4d import utils as u
import random
walker = []
choiceData = []
startingPosForStepData = []
pF = -1 # Previous Frame
class Walker():
def __init__(self, location):
self.location = location
self.x = self.location[0]
self.y = self.location[1]
self.z = self.location[2]
def getStartingPosForStep(self, choice):
if choice == 0 or choice == 1:
return self.x
elif choice == 2 or choice == 3:
return self.y
elif choice == 4 or choice == 5:
return self.z
def move(self, index, cF, nF, step, stepsize, spline, width, height, depth, seed, clamped):
global choiceData, startingPosForStepData
if choiceData[index] == -1 or (cF % nF) == 0:
random.seed(cF+index+seed)
choice = random.randint(0, 5)
startingPosForStep = self.getStartingPosForStep(choice)
choiceData[index] = choice
startingPosForStepData[index] = startingPosForStep
valueToMap = ((cF % nF) + 1) * step
mapstep = u.RangeMap(valueToMap, 0, stepsize, 0, stepsize, False, spline)
if choiceData[index] == 0:
self.x = startingPosForStepData[index] + mapstep
elif choiceData[index] == 1:
self.x = startingPosForStepData[index] - mapstep
elif choiceData[index] == 2:
self.y = startingPosForStepData[index] + mapstep
elif choiceData[index] == 3:
self.y = startingPosForStepData[index] - mapstep
elif choiceData[index] == 4:
self.z = startingPosForStepData[index] + mapstep
elif choiceData[index] == 5:
self.z = startingPosForStepData[index] - mapstep
if clamped == 1:
self.x = u.ClampValue(self.x, -width/2, width/2)
self.y = u.ClampValue(self.y, -height/2, height/2)
self.z = u.ClampValue(self.z, -depth/2, depth/2)
self.location = c4d.Vector(self.x, self.y, self.z)
def initWalker(marr, count):
global walker
for i in xrange(0, count):
walker.append(Walker(marr[i].off))
choiceData.append(-1)
startingPosForStepData.append(0)
def main():
global walker, choiceData, startingPosForStepData, pF
md = mo.GeGetMoData(op)
# if there is no Modata, skip it
if md == None: return False
marr = md.GetArray(c4d.MODATA_MATRIX)
count = md.GetCount()
start = md.GetArray(c4d.MODATA_STARTMAT)
# userData
width = op[c4d.ID_USERDATA, 1]
height = op[c4d.ID_USERDATA, 2]
depth = op[c4d.ID_USERDATA, 3]
stepsize = op[c4d.ID_USERDATA, 4]
nF = op[c4d.ID_USERDATA, 5]
spline = op[c4d.ID_USERDATA, 6]
seed = op[c4d.ID_USERDATA, 7]
clamped = op[c4d.ID_USERDATA, 8]
# calculate step
step = stepsize / nF
cF = doc.GetTime().GetFrame(doc.GetFps())
# if pF == (cF - 1):
if (cF == 0):
md.SetArray(c4d.MODATA_MATRIX, start, True)
walker = []
choiceData = []
startingPosForStepData = []
pF = -1
return True
initWalker(marr, count)
# if pF == (cF - 1):
for i in reversed(xrange(0, count)):
walker[i].move(i, cF, nF, step, stepsize, spline, width, height, depth, seed, clamped)
marr[i].off = walker[i].location
md.SetArray(c4d.MODATA_MATRIX, marr, True)
return True
if __name__ == "__main__":
main()
/ / / / / / End Code / / / / / /
Что делает видео по-настоящему запоминающимся? Наверное, та самая атмосфера, которая заставляет забыть о времени. Когда вы заходите на RUVIDEO, чтобы посмотреть онлайн «Cinema4D tip - Random Walker Effector», вы рассчитываете на нечто большее, чем просто загрузку плеера. И мы это понимаем. Контент такого уровня заслуживает того, чтобы его смотрели в HD 1080, без дрожания картинки и бесконечного буферизации.
Честно говоря, Rutube сегодня — это кладезь уникальных находок, которые часто теряются в общем шуме. Мы же вытаскиваем на поверхность самое интересное. Будь то динамичный экшн, глубокий разбор темы от любимого автора или просто уютное видео для настроения — всё это доступно здесь бесплатно и без лишних формальностей. Никаких «заполните анкету, чтобы продолжить». Только вы, ваш экран и качественный поток.
Если вас зацепило это видео, не забудьте взглянуть на похожие материалы в блоке справа. Мы откалибровали наши алгоритмы так, чтобы они подбирали контент не просто «по тегам», а по настроению и смыслу. Ведь в конечном итоге, онлайн-кинотеатр — это не склад файлов, а место, где каждый вечер можно найти свою историю. Приятного вам отдыха на RUVIDEO!
Видео взято из открытых источников Rutube. Если вы правообладатель, обратитесь к первоисточнику.