2011-08-26 5 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