2011-08-26 132 views
0

假设我画在OpenGL一些简单的线条像这样:绘制抖动的线条在OpenGL

glBegin(GL_LINES); 
glVertex2f(1, 5); 
glVertex2f(0, 1); 
glEnd(); 

如何使线看起来战战兢兢,就像是被绘制或手工绘制的?

+0

喜欢它一次画一点,或者像线本身看起来破烂(不像素)? –

+0

基本上它意味着你需要更新每个帧的顶点位置,从初始位置有一点抖动。我有一个示例代码完成这个在Delphi中:http://doodles.googlecode.com/svn/trunk/Sketching/ – Kromster

回答

1

你可以尝试把你的排队分成几部分,然后用rand()添加一些随机噪声。

这是一些丑陋但希望有点有用的代码。您可以重构这个需要:

const float X1= 1.0f, Y1 = 5.0f, X2 = 0.0f, Y2 = 1.0f; 
const int NUM_PTS = 10; //however many points in between 

//you will need to call srand() to seed your random numbers 

glBegin(GL_LINES); 
glVertex2f(START_X, START_Y); 
for(unsigned i = 0; i < NUM_PTS; i += 2) 
{ 
    float t = (float)i/NUM_PTS; 
    float rx = (rand() % 200 - 100)/100.0f; //random perturbation in x 
    float ry = (rand() % 200 - 100)/100.0f; //random perturbation in y 
    glVertex2f(t * (END_X - START_X) + r, t * (END_Y - START_Y) + r); 
    glVertex2f((t + 1) * (END_X - START_X), (t + 1) * (END_Y - START_Y)); 
} 
glVertex2f(END_X, END_Y); 
glEnd(); 

我增加了2环和借鉴每隔一点没有随机扰动,使线段都连接在一起。

您可能想知道glBegin/glEnd样式被称为“即时模式”并且效率不高。它甚至在一些移动平台上不被支持。如果你发现你的东西很呆板,看看使用顶点数组。

为了使线看起来手绘和更好,你可能也想使它更胖,并使用抗锯齿。

+0

在曲线笔画,这将工作贝塞尔曲线? – Carven

+0

假设你有一种方法来操作你正在绘制的顶点,你可以使用相同的技术来生成贝塞尔曲线。不知道效果会有多棒。这是你可能不得不摆弄的东西,但在图形方面这是标准。 – mwd

+0

显然,线路位于主线周围的随机位置,主线由START_X和START_Y定义到它们的END。有什么我需要注意,而试图摆脱它? – Carven