Как рассчитать нормаль для цилиндрического скоса - PullRequest
1 голос
/ 24 января 2020

Я пытаюсь добавить скос к цилиндру, но у меня возникла проблема с вычислением нормалей для скоса

enter image description here

это то, как я вычисляю данные для вершин

      struct Vertices
     {
      float x;
      float y;
      float z;
     }

     float pieStartAngle = 0.0 * (M_PI / 180.0f);
    float angleCircle = 0.0f;

    // First fill all the position of vertices
    for (int k = 0; k < totalNumberOfPies; k++)
    {
        for (int i = 0; i < segmentPerPie + 1; i++)
        {
            Vertices temp;
            float initialAngle = pieStartAngle;
            angleCircle = (stdvecValuePercent[k] / 100.0f) * totalAngle;
            float angle = initialAngle + ((angleCircle *(M_PI / 180)) * i / segmentPerPie);
            float x, y, z, tx, ty, tz;
            float innerX, innerY, innerZ, innerTx, innerTy;
            x = cos(angle)  * (radius - bevel);
            y = sin(angle)  * (radius - bevel);
            z = 0.0;
            temp.x = x;
            temp.y = y;
            temp.z = z;
            vertices.push_back(temp);

            x = cos(angle)  * radius;
            y = sin(angle)  * radius;
            z = 0.0 + bevel;
            temp.x = x;
            temp.y = y;
            temp.z = z;
            vertices.push_back(temp);
        }
        pieStartAngle += angleCircle * (M_PI / 180);
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

это то, как я вычисляю данные для нормалей, я беру перекрестное произведение трех вершин, чтобы получить вектор, перпендикулярный к лицо.

    for (int i = 0; i < vertices.size(); i++)
    {       
        glm::vec3 vec1 = glm::vec3(vertices[i].x - vertices[i + 1].x, vertices[i].y - vertices[i + 1].y, vertices[i].z - vertices[i + 1].z);
        glm::vec3 vec2 = glm::vec3(vertices[i].x - vertices[i + 2].x, vertices[i].y - vertices[i + 2].y, vertices[i].z - vertices[i + 2].z);
        glm::vec3 crossProduct = glm::cross(glm::normalize(vec1), glm::normalize(vec2));
        crossProduct = glm::normalize(crossProduct);
        bevelData.push_back(vertices[i].x);
        bevelData.push_back(vertices[i].y);
        bevelData.push_back(vertices[i].z);
        bevelData.push_back(crossProduct.x );
        bevelData.push_back(crossProduct.y );
        bevelData.push_back(crossProduct.z);
        bevelData.push_back(0.0);
        bevelData.push_back(0.0);

    }
...