我创建了一个非常天真的页面,它需要三.js场景(尽管这可能是任何非WebGL<canvas>
动画)并导出单个图像(或图像序列),然后将其转换为视频。在
我之所以这么做,部分是为了学习Python,同时也是为了能够在三.js然后出口一个巨大的高分辨率丝般光滑的视频对我来说是超级有吸引力的。在过去,我用屏幕捕捉软件来抓取视频,虽然它总是感觉有点笨拙,实时的FPS下降也会在最后的视频中显示出来。在
我目前的流程如下:
Javascript:
requestAnimationFrame
渲染场景toDataURL()
,并检索base64字符串Python:
import base64, cgi, cgitb, datetime, glob, re, os
cgitb.enable()
#cgitb.enable(display=0, logdir='/tmp')
print "Content-type: text/html"
print
def main():
form = cgi.FieldStorage()
saveLocation = "../httpdocs/export/"
# POST variables
dataURL = form['dataURL'].value
captureSequence = form['captureSequence'].value
folderName = saveLocation + form['folderName'].value
saveImage(dataURL, captureSequence, saveLocation, folderName)
def saveImage(dataURL, captureSequence, saveLocation, folderName):
# strip out MIME content-type (e.g. "data:image/png;base64,")
dataURL = dataURL[dataURL.index(','):]
decodedString = base64.decodestring(dataURL)
if captureSequence == 'true':
# based off http://www.akeric.com/blog/?p=632
currentImages = glob.glob(folderName + "/*.jpg")
# TODO: perhaps filenames shouldnt start at %08d+1 but rather %08d+0?
numList = [0]
if not os.path.exists(folderName):
os.makedirs(folderName)
for img in currentImages:
i = os.path.splitext(img)[0]
try:
num = re.findall('[0-9]+$', i)[0]
numList.append(int(num))
except IndexError:
pass
numList = sorted(numList)
newNum = numList[-1] + 1
saveName = folderName + '/%08d.jpg' % newNum
else:
if not os.path.exists(saveLocation):
os.makedirs(saveLocation)
saveName = saveLocation + datetime.datetime.now().isoformat().replace(':', '.') + '.jpg'
# TODO; rather than returning a simple string, consider returning an object?
try:
output = open(saveName, 'w')
output.write(decodedString)
output.close()
print 'true'
except Exception, e:
print e
if __name__ == '__main__':
main()
Javascript:
这是我总是在本地运行的,这样就不会有写冲突或类似的风险。在
我做了一些快速的测试,如果有点慢的话,大多数情况下都是有效的。在
requestAnimationFrame
将更新周期限制为60fps,是否可以轻松地设置较低的帧速率?假设出于某种风格原因,我想以每秒15帧的速度更新所有内容,那么唯一的选择是使用setTimeout(callback, 1000 / targetFPS)
,并理解它将drift over time?在从上面开始,这个动画有一个变量frame
,它在每个更新周期中递增1
。然后,该变量用于控制动画的不同部分(例如,旋转立方体,并传递到顶点/片段着色器以操纵颜色和纹理UV坐标)。在
如果我想模拟15fps之类的东西,我需要将frame
增加(60 / 15)
而不是正确的?有没有一种更优雅的方式可以轻松地在封顶帧速率之间切换?
我真的希望这是有意义的,任何意见或建议将被广泛赞赏。在
源文件:http://cl.ly/3V46120C2d3B0A1o3o25(在Mac/Chrome稳定版上测试,需要WebGL)
在EaselJS中,您可以设置FPS
EaselJS Ticker
相关问题 更多 >
编程相关推荐