Skip to content

Instantly share code, notes, and snippets.

@baku89
Last active February 18, 2018 09:06
Show Gist options
  • Select an option

  • Save baku89/e0472173109d1a76a6674c6d8540939d to your computer and use it in GitHub Desktop.

Select an option

Save baku89/e0472173109d1a76a6674c6d8540939d to your computer and use it in GitHub Desktop.
Output keyframe texture from C4D
import c4d
from c4d.modules import mograph as mo
from PIL import Image
from math import pi
duration = 677.64 / 60
amp = doc.SearchObject("waveform-clone")
offsetDeformer = doc.SearchObject("offset")
twistDeformer = doc.SearchObject("twist")
exchangeDeformer = doc.SearchObject("exchange")
def redraw():
c4d.DrawViews(c4d.DA_ONLY_ACTIVE_VIEW|c4d.DA_NO_THREAD|c4d.DA_NO_REDUCTION|c4d.DA_STATICBREAK)
c4d.GeSyncMessage(c4d.EVMSG_TIMECHANGED)
c4d.EventAdd(c4d.EVENT_ANIMATE|c4d.EVENT_FORCEREDRAW)
def getValueAtTime(time):
doc.SetTime(c4d.BaseTime(time))
redraw()
md = mo.GeGetMoData(amp)
values = []
for i in xrange(1, 9):
m = md.GetArray(c4d.MODATA_MATRIX)[i]
values.append( m.off.y )
twist = mapNormal(twistDeformer[c4d.DEFORMOBJECT_ANGLE], -pi * 2, +pi * 2)
offset = mapNormal(offsetDeformer[c4d.ID_MG_BASEEFFECTOR_STRENGTH], -1, +1)
exCenter = exchangeDeformer[c4d.ID_BASEOBJECT_REL_POSITION,c4d.VECTOR_X]
exchange = mapNormal(exCenter, 130, -40)
return {
"waveform": values,
"twist": twist,
"offset": offset,
"exchange": exchange
}
def mapNormal(t, minValue, maxValue):
return (t - minValue) / (maxValue - minValue)
def generateTexture():
sampleNum = 512
freqNum = 8
trackNum = 4
freqData = [[] for i in xrange(freqNum)]
vaporTrack = [[] for i in xrange(trackNum)]
for f in xrange(sampleNum):
t = (float(f) / sampleNum) * duration
data = getValueAtTime(t)
for i, value in enumerate( data["waveform"] ):
freqData[i].append( value )
vaporTrack[0].append( data["twist"] )
vaporTrack[1].append( data["offset"] )
vaporTrack[2].append( data["exchange"] )
# clamp min:max
for i in xrange(freqNum):
minValue = min(freqData[i])
maxValue = max(freqData[i])
for f in xrange(sampleNum):
freqData[i][f] = mapNormal(freqData[i][f], minValue, maxValue)
# generate texture
tex = Image.new('RGB', (sampleNum, freqNum))
for x in range(sampleNum):
for y in range(freqNum):
r = int(freqData[y][x] * 255)
g = int(vaporTrack[int(y / 4)][x] * 255)
b = int(vaporTrack[2][x] * 255)
tex.putpixel((x, y), (r, g, b))
tex.save('./keyframes.png')
print "Done"
def main():
generateTexture()
if __name__=='__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment