簡體   English   中英

在OpenGL中將紋理映射到使用GL_QUAD_STRIP制成的圓柱體

[英]Texture mapping to a cylinder made with GL_QUAD_STRIP in in OpenGL

所以我在openGL中有一個圓柱體,它不是使用gluCylinder創建的,而是使用分段的GL_QUAD_STRIP來給人以圓形管的印象。 我想獲得一個紋理圖像,將其一直包裹在圓柱體周圍,但不知道如何處理。 關於OpenGL中的紋理,我還是一個新手,所以也許我不像我以前那樣理解紋理。 這是我繪制圓柱體並嘗試對其進行紋理處理的代碼:

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++;
}

如果您認為紋理映射過程是在圓柱體上纏繞一張紙(所以圓柱體的高度=紙張的高度,圓柱體的周長=紙張的寬度),那么您要做的就是生成texcoords隨角度更改Y(或X)(但這將從0-1變為角度,而從0變為Pi)。 另一個紋理坐標X(或Y)將為0和1,因此它將映射到該軸上的整個范圍。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM