【问题标题】:Can someone explain how are normals calculated in this code?有人能解释一下这段代码中的法线是如何计算的吗?
【发布时间】:2015-05-11 12:30:02
【问题描述】:

我正在用 C++ 编写一个 3ds 文件解析器。现在我正在研究法线,我在网上某处找到了这段代码:

void calculateNormals(vert a, vert b, vert c,GLfloat *nx,GLfloat *ny, GLfloat *nz){

    GLfloat Qx, Qy, Qz, Px, Py, Pz;


    GLfloat v1[3] = {a.x,a.y,a.z};
    GLfloat v2[3] = {b.x,b.y,b.z};
    GLfloat v3[3] = {c.x,c.y,c.z};

       Qx = v2[0]-v1[0];
       Qy = v2[1]-v1[1];
       Qz = v2[2]-v1[2];
       Px = v3[0]-v1[0];
       Py = v3[1]-v1[1];
       Pz = v3[2]-v1[2];

    *nx = Py*Qz - Pz*Qy;
    *ny = Pz*Qx - Px*Qz;
    *nz = Px*Qy - Py*Qx;
}

我几乎什么都懂,除了最后三行。我只是...无法弄清楚它是如何以及为什么起作用的。

有人能解释一下它是如何计算的吗?

【问题讨论】:

标签: c++ parsing opengl normals 3ds


【解决方案1】:

正如 Cyber​​ 在 cmets 中所说,解决方案是计算叉积。数学描述为here

代码将三角形点转换为 2 个向量(从点 1 到 2 以及从点 1 到 3),然后对它们进行计算并计算它们的叉积。

【讨论】:

    【解决方案2】:

    这是一个交叉产品。请注意,当向量 (I,j,k) 在 (i0,j0,k0) 中相乘(叉积)时,结果是 (jk0-kj0,ki0-ik0,ij0-ji0) 通常法线也应该被归一化,如果向量不是单位长度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多