Как я могу рассчитать нормаль конуса в openGL 4.5? - PullRequest
0 голосов
/ 25 июня 2018

Я новичок в openGL 4.5, и в настоящее время я работаю со светом, и все нормально, когда я вычисляю нормали вершин во время рисования геометрии, но теперь мне нужно вычислить нормаль грани для конуса, и я понятия не имею, как это сделать. Это. Я рисую это с помощью GL_TRIANGLE_STRIP. Мы можем видеть текущий фрагмент ниже:

    float coneAngle = (float) Math.atan(radius / height);

    coneCos = (float) Math.cos(coneAngle);
    coneSin = (float) Math.sin(coneAngle);

    // circleResolution * heightResolution * 3

    for(int i = 0; i <= circleResolution; i++)
    {
        for(int j = 0; j <= heightResolution; j++)
        {
            angle = 2 * ((float) Math.PI) * (i / (float) circleResolution);

            cos = ((float) Math.cos(angle));
            sin = ((float) Math.sin(angle));

            x = radius * cos;
            z = radius * sin;

            // Cone Bottom
            vertices.add(x);
            vertices.add(0.0f);
            vertices.add(z);                

            // Cone Bottom Normal
            vertices.add(coneCos * cos);
            vertices.add(coneSin);
            vertices.add(coneCos * sin);

            // Cone Top
            vertices.add(0f);
            vertices.add(height);
            vertices.add(0f);               

            // Cone Top Normal
            vertices.add(0f);
            vertices.add(0f);
            vertices.add(0f);
        }
    }

    // Center of Bottom Circle - Vertices
    vertices.add(0.0f);
    vertices.add(0.0f);
    vertices.add(0.0f);

    // Center of Bottom Circle - Normal
    vertices.add(0.0f);
    vertices.add(-1.0f);
    vertices.add(0.0f);

    // CircleResolution - Bottom Circle - TRIANGLE_FAN
    for (int j = 0; j <= circleResolution; j++)
    {
        angle = (2 * ((float) Math.PI)) * ( j / (float) circleResolution );

        x = (float) Math.cos(angle);
        z = (float) Math.sin(angle);

        vertices.add(radius * x);
        vertices.add(0.0f);
        vertices.add(radius * z);

        // Normal
        vertices.add(0.0f);
        vertices.add(-1.0f);
        vertices.add(0.0f);
    }

Полигон, который приближается к конусу
Polygon That Approximates a Cone

1 Ответ

0 голосов
/ 25 июня 2018

Нормальный вектор для линии или (вектора) может быть достигнут поворотом вектора на 90 ° вдоль линии.

cone normal

Вектор вдоль боковой поверхности конуса равен (radius, -height) . Нормальный вектор равен (-(-height), radius) .

В вашем случае нормальный векторный атрибут фланка конуса для нижней ("Cone Bottom Normal") и верхней ("Cone Top Normal") вершин:

// lenght of the flank of the cone
float flank_len = Math.sqrt(radius*radius + height*height); 

// unit vector along the flank of the cone
float cone_x = radius / flank_len; 
float cone_y = -height / flank_len;

.....

// Cone Bottom Normal
vertices.add(-cone_y * cos);
vertices.add( cone_x );
vertices.add(-cone_y * sin);

.....

// Cone Top Normal
vertices.add(-cone_y * cos);
vertices.add( cone_x );
vertices.add(-cone_y * sin);
...