【问题标题】:How to calculate vertex normals of a cylinder?如何计算圆柱的顶点法线?
【发布时间】:2012-03-02 11:49:45
【问题描述】:

我有下面的圆柱体,我在opengl中画一条虫子,我想计算顶点法线。

【问题讨论】:

    标签: opengl vertex normals


    【解决方案1】:

    对于圆柱环上的每个点,vertexNormal = normalize(vertexPosition - ringCenter);

    或者您可以正常计算它们,其中 normal 是包含此顶点的每个面的所有面法线的归一化总和。

    【讨论】:

    • 在使用上述公式创建顶点的同时为每个顶点创建一个法线。如上所述,这将适用于圆柱体。
    【解决方案2】:

    计算每个面(三角形)的法线并将其保存在某处。现在对于每个顶点,您都有几个共享顶点的面(通常在您的图片上为 6 个)。您的最终顶点法线是面法线的平均值。对于 6 个面,您计算:

    int faceCount = 6;
    float sum = 0.0f;
    for(int face = 0; face < faceCount; ++face)
        sum += faceNormals[face].x;
    normal.x = sum / faceCount;
    // and so on for y and z
    

    不要忘记对结果向量进行归一化,使其长度为 1。

    注意:不要将faceNormals 放在这样的数组中。在实际代码中,您可能希望拥有一个类似vector 的所有法线容器以及一些说明哪些法线与哪个顶点相关的逻辑。

    【讨论】:

    • 这真的可行吗?对于我的测试,它似乎不起作用......这就是我所做的:normal.x = (V1.x+V2.x+V3.x)/3.0f(用于三角形),然后我最终归一化。我做错了什么?
    • @Rookie 这不是从顶点计算三角形法线的公式。为此,您需要cross product。我的答案是平均几个法线向量。
    • 对不起,我误解了你,因为我理解 OP 询问如何计算法线,而不是如何计算平滑法线...
    • @Fiktik:这就是您在一般情况下计算法线的方式。在圆柱体上,您可以获得精确的法线,因为它是数学定义的构造。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    • 2013-02-15
    • 2015-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多