【问题标题】:Calculating normals for Catmull-Clark计算 Catmull-Clark 的法线
【发布时间】:2015-08-10 20:33:56
【问题描述】:

在进行 catmull-clark 迭代后,我没有正确计算我的法线。我不确定解决此问题的正确方法。

现在,我首先执行细分,获取 draw_vertices 中的顶点,然后在这些 draw_vertices 上调用计算法线。

如何确定每个四边形的正确方向?

void calculate_normals() {
        for (int i = 0; i < d(); i+=4) {
            vec3 a = d[i];
            vec3 b = d[i+1];
            vec3 c = d[i+2];
            vec3 d = d[i+3];
            vec3 ba = b - a;
            vec3 ca = c - a;
            vec3 normal1;
            cross(&normal1, &ca, &ba);
            normal1.normalize();
            n.push_back(normal1);
            n.push_back(normal1);
            n.push_back(normal1);
            n.push_back(normal1);

            d[i].print();
            d[i+1].print();
            d[i+2].print();
            d[i+3].print();
            normal1.print();
            normal1.print();
            normal1.print();
            normal1.print();
            printf("\n");
}

【问题讨论】:

    标签: graphics normals


    【解决方案1】:

    您正在计算每个面的法线并将其分配给每个顶点。由于顶点连接到四个不同的面,将一个面的法线分配给顶点并不能提供正确的答案。您应该计算连接到顶点的每个面的法线并取平均值。此外,如果顶点按逆时针顺序设置 c=b.cross(a)

    【讨论】:

    • Vector3f a = (*v1)->pos; Vector3f b = (*v2)->pos; Vector3f c = (*v3)->pos; Vector3f d = (*v4)->pos; Vector3f 正常1; Vector3f da = d - a; Vector3f ba = b - a;交叉(&正常1,&da,&ba); ... (*v1)->正常 = (*v1)->正常 + 正常1; (*v2)->正常= (*v2)->正常+正常2; (*v3)->正常= (*v3)->正常+正常3; (*v4)->正常= (*v4)->正常+正常4;
    • 从技术上讲,它应该可以工作。这是 Phong 和 Gouraud 着色的法线计算概念。看看这个:nbb.cornell.edu/neurobio/land/OldStudentProjects/cs490-95to96/…。一般来说,似乎有些法线是向上的,有些是向下的。尝试渲染它们并确保它们是准确的。
    猜你喜欢
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    相关资源
    最近更新 更多