문제

OpenGL 렌더링에 FreeGlut를 사용하고 있습니다 ...

나는 약간의 색상과 투명성으로 가득 차 있어야하는 원뿔 (2D)처럼 보이는 봉투를 그려야합니다.

FreeGlut 툴킷에는 채워진 형상 (또는 트릭)을 그릴 수있는 내장 기능이 장착되어 있습니까? 아니면 채워진 형상에 대한 내장 된 지원이있는 다른 API가 있습니까?

edit1 :2D 콘 물건을 명확히하기 위해 ... 봉투는 (적 항공기의) 가로 채기 동안 항공기의 커버리지 영역에 대한 그래픽 해석입니다. .

그리고 Glutsolidcone은 내가 이미 한 원의 부문을 그려고 싶기 때문에 나를 도와주지 않습니다 ... 내가 이미 한 일 ... 어떤 색상으로 무엇을 해야하는가 ... OpenGL에서 색상으로 형상을 채우는 방법은 무엇입니까?

edit2 :이 질문에 게시 된 모든 답변은 어떤 방식 으로든 내 문제에 효과가있을 수 있습니다. 그러나 나는 어떤 색상으로 지오메트리를 채우는 방법을 알고 싶을 것입니다. 포물선 인 봉투를 그려보고 싶다면 ...이 경우 실제로 채워진 포물선을 그릴 수있는 기본 Glut 함수가 없을 것입니다. 몇 가지 단색으로 사용자 정의 형상을 그립니다.

edit3 :mstrobl이 게시 한 답변은 GL_TRIANGLES를 위해 작동하지만 그러한 코드에 대해서는 다음과 같습니다.

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();

정사각형을 그립니다 ... 유선 사각형 만 그려집니다 ... 나는 파란색으로 채워야합니다.

어쨌든 그것을할까요?

닫힌 곡선에 대한 도면 명령을 넣으면 파이와 같이 .. 색상으로 채워야합니다. 가능할 수있는 방법이 있습니다 ...

나는 그것이 GL_TRIANGLES에 얼마나 가능한지 모르겠지만 ... 닫힌 곡선을 위해 어떻게해야합니까?

도움이 되었습니까?

해결책

EDIT3 : 내가 당신의 질문을 이해하는 방법은 당신이 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();

그러나이 방법으로 다각형을 그리는 것은 두 가지 한계가 있습니다.

  • 다각형은 볼록해야합니다.
  • 이것은 느린 작동입니다.

그러나 나는 당신이 그 일을 끝내고 싶다고 생각합니다. 미래를 위해 당신은 당신의 다각형을 삼각화하는 것만으로 생각할 수 있습니다.

다른 팁

나는 당신이 "봉투"의 의미를 잘 모르겠지만, 원뿔은 Glut가 가지고있는 원시입니다.

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);

프로그램 초기화에서 드로잉 작업을 수행하기 전에 전화하십시오. :)

파이를 요청하기 위해 질문을 재사용했기 때문에 : OpenGL 프리미티브를 사용하여이를 그리는 쉬운 방법이 있습니다.

glusolidsphere ()를 사용하여 단단한 구체를 그립니다. 그러나, 당신은 그것의 일부만 그릴 수 있기 때문에, 당신은 원치 않는 부품을 멀리 떨어 뜨립니다.

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

평면은 GL_CLIPPLANE0에서 GL_CLIPPLANEN을이고 정상 형태의 평면 방정식 인 방정식x + by + c*z + d = 0은 방정식이 값을 유지한다는 것을 의미합니다. { a, b, c, d }. 그것들은 복식이 아니라 부유물이 아닙니다.

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

그러나 나는 2D를 이해하지 못한다. 2D의 원뿔? 단지 삼각형이 아닌가요?

어쨌든 여기에 OpenGL에서 콘을 그리는 알고리즘이 있습니다.

먼저 원을 가져 가서 균등하게 세분화하여 좋은 양의 가장자리를 얻을 수 있습니다. 이제 원의 중심을 골라서 가장자리에서 원의 중앙까지 삼각형을 만듭니다. 그런 다음 원의 지점을 선택하고 가장자리에서 그 지점까지 삼각형을 만듭니다.

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

먼저 스칼라 값을 세분화하십시오. [0-2] -범위에서 시작하십시오. MidPoint ((start+end)/2)를 가져 와서 범위를 분할하십시오. 값을 쌍으로 저장하십시오. 예를 들어, 한 번 세분화는 다음과 같이 주어야합니다 : [(0,1), (1,2)] 재귀 적으로 몇 번이나 그 점이 원에있는 것을 계산하십시오. 간단한 삼각법은 진행하기 전에 π에 값을 곱해야합니다. 이 후에는 일정량의 가장자리가 있습니다. 2^n 여기서 n은 세분의 양입니다. 그런 다음 하나의 정점 지점을 더 많이 주면서 단순히 삼각형으로 바꿀 수 있습니다. 따라서 삼각형의 양은 다음과 같습니다. 2^(n+1). (금액은 고정 크기 어레이로 수행하는지 아는 데 유용합니다.

편집하다: 당신이 정말로 원하는 것은 파이입니다. (미안 해요)

렌더링하는 것도 똑같이 간단합니다. 당신은 다시 삼각형 만 사용할 수 있습니다. 스칼라 범위 [-0.25-0.25], 세분화, 돌출부를 원하고 하나의 삼각형 세트를 생성하기 만하면됩니다.

스칼라 - 원 돌기는 다음과 같이 간단합니다. x = cos (v*pi)r, y = sin (vpi)*r 여기서 (x, y)는 생성 된 정점 점, r은 반경이며, 삼각 함수는 각도가 아닌 방사선에 대해 작동합니다. (학위로 일하는 경우 PI를 180으로 교체하십시오)

정점 버퍼 또는 목록을 사용하여 직접 렌더링하십시오.

편집 : 채색 질문에 대해. glcolor4f, 지오메트리의 일부가 색상별로 다르기를 원한다면 정점 버퍼 자체에서 각 정점에 대한 색상을 할당 할 수 있습니다. 지금은 모든 API 호출을 알지 못하지만 OpenGL의 API 참조는 이해할 수 있습니다.

색상 편집에서 :

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)

이것은 Glcolorxx 호출이 실행 된 후 Glu 또는 자신의 형상이 렌더링되는 모든 정점의 색상에 영향을 미칩니다. 정점으로 얼굴을 그리고 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를 지적 했으므로, 당신이 색상을 Vertex별로 설정하고 싶다고 가정합니다. 디스플레이 목록을 사용하여 렌더링하고 싶습니다.

정점 목록을 표시 할 수있는 것처럼 색상 목록을 만들 수도 있습니다. 색상 목록을 활성화하고 목록이있는 곳에서 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);

편집 : 추가하는 것을 잊어 버린 다음 OpenGl에게 전화하여 그려야 할 요소를 알려야합니다. gldrawelements.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top