2008-10-26 4 views
4

OpenGL 렌더링 용 자유 유리를 사용하고 있습니다 ...GLUT을 사용하여 OpenGL에서 콘처럼 채워진 봉투를 그리는 방법은 무엇입니까?

약간의 색상과 약간의 투명도가 적용된 원추형 (2D)처럼 보이는 봉투를 그려야합니다.

채워진 기하학 (또는 어떤 트릭)을 그리기위한 프리 빌트 툴킷이 내장 된 기능을 갖추고 있습니까? 또는 채워진 형상을위한 붙박이 지원이 다른 API를이 ..

EDIT1 : 그냥 2D 콘 일을 명확히 할 ... 봉투는 항공기의 커버리지 영역의 그래픽 해석이다 (적의 항공기의) 차단 중 ... .. 섹터를 대신 닮았습니다 .. 대신 섹터를 언급해야합니다 ..

그리고 glutSolidCone은 내가 채워진 원을 그리는 데 도움이되지 않습니다. . 내가 이미 한 일은 ... 할 일은 남아있는 색으로 채우는 것입니다. OpenGL에서 색으로 도형을 채우는 방법은 무엇입니까?

Edit2가 :이 질문에 게시 모든 응답 방식으로 내 문제에 대해 작업 할 수 있습니다 .. 하지만 난 확실히 약간의 색상과 형상을 입력하는 방법을 방법을 알고 싶어 할 것입니다. 포물선 인 봉투를 그려보고 싶다면 실제로 채워진 포물선을 그릴 기본 누락 기능이 없을 것입니다 (또는 어떤 것이 있습니까?) 그래서이 질문을 일반화하려면 ... 솔리드 컬러로 커스텀 지오메트리를 그리는 방법?

EDIT3 : GL_TRIANGLES에 대한하지만 이러한 코드에 대한 작품을 게시 mstrobl 대답 :

만 유선 사각형이 그려진 사각형을 ... 그립니다
glBegin(GL_LINE_STRIP); 

glColor3f(0.0, 0.0, 1.0); 
    glVertex3f(0.0, 0.0, 0.0); 
glColor3f(0.0, 0.0, 1.0); 
    glVertex3f(200.0, 0.0, 0.0); 
glColor3f(0.0, 0.0, 1.0); 
    glVertex3f(200.0, 200.0, 0.0); 
glColor3f(0.0, 0.0, 1.0); 
    glVertex3f(0.0, 200.0, 0.0); 
glColor3f(0.0, 0.0, 1.0); 
    glVertex3f(0.0, 0.0, 0.0); 

glEnd(); 

은 ... 내가 작성해야 그것은 푸른 색으로.

어쨌든 어떻게해야합니까?

나는 색으로 채울 필요가 pie..and curve..like 폐쇄에 대한 몇 가지 그리기 명령을 세우면 그것을 가능하게 할 수있는 방법이 ... 난 잘 모릅니다

의 가능한 GL_TRIANGLES ...하지만 닫힌 커브에 대해 어떻게해야합니까?

+0

2 차원 원추체를 명확히하기 위해 ... 봉투는 (적기의) 차단 중 항공기의 적용 범위를 그래픽으로 해석 한 것입니다. 원의 섹터와 비슷합니다. 섹터 대신 .. – ashishsony

+0

yoru 코멘트를 질문에 편집하십시오. 이유는 그것이 속한 곳이기 때문입니다. – Cheery

+0

내 원래 질문을 편집했습니다 .. 나는 초보자 stackoverflow에 나는 origging 질문에 followups 의견에 가야한다고 생각 .. 이 어떻게 stackoverflow 작동합니까? 원래의 포스터가 대화에 추가하는 느낌이 들었다면 어떻게 진행해야합니까? 의견/답변을 통해 자신의 질문이나 편집 질문 – ashishsony

답변

2

편집 3 : 내가 당신의 질문을 이해하는 방법은 OpenGL 그리기 테두리가 있고 그 사이에 색으로 채워 져야한다는 것입니다.

당신이 가진 아이디어는 옳았습니다. 그러나 줄무늬는 바로 그것입니다 - 줄무늬이며 어떤 영역도 없습니다.

