Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 毛发纹理粗糙地出现在兔子身上_Qt_Opengl_Graphics_3d_Texture Mapping - Fatal编程技术网

Qt 毛发纹理粗糙地出现在兔子身上

Qt 毛发纹理粗糙地出现在兔子身上,qt,opengl,graphics,3d,texture-mapping,Qt,Opengl,Graphics,3d,Texture Mapping,我编写这段代码是为了将纹理应用于以ply格式提供的兔子模型。Bunny使用纹理绘制,但纹理看起来像粗糙点,而不是毛发 void GLRenderer::paintGL() { // Set light GLfloat light_position[] = { lightPositionX, lightPositionY, lightPositionZ, 0.0 }; glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST); glClea

我编写这段代码是为了将纹理应用于以ply格式提供的兔子模型。Bunny使用纹理绘制,但纹理看起来像粗糙点,而不是毛发

void GLRenderer::paintGL()
{
    // Set light
    GLfloat light_position[] = { lightPositionX, lightPositionY, lightPositionZ, 0.0 };
    glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    // Enabling texture
    glEnable(GL_TEXTURE_2D);
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

    bindTexture(QImage("fur4.bmp"));

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

    glEnable(GL_NORMALIZE);
    glLoadIdentity();

    glBegin(GL_TRIANGLES);

        for( int i = 0 ; i < objPLYParser.g_vpX.size() ; i+=3 )
        {
                float vector1[3], vector2[3], vCross[3], normalizationValue;
                vector1[0] = objPLYParser.g_vpX[i] - objPLYParser.g_vpX[i+1];
                vector1[1] = objPLYParser.g_vpY[i] - objPLYParser.g_vpY[i+1];
                vector1[2] = objPLYParser.g_vpZ[i] - objPLYParser.g_vpZ[i+1];

                vector2[0] = objPLYParser.g_vpX[i] - objPLYParser.g_vpX[i+2];
                vector2[1] = objPLYParser.g_vpY[i] - objPLYParser.g_vpY[i+2];
                vector2[2] = objPLYParser.g_vpZ[i] - objPLYParser.g_vpZ[i+2];

                // Cross product
                vCross[0] = vector1[1] * vector2[2] - vector2[1] * vector1[2];
                vCross[1] = vector2[0] * vector1[2] - vector1[0] * vector2[2];
                vCross[2] = vector1[0] * vector2[1] - vector2[0] * vector1[1];

                // Value to do normalization with
                normalizationValue = sqrt( vCross[0]*vCross[0] + vCross[1]*vCross[1] + vCross[2]*vCross[2] );

                 float normal[3];
                 normal[0] = vCross[0]/normalizationValue;
                 normal[1] = vCross[1]/normalizationValue;
                 normal[2] = vCross[2]/normalizationValue;

                 glNormal3f(normal[0],normal[1],normal[2]);

            glTexCoord2f(0.0, 0.0);
            glVertex3f(objPLYParser.g_vpX[i],objPLYParser.g_vpY[i],objPLYParser.g_vpZ[i]);

            glTexCoord2f( 1.0,0.0);
            glVertex3f(objPLYParser.g_vpX[i+1],objPLYParser.g_vpY[i+1],objPLYParser.g_vpZ[i+1]);

            glTexCoord2f(1.0, 1.0);
            glVertex3f(objPLYParser.g_vpX[i+2],objPLYParser.g_vpY[i+2],objPLYParser.g_vpZ[i+2]);
        }


    glEnd();
    glDisable(GL_TEXTURE_2D);
}
我尝试的纹理文件:

我得到的输出:

有什么建议我在这里可能做错了什么吗?

以下几行:

glTexCoord2f(0.0, 0.0);
...

glTexCoord2f( 1.0,0.0);
...

glTexCoord2f(1.0, 1.0);
...
提供纹理坐标,将整个纹理的一半映射到每个单独的三角形。您看到的是整个毛发纹理在网格上密密麻麻地平铺


您需要提供更好的纹理坐标。

首先,您可以使用简单的对象空间贴图,例如,对于x、y、z顶点,您可以使用x*缩放、y+z*缩放纹理坐标。然后你可以调整比例。

你确定兔子有纹理坐标吗?@concept3d对不起,我无法理解你的问题?我的问题在答案中得到了更好的解释,你需要UV映射你的兔子,换句话说,使用一些3D程序给它纹理坐标或生成它们。@concept3d我可以参考任何资源来生成它们吗?我所能找到的就是如何将纹理映射到哑立方体上。我可以参考任何资源来进行此操作吗?我所能找到的就是如何将纹理映射到哑立方体上有很多方法可以获取/创建/生成纹理坐标。在你的情况下,我建议你需要获得一些已经有了它们的数据——我确信对于像斯坦福兔子这样的模型来说,这些数据一定存在。原始数据是一个没有的3D扫描,但从那以后它肯定已经被参数化了。否则,要么使用建模工具创建网格,要么开始研究网格参数化。