2012-06-28 2 views
0

그래서 저는 gluCylinder를 사용하지 않고 분할 된 GL_QUAD_STRIP을 사용하여 원형 튜브의 느낌을주기 위해 만든 OpenGL에서 원통을 가지고 있습니다. 나는 실린더 주위로 줄을 감싸는 텍스처 이미지를 얻고 싶지만 그 방법을 알 수는 없다. 저는 OpenGL의 텍스처에 관해서는 아직 초보자입니다. 아마 제가 생각한 것처럼 텍스쳐를 이해하지 못할 수도 있습니다. 당신은 실린더 (실린더 너무 높이 주위에 종이를 포장 =의 높이로 텍스처 매핑 프로세스를 생각하면OpenGL에서 GL_QUAD_STRIP로 만든 실린더에 텍스처 매핑

float x,z,angle;   // Used to calculate cylinder wall 
float height = 75.0f;  // Height of the cylinder 
float diameter = 10.0f;  // Diameter of the cylinder, or more specifically, 
float normal[3],corners[2][3]; // Storeage for vertex calculations 
float numSides = 100.0f; 
float step; 
float sideLength; 
float perimeter;   // Not perimeter of ideal circular cylinder 
          // but actual perimeter of what is drawn 
int whichSide;    // Used to keep track of which side you are on during the loop 

step = (GL_PI/numSides/2.0f); // Approximate the cylinder wall with 
           // some number of flat segments 
sideLength = 
    2.0f*diameter*(float)sin(GL_PI/(2.0f*numSides)); // Calculate the length of each side 

perimeter = numSides * sideLength; 

printf("There are %f sides on the small cylinder\nthat are each %f units 
    long.\nThe dimensions of the texture must be\nclose to %f x %f\n\n\n", numSides, 
    sideLength, perimeter, height); 



// Set material color for head of screw 
glColor3f(1.0f, 1.0f, 1.0f); 

// Assemble the wall as 100 quadrilaterals formed by 
// placing adjoining Quads together 
glFrontFace(GL_CCW); 
glBegin(GL_QUAD_STRIP); 


for(angle = (2.0f*GL_PI); angle > 0.0f; angle -= step) 
{ 
    // Calculate x and y position of the first vertex 
    x = diameter*(float)sin(angle); 
    z = diameter*(float)cos(angle); 

    // Get the coordinate for this point and extrude the 
    // length of the cylinder. 
    corners[0][0] = x; 
    corners[0][1] = -height/2.0f; 
    corners[0][2] = z; 

    corners[1][0] = x; 
    corners[1][1] = height/2.0f; 
    corners[1][2] = z; 

    // Instead of using real normal to actual flat section 
    // Use what the normal would be if the surface was really 
    // curved. Since the cylinder goes up the Y axis, the normal 
    // points from the Y axis out directly through each vertex. 
    // Therefore we can use the vertex as the normal, as long as 
    // we reduce it to unit length first and assume the y component 
    // to be zero 
    normal[0] = corners[1][0]; 
    normal[1] = 0.0f; 
    normal[2] = corners[1][2]; 




//@@@@@#####*****TEXTURING DONE HERE *****#####@@@@@// 

    // Reduce to length of one and specify for this point 
    ReduceToUnit(normal); 
    glNormal3fv(normal); 
    glTexCoord2f(((float)whichSide)/numSides,0.0f); 
    glVertex3fv(corners[0]); 
    glTexCoord2f(((float)whichSide)/numSides,1.0f); 
    glVertex3fv(corners[1]); 

    whichSide++; 
} 

답변

3

: 여기가 그 실린더를 그립니다과 질감을 시도 가지고있는 코드는 종이와 원주 둘레 = 종이의 너비), 각도와 함께 Y (또는 X)를 변경하는 텍스코 코드를 생성하기 만하면됩니다 (그러나 각도는 0에서 Pi는 0에서 Pi로 변경됨). 다른 텍스처 좌표 인 X (또는 Y)는 0과 1이 될 것이므로 해당 축의 전체 범위로 매핑됩니다.

+0

일 했으니, 고마워요! – 23ChrisChen

관련 문제