2015-06-02 37 views
2

我只是在修改处理,以便在程序上制作一些.gif动画。出于某种原因,当我运行它时(以及使用GifAnimation将其导出时),我刚刚完成的那个有很多抖动。我不完全确定为什么会发生这种情况。处理动画非常紧张

借口下锅的工作是我的代码:

long lastTime = 0; 
float angle1, angle2, angle3, angle4, angle5, angle6; 
int change; 
public void setup() { 
    size(120, 120); 
    lastTime = millis(); 
    angle1 = -60; 
    angle2 = 240; 
    angle3 = -30; 
    angle4 = 210; 
    angle5 = -75; 
    angle6 = 255;  
    change = 3; 

    noFill(); 
    stroke(0); 
    strokeWeight(10); 
    smooth(); 
} 
public void draw() { 

    if (millis() - lastTime > 12) { 
    background(255,255,255); 
    lastTime = millis();  

    stroke(#3aa8c3); 
    arc(60, 60, 70, 70, radians(angle1), radians(angle2)); 
    ellipse(60, 60, 10, 10); 

    stroke(#e7e7e7); 
    arc(60, 60, 40, 40, radians(angle3), radians(angle4)); 
    arc(60, 60, 100, 100, radians(angle5), radians(angle6)); 

    angle1-=change*2; 
    angle2-=change*2; 
    angle3+=change*3; 
    angle4+=change*3; 
    angle5+=change; 
    angle6+=change; 

    } 
} 

结果如下: jittery gif

有什么事情我做错了,或者是单纯的限制处理环境?

编辑: 将渲染模式更改为P3D(size(120, 120, P3D);)后,事情运行得更加顺畅。它摆脱了圆角边缘,我不得不添加一些反锯齿(smooth(8)),但它不再抖动。透明背景也是一个好处: enter image description here

+0

它可能是低质量的抗锯齿。也许试试['smooth(8)'](https://processing.org/reference/smooth_.html)? – rhashimoto

+0

我只是将渲染模式改为'P3D',抖动是固定的。它摆脱了圆角和消除锯齿,但该命令使它看起来好多了。谢谢! – MattDs17

+1

可能重复[为什么这个摆动?](http://stackoverflow.com/questions/25194697/why-does-this-wobble) –

回答

1

你有更好的运气,如果你发布你的问题的最简单的形式,这样的事情:

public void setup() { 
    size(360, 360); 
    noFill(); 
    stroke(0); 
    smooth(10); 
} 
public void draw() { 
    background(255); 
    stroke(#3aa8c3); 
    arc(60, 60, 70, 70, radians(mouseX), radians(mouseY)); 
} 

这使我们能够消除的原因,更容易找到解决方案。

此外,我google搜索“处理弧颤抖”和“处理弧摆动”,发现this答案,其中说试试hint(ENABLE_STROKE_PURE)功能。当我再补充一点的例子,它似乎要好得多工作:

public void setup() { 
    size(360, 360); 
    noFill(); 
    stroke(0); 
    smooth(10); 
    hint(ENABLE_STROKE_PURE); 
} 
public void draw() { 
    background(255); 
    stroke(#3aa8c3); 
    arc(60, 60, 70, 70, radians(mouseX), radians(mouseY)); 
} 

setup()功能添加hint(ENABLE_STROKE_PURE);作为最后一行也似乎解决您的问题。

+0

这似乎也工作。谢谢! – MattDs17