Sphere OpenGl上的UV Mapping问题工件

时间:2017-10-24 21:41:35

标签: c++ opengl uv-mapping

Artifact on longitude

我使用公式

在3D球体X,Y,Z坐标上对2D纹理进行UV贴图
u = (0.5 + atan2(X, Y) / (2 * glm::pi<double>()));
v = (0.5 - asin(Z) / glm::pi<double>());

在现代的openGL C ++中。

我不知道为什么球体中存在这种神器。无法弄明白。

2 个答案:

答案 0 :(得分:1)

好的,我已经想出并纠正了这个问题,我想我现在终于回答了这个问题。

非常感谢BDL和Rabbid76。

每当u == 0时,我将相同的顶点位置(X Y Z)添加到顶点向量(或数组)并且还增加了索引,但这次将纹理u硬编码为1.0f。

现在没问题,接缝看起来很完美。

答案 1 :(得分:0)

这是索引的纹理球体几何体的细节。您应该使用索引来获得更好的性能: m_meridians和m_latitudes是球体的详细级别。

for (size_t i = 0; i < m_meridians + 1; i++)
{
    for (size_t j = 0; j < m_latitudes + 2; j++)
    {
        // texCoord in the range [(0,0), (1,1)]
       QVector2D texCoord((float)i / m_meridians, (float)j / (m_latitudes+1));
        // theta = longitude from 0 to 2pi
        // phi = latitude from -pi/2 to pi/2
        double theta, phi;
        theta = 2*M_PI * texCoord.x();
        phi = M_PI * texCoord.y() - M_PI_2;
        QVector3D pos;
        pos.setY((float)std::sin(phi));
        pos.setX((float)std::cos(phi) * std::cos(theta));
        pos.setZ((float)std::cos(phi) * std::sin(theta));

        m_vertices.push_back({pos, texCoord});
    }
}

// Calculate triangle indices

for (size_t i = 0; i < m_meridians; i++)
{
    // Construct triangles between successive meridians
    for (size_t j = 0; j < m_latitudes + 1; j++)
    {
        m_indices.push_back(i * (m_latitudes+2) + j);
        m_indices.push_back(i * (m_latitudes+2) + j+1);
        m_indices.push_back((i+1) * (m_latitudes+2) + j+1);

        m_triangleCount++;

        m_indices.push_back((i+1) * (m_latitudes+2) + j+1);
        m_indices.push_back((i+1) * (m_latitudes+2) + j);
        m_indices.push_back(i * (m_latitudes+2) + j);

        m_triangleCount++;
    }
}