Hexagon display effector

요약
랜덤하게 일정수의 클론 감추기
분류
mograph
태그
python
effector
작성일
2020/06/17
결과
gif
출처
코드
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
프로젝트 파일
hexagon display.c4d
140.7KB
Today