그러나 선을 서로 연결하여 다각형을 정의 할 수는 있습니다. 그러면 버텍스별로 폴리곤 영역을 채울 것입니다.

  • 다각형이 볼록해야합니다 : 다각형이 방법을 그리기 두 가지 제한을 가지고,

    glBegin(GL_POLYGON); 
    
    glColor3f(0.0, 0.0, 1.0); 
        glVertex3f(0.0, 0.0, 0.0); 
    glColor3f(0.0, 0.0, 1.0); 
        glVertex3f(200.0, 0.0, 0.0); 
    glColor3f(0.0, 0.0, 1.0); 
        glVertex3f(200.0, 200.0, 0.0); 
    glColor3f(0.0, 0.0, 1.0); 
        glVertex3f(0.0, 200.0, 0.0); 
    glColor3f(0.0, 0.0, 1.0); 
        glVertex3f(0.0, 0.0, 0.0); 
    
    glEnd(); 
    

    그러나 참고 : 코드를 적응.

  • 이것은 느린 작업입니다.

하지만 나는 그저 일을 끝내기를 원한다고 가정합니다. 미래를 위해서 당신은 단지 다각형을 삼각형 화하는 것을 고려할 것입니다.

+0

여러 개의 glColor3f() 문은 필요하지 않습니다. OpenGL은 상태 시스템이며 상태는 그대로 유지됩니다. 따라서 하나의 glColor3f() - 문장으로 충분합니다. – mstrobl

+0

고마워요. 당신 mstrobl, 이건 정말 내가 원하는 ... UR 솔루션은 내 하루 만들었어요! – ashishsony

2

난 당신 "는 봉투"가 무슨 뜻인지 잘 모르겠지만, 콘은 과잉이 원시적 인 :

glutSolidCone(radius, height, number_of_slices, number_of_stacks) 

색을 채우는 가장 쉬운 방법은 색상을 그리는 것입니다. 당신이 어느 정도 투명하게하려는 때문에, 당신은 너무 알파 값이 필요합니다

glColor4f(float red, float green, float blue, float alpha) 
// rgb and alpha run from 0.0f to 1.0f; in the example here alpha of 1.0 will 
// mean no transparency, 0.0 total transparency. Call before drawing. 

이 반투명 렌더링하려면, 혼합이 활성화되어야한다. 그리고 사용할 블렌딩 기능을 설정해야합니다. 당신이하고자하는 일은 아마도 다음과 같이 이루어질 것입니다. 더 많은 것을 배우고 싶다면 저에게 의견을 남겨주세요. 그리고 나는 좋은 지적을 찾을 것입니다.

glEnable(GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

통화가 가능한 프로그램 초기화시, 모든 그리기 작업을 수행하기 전에 :하지만 여기 설정을 간다.:)

+0

나는 그 블렌딩 매개 변수를 결코 기억하지 못합니다. – Cheery

2

나는 그것에 대한 서브 루틴이 있었음을 기억한다. 그러나 혼자서하는 것이 너무 어렵지 않습니다.

하지만 2D를 이해하지 못합니다. 2D의 원뿔? 삼각형이 아닌가?

어쨌든, 여기 당신이 가장자리의 좋은 금액을받을 수 있도록

먼저 균등하게 구획을, 원을 OpenGL을에 콘을 그리기에 대한 알고리즘이다. 이제 원의 중심을 선택하고 가장자리에서 원의 중심까지 삼각형을 만듭니다. 그런 다음 원 위에 점을 선택하고 가장자리에서 해당 점까지 삼각형을 만듭니다.

크기 모양 및 방향은 원과 두 점을 생성하는 데 사용하는 값에 따라 다릅니다. 모든 단계는 다소 단순하며 문제를 일으키지 않아야합니다.

