[英]Can someone explain how are normals calculated in this code?
我正在用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;
}
除了最后三行,我幾乎了解所有內容。 我只是...無法弄清楚它的工作方式和原因。
有人可以解釋它的計算方式嗎?
正如Cyber在評論中所說,解決方案正在計算叉積。 這里描述數學。
該代碼將三角形點變成2個向量(從點1到2,從點1到3),然后將它們取下來並計算它們的叉積。
這是一個交叉產品。 請注意,當向量(I,j,k)與(i0,j0,k0)相乘(叉積)時,結果為(jk0-kj0,ki0-ik0,ij0-ji0)通常法線也應歸一化向量不是單位長度。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.