Search

CINEMA4D 에서 fOSC 사용하기

요약
fOSC 수정방법을 소개합니다.
분류
plugin
태그
python
작성일
2020/11/13
1 more property

테스트 환경

CINEMA4D 21, 22, 23
macOS High Sierra, macOS Catalina
iphone X

배경

몇년전에 반복작업을 줄이고 불편한 조작이 요구되는 부분을 개선하고자 OSC 라는 것을 접하게 되었다. OSC(Open Sound Control) 를 이용하면 RC 조정하듯 애니메이션을 작업을 할 수 있을 것으로 기대했고 OSC를 CINEMA4D 에서 이용하려고 시도했었지만, Scene 세팅과도 밀접한 관련이 있다보니 상황에 따라 간단히 작동하기도하고 그렇지 않은 경우가 생겼고 어디서 부터 손을 대야 할지 몰라 한참을 잊고 있다가 최근에서야 제대로 들여다 보고 프로젝트에 사용이 가능할 정도로 개발할 수 있었다.
개발내용을 전부 공개할 수는 없지만, 작동이 가능하도록 만들어보자.

fOSC

먼저 fOSC 플러그인을 공개한 h.y. tien 님께 감사의 뜻을 전합니다. Thank you for share, h.y.tien.
이 플러그인은 NI Mate OSC Receiver 를 기반으로 제작되었고, NI MATE 쪽 소프트웨어와 연동은 필요하지 않다. 다운로드는 위 링크에서 code > download zip 으로 받을 수 있다.
C4D 설치는 플러그인 폴더에 넣거나 CINEMA 4D 플러그인 설정에 등록하면 된다. 설치를 마치고 아래 그림과 같은 창이 열렸지만, 작동은 되지 않을 것이다. fOSC는 기본적으로 내부 메시지를 받도록 제작되어 외부 디바이스와 연결을 위해서는 수정이 필요하다.
C4D 를 구동한 컴퓨터와 핸드폰은 받드시 같은 공유기로 연결되어 있어야한다.

R21, 22, 23을 위한 수정

Cinema 4D R23 only run on Python 3.7.7 and doesn’t support Python 2.7.X code.
2.7 과 3,7 의 호환을 위해 필요한 수정을 해볼 것이다.
1.
51 line 의 ip 가 localhost 로 되어있는데 삭제하거나 현재 컴퓨터에 설정된 내부 IP로 변경한다.
# Server Info IP_ADDRESS = "" # or 192.168.0.XXX DEFAULT_PORT = 7000
Python
복사
2.
C4D > Extensions > Tools > Reload Python Plugins
3.
print 수정 : print "xxxx" → print("xxx")
print("OSCMessage's typetag-string lacks the magic ',' ") # 168 print("error setting up receiver") # 293 print(type(inst)) # 294 print(inst) # 295 print("error deleting receiver, it may not exist. ~ ~ ~") # 312 print(type(inst)) # 313 print(inst) # 314
Python
복사
4.
328 line 에서 ( , ) 삭제 : lambda (text):lambda text:
5.
self.socket.recv(1024) 메시지 타입 반영
R22(2.7) : <type 'str'> R23(3.7) : <class 'bytes'>
지금부터 수정할 내용이 가장 힘들게 했던 부분이다. 2.7에서는 메시지를 string 타입으로 메시지를 받지만, 3.7은 bytes 타입으로 받기 때문에 decode 처리에서 에러가 발생한다. fOSC 안에는 타입별 처리 코드를 갖고있다. 그 코드를 활용할 수 있도록 수정하면 된다. readString 함수를 readByte 함수로 변경하고 , 바이트 문자를 utf-8 로 디코딩 하도록 수정한다.
# before address, rest = OSC.readString(data) # 136 line # after address, rest = OSC.readByte(data) # 136 line address = address.decode('utf-8') # add # ------------------------------------------------------------- # before typetags, rest = OSC.readString(rest) # 159 line # after typetags, rest = OSC.readByte(rest) # 159 line typetags = typetags.decode('utf-8') # add
Python
복사
여기까지 수정했다면 fOSC의 구동을을 위한 최소한의 수정은 끝났다. CINEMA4D 를 재실행하거나 Reload Python Plugnis 하고 iphone 과 연동이 되는지 확인해 보자.

OSC app test

중간 평가

잘 된다.
fOSC는 입력된 메시지를 주소와 값으로 짝지어진 데이터로 변경하고, 주소를 이름으로 하는 null 오브젝트를 추가한다. 값은 Position X (Y, Z) 에 업데이트해준다.
이 값을 XPresso, python 을 이용하여 다른 오브젝트를 제어하는데 사용하는데 단순한 0~1의 단순한 데이터를 원하는 형태로 변형하기 위한 세팅에 추가적인 시간이 필요하다.
그리고 가장 큰 문제는 CINEMA4D 의 뷰포트 성능이다. 이부분은 개발 후반에 컨트롤러와 입력 데이터가 늘어나면서 프레임 레이트가 30 아래로 떨어지는 경우도 발생했다. 리얼타임처럼 작동하려면 씬을 최대한 최적화하거나 self.SetTimer(10) 의 숫자를 높이는 방법이다. 10ms 간격으로 데이터 를 확인하게되는데 self.SetTimer(100) 이렇게 하면 1/10 초가 된다.
다음 편으로 fOSC 와 Face Cap 연동에대해서 작성할 예정이다.