美文网首页
平面法向量的计算

平面法向量的计算

作者: tp夕阳武士 | 来源:发表于2020-04-17 18:14 被阅读0次

重点:计算法线向量是使用光照的必要步骤

图1-1.png
1.什么叫做法向量?

法向量与几何学中的法线有点类似;
如上图1-1,我们已知三个顶点:
A:(0.0,0.0,0.0)
B:(0.0,1.0,0.0)
C:(0.0,0.0,1.0)
那么平面ABC的发线是垂直于这个面的;

我们又知道两个向量是可以确定一个面的;
那么向量Vab 与向量Vac 的法向量 normal1 也是同事垂直于这两个向量的;

2.法线数据是如何与顶点数据匹配的?
typedef struct {
    GLKVector3  position; //顶点向量
    GLKVector3  normal;   //法线向量
    GLKVector2  texture;  //纹理坐标
}
SceneVertex;

从上面这个数据结构的定义我们可以了解到,法线量与顶点数据是一一对应的;

3.GLKit提供的计算方法:
//已知两个点,求两点组成的向量;
GLKVector3 v = GLKVector3Subtract(GLKVector3 point1, GLKVector3 point2);

// 已知两个向量 Vab ,Vca, 求着两个向量的法向量
GLKVector3 normal = GLKVector3Normalize(GLKVector3CrossProduct(Vab, Vac));

//根据这个方法,我们可以求图1-1中的normal1
GLKVector3 normal = GLKVector3Normalize(GLKVector3CrossProduct(Vab, Vca));

//normal1的最终结果应该是等于{0.0,1.0,0.0}

//因为三角形的三个顶点都是属于一个平面的,所以它三个顶点对应的法向量都是相等的
//再结合上文中的内容2:法线数据是如何与顶点数据匹配的
//我们就可以直接把求得的normal配置给三角形的每一个顶点就可以了.
代码测试结果.png
4.自定义方法修改三角形顶点数据的法向量数据
//顶点数据结构
typedef struct {
    GLKVector3  position; //顶点向量
    GLKVector3  normal;   //法线向量
    GLKVector2  texture;  //纹理坐标
}
SceneVertex;

//三角形数据结构
typedef struct {
    SceneVertex vertices[3];
}
SceneTriangle;

//NUM_FACES 表示有多少个三角形 是一个常量 根据实际开发情况设定.
//录入一个正方形,就有两个三角形,那么NUM_FACES = 2;
//在传参数的时候,这个数不用管,因为传入的是数据的地址;
void SceneTrianglesUpdateFaceNormals(SceneTriangle someTriangles[NUM_FACES])
{
    int I;
    
    for (i=0; i<NUM_FACES; I++)
    {
        //计算平面法向量
        GLKVector3 faceNormal = SceneTriangleFaceNormal(someTriangles[I]);
        
        //更新每个点的平面法向量
        someTriangles[i].vertices[0].normal = faceNormal;
        someTriangles[i].vertices[1].normal = faceNormal;
        someTriangles[i].vertices[2].normal = faceNormal;
    }
}

GLKVector3 SceneTriangleFaceNormal(const SceneTriangle triangle)
{
    //vectorA =  v1 - v0
    GLKVector3 vectorA = GLKVector3Subtract(triangle.vertices[1].position,
                                            triangle.vertices[0].position);
    //vectorB =  v2 - v0
    GLKVector3 vectorB = GLKVector3Subtract(triangle.vertices[2].position,
                                            triangle.vertices[0].position);
    
    GLKVector3 normal = GLKVector3Normalize(GLKVector3CrossProduct(vectorA, vectorB));
    
    //通过 向量A和向量B的叉积求出平面法向量,单元化后返回
//    return SceneVector3UnitNormal(vectorA,vectorB);
    return normal;
}

相关文章

  • 平面法向量的计算

    重点:计算法线向量是使用光照的必要步骤 1.什么叫做法向量? 法向量与几何学中的法线有点类似;如上图1-1,我们已...

  • 平行线距离计算

    设有两个超平面 则它们的距离计算过程如下: 设 , 法向量 离 最近,故而有

  • 高数知识点总结

    空间平面及其方程的求解思路与方法”相关的知识点: 1.法向量 垂直于平面的一个非零向量n称为这个平面的法向量.与n...

  • 1-2 平面及其方程

    第二节 平面及其方程 一、平面的点法式方程 法向量 如果一个非 零向量垂直于一个平面, 则该向量就称为该平面的法线...

  • 再看SVM

    超平面描述方程其中w是法向量。空间任意点到平面的距离:假设超平面可以正确分类,则 支持向量到超平面的距离之和为 期...

  • OpenGL - 获取法向量

    计算一个法向量 计算矢量积向量 用这个矢量积向量的长度/矢量积的每个分量 获取两个点形成的的向量 返回一个单位法向量

  • 06-支持向量机原理(一)线性支持向量机

    1、SVM的超平面 这里可以得到一个结论W向量的转置是这条超平面的转置 1.1、计算点到超平面的距离 1.2、计算...

  • 【四十,光照-光照基础_03镜面反射光照】

    镜面反射光照 依赖因素: 光的方向向量; 物体的法向量; 观察者的观察方向; 计算过程 计算反射向量; 计算视线向...

  • 平面曲线主单位法向量公式的证明

    设平面参数曲线,其中是参数的函数,是弧长参数,是主单位法向量,证明。 证明:设是速度向量,是单位切向量,则...

  • 空间内一点到超平面的距离推广公式

    超平面 与 法向量 超平面(H,Hyperplane) 是二维平面中直线、三维空间中平面对象的推广形式,本质是维空...

网友评论

      本文标题:平面法向量的计算

      本文链接:https://www.haomeiwen.com/subject/mbvyvhtx.html