Last active
February 18, 2018 09:06
-
-
Save baku89/e0472173109d1a76a6674c6d8540939d to your computer and use it in GitHub Desktop.
Output keyframe texture from C4D
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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