먼저 스칼라 값을 세분화하십시오. [0-2] - 범위에서 시작하십시오. 중간 점 ((시작 + 끝)/2)을 가져 와서 범위를 분할하십시오. 값을 쌍으로 저장하십시오. 예를 들어, 한 번 세분하면 다음과 같이 나타납니다. [(0,1), (1,2)] 반복적으로 몇 번 반복 한 다음 해당 점이 원에 무엇인지 계산합니다. 간단한 삼각법은 진행하기 전에 값을 π로 곱하는 것을 기억하십시오. 이 후 일정한 양의 가장자리가 있습니다. 2^n 여기서 n은 세분의 양입니다. 그런 다음 하나의 정점을 더줌으로써 삼각형으로 변환 할 수 있습니다. 따라서 삼각형의 양은 2^(n + 1)이된다. (금액은 고정 된 크기의 배열을하고 있다면 알고 유용

편집 :.. 당신이 정말로 원하는 것은 파이입니다 (죄송합니다 말장난)

그것은 당신이 할 수있는 렌더링 똑같이 간단합니다. 다시 삼각형을 사용합니다. 스칼라 범위 [-0.25 - 0.25]를 선택하고, 세분하고, 원을 그리며 투영합니다.

스칼라 원 투영은 x = cos (v * pi) r, y = sin (v pi) * r 여기서 (x, y)는 결과 정점, r은 반지름, 삼각 함수는도가 아닌 라디안에서 작동합니다 (degr ee, pi를 180로 대체)

직접 렌더링하려면 꼭지점 버퍼 또는 목록을 사용하십시오.

편집 : 색칠 질문. glColor4f를 사용하면 지오메트리의 일부가 색상에 따라 다르도록하려면 버텍스 버퍼 자체의 각 버텍스에 색상을 지정할 수 있습니다. 지금 당장은 모든 API 호출을 알고 있지만 OpenGL의 API 참조는 이해할 수 있습니다.

당신이 파이를 요청하는 질문 reclarified 때문에
2

: 너무 OpenGL을 프리미티브를 사용하는 것을 그릴 수있는 쉬운 방법이 :

당신은 gluSolidSphere을 사용하여 고체 영역()을 그릴 것입니다. 만 그것의 일부를 그리려고하기 때문에, 당신은 멀리 불필요한 부분을 클립 : GL_CLIPPLANEn에 GL_CLIPPLANE0 인 평면 방정식

void glClipPlane(GLenum plane, const GLdouble * equation); 

은 (a X + B Y 정상적인 형태의 평면 방정식을 인 + C * Z의 + D = 0의 값 { a, b, c, d }을 길게 할 식을 의미 이러한 복식하지 플로트 바랍니다 참고 색상의 편집에

2

:..

OpenGL은 실제 상태 머신이다.이것은 드로잉 할 때 현재 머티리얼 및/또는 색상 위치가 사용됨을 의미합니다. 아마도 재료를 사용하지 않을 것이기 때문에 지금은 무시하십시오. 원하는 색상.

glColor3f(float r, float g, float b) // draw with r/g/b color and alpha of 1 
glColor4f(float r, float g, float b, float alpha) 

이것은 당신이 그릴 수있는 정점의 색상에 영향을 미칠 것입니다, 당신은 렌더링 지오메트리의 - 그것은 GLU의 나 자신은 수 - glColorXX 호출이 실행 된 후. 정점이있는면을 그릴 때 glVertex3f/glVertex2f 호출 사이의 색상을 변경하면 색상이 보간됩니다.

glBegin(GL_TRIANGLES); 
glColor3f(0.0, 0.0, 1.0); 
glVertex3f(-3.0, 0.0, 0.0); 
glColor3f(0.0, 1.0, 0.0); 
glVertex3f(0.0, 3.0, 0.0); 
glColor3f(1.0, 0.0, 0.0); 
glVertex3f(3.0, 0.0, 0.0); 
glEnd(); 

을하지만 난 이미 glColor4f 지적했다, 그래서 당신은 당 버텍스 기준으로 색상을 설정한다고 가정 :

이보십시오. 그리고 디스플레이 목록을 사용하여 렌더링하려고합니다.

정점 목록을 표시 할 수있는 것처럼 정점 목록을 표시 할 수있는 것처럼 색상 목록을 만들 수도 있습니다. 색상 목록을 활성화하고 목록이있는 위치를 OpenGL에 알려주기 만하면됩니다. 물론 꼭지점 목록과 동일한 복장이 있어야합니다 (같은 순서). 당신이

glEnableClientState(GL_VERTEX_ARRAY); 
glVertexPointer(3, GL_FLOAT, 0, vertices_); 
glDisableClientState(GL_VERTEX_ARRAY); 

이 있다면

이 방법으로 색상을 추가해야합니다. 그들은 부유 할 필요가 없습니다. 사실, 어떤 형식이어야하는지 알려줍니다. 채널 당 1 바이트와 4 개 채널 컬러 목록 (R, G, B 및 A) 사용이 :

glEnableClientState(GL_VERTEX_ARRAY); 
glEnableClientState(GL_COLOR_ARRAY); 
glVertexPointer(3, GL_FLOAT, 0, vertices_); 
glColorPointer(4, GL_UNSIGNED_BYTE, 0, colors_); 
glDisableClientState(GL_COLOR_ARRAY); 
glDisableClientState(GL_VERTEX_ARRAY); 

편집 : 당신이 다음 요소 glDrawElements를 호출하여 그리는 OpenGL을 말할 필요가 있음을 추가 잊어 버렸 .

관련 문제