// mesh = m, dir = vector(1, 0, 0) void Intersector::init() { int i, j, k; const vector<MeshVertex> &vtc = mesh->vertices; const vector<MeshEdge> &edg = mesh->edges; dir = dir.normalize(); getBasis(dir, v1, v2); // 建立一个以dir, v1, v2为坐标轴的坐标系 // dir(1, 0, 0) v1(0, 0, 1) v2(0, -1, 0) points.resize(vtc.size()); sNormals.resize(edg.size() / 3); for(i = 0; i < (int)vtc.size(); ++i) { // *表示内积 points[i] = Vector2(vtc[i].pos * v1, vtc[i].pos * v2); } bounds = Rect2(points.begin(), points.end()); // points数组存储的是每个顶点在v1和v2方向上的投影,bounds是这些投影的二维包围盒 triangles.resize(cells * cells); for(i = 0; i < (int)edg.size(); i += 3) { Rect2 triRect; for(j = 0; j < 3; ++j) triRect |= Rect2(points[edg[i + j].vertex]); int fromx, fromy, tox, toy; getIndex(triRect.getLo(), fromx, fromy); getIndex(triRect.getHi(), tox, toy); // 得到的fromx, fromy分别是将bounds分为200*200的网格后,其包围盒左下角在整个网格(bounds)中的x,y方向上的网格索引号 // tox, toy是三角形包围盒右上角在网格中的索引号 for(j = fromy; j <= toy; ++j) for(k = fromx; k <= tox; ++k) { triangles[j * cells + k].push_back(i); } // triangles中存储的是与这些网格有交点的三角面片 Vector3 cross = (vtc[edg[i + 1].vertex].pos - vtc[edg[i].vertex].pos) % (vtc[edg[i + 2].vertex].pos - vtc[edg[i].vertex].pos); j = i / 3; // j为面片的索引号 sNormals[j] = cross.normalize(); if(fabs(sNormals[j] * dir) <= 1e-8) sNormals[j] = Vector3(); //zero if coplanar else sNormals[j] = sNormals[j] / (sNormals[j] * dir); //prescaled for intersection // sNormals[j]为平面的法向在dir方向上的投影 } }