결과
gif
video
출처
코드
import c4d
from c4d.modules import mograph as mo
import random
def main():
moData = mo.GeGetMoData(op)
if moData is None:
return False
cnt = moData.GetCount()
marr = moData.GetArray(c4d.MODATA_MATRIX)
farr = moData.GetArray(c4d.MODATA_FLAGS)
frame = doc.GetTime().GetFrame(doc.GetFps())
visibles = op[c4d.ID_USERDATA,2]
invisibles = cnt - visibles - 1
global indexes
hasField = op[c4d.FIELDS].HasContent()
fall = moData.GetFalloffs()
# farr 은 항상 [1,1,1,1~~~1] 로 리셋되고 함수안에서 indexes 에 맞게 0으로 변경된다.
# 리셋된 indexes 에 감출 수 만큼 고유번호를 포함할때까지 반복한다.
# 클론수(50개)에 비해 감추는 수가 많을수록 계산반복횟수가 늘어난다.
# 카운트를 0일때 1 로 시작한 리스트를 전부 0으로 바꿔야하기때문에 많이 느리다.
# 0일때(전체감춤) 350회전도 반복해야 전체를 0으로 바꿀수 있다.
# 전체카운트와 감출수를 비교하여 절반 이상을 감출경우 0으로 시작해서 1로
def generate_hexagons():
i = 0
while len(indexes) <= invisibles:
rnd = random.randint(0, cnt-1)
if rnd not in indexes:
indexes.append(rnd)
i += 1
print i
for i in range(len(indexes)):
# farr[indexes[i]] = farr[indexes[i]] & ~(c4d.MOGENFLAG_CLONE_ON)
# farr[indexes[i]] = 0 이렇게도 가능하다.
# bitwise operator(&, ~)를 사용하여 2비트 연산을 하게된다.
# ~ 는 보수를 뜻하고 1이면 0을 넣으라는 뜻이 된다.(추측)
farr[indexes[i]] &= ~(c4d.MOGENFLAG_CLONE_ON)
def hold_hexagons():
for i in range(len(indexes)):
farr[indexes[i]] &= ~(c4d.MOGENFLAG_CLONE_ON)
if frame == 0 or frame % op[c4d.ID_USERDATA,1] == 0:
indexes = []
generate_hexagons()
else:
hold_hexagons()
moData.SetArray(c4d.MODATA_MATRIX, marr, hasField)
moData.SetArray(c4d.MODATA_FLAGS, farr, hasField)
return True
Python
복사
중복 코드 제거
import c4d, random
from c4d.modules import mograph as mo
def main():
moData = mo.GeGetMoData(op)
if moData is None:
return False
cnt = moData.GetCount()
marr = moData.GetArray(c4d.MODATA_MATRIX)
farr = moData.GetArray(c4d.MODATA_FLAGS)
frame = doc.GetTime().GetFrame(doc.GetFps())
visibles = op[c4d.ID_USERDATA,2]
invisibles = cnt - visibles - 1
global indexes
hasField = op[c4d.FIELDS].HasContent()
fall = moData.GetFalloffs()
def generate_hexagons():
while len(indexes) <= invisibles:
rnd = random.randint(0, cnt-1)
if rnd not in indexes:
indexes.append(rnd)
if frame == 0 or frame % op[c4d.ID_USERDATA,1] == 0:
indexes = []
generate_hexagons()
for i in range(len(indexes)):
farr[indexes[i]] &= ~(c4d.MOGENFLAG_CLONE_ON)
moData.SetArray(c4d.MODATA_MATRIX, marr, hasField)
moData.SetArray(c4d.MODATA_FLAGS, farr, hasField)
return True
Python
복사