private void MakeNormal() { uint ptCnt = VertexArray.PointCount; if (NormalArray == null) { NormalArray = new double[ptCnt * 3]; } for (int i = 0; i < 3 * ptCnt; i++) { NormalArray[i] = 0; } for (int idp = 0; idp < DrawParts.Count; idp++) { FaceFieldDrawPart dp = DrawParts[idp]; uint elemCnt = dp.ElemCount; for (int iElem = 0; iElem < elemCnt; iElem++) { uint[] vertexs = dp.GetVertexs((uint)iElem); OpenTK.Vector3d c0 = new OpenTK.Vector3d( VertexArray.VertexCoordArray[vertexs[0] * 3], VertexArray.VertexCoordArray[vertexs[0] * 3 + 1], VertexArray.VertexCoordArray[vertexs[0] * 3 + 2]); OpenTK.Vector3d c1 = new OpenTK.Vector3d( VertexArray.VertexCoordArray[vertexs[1] * 3], VertexArray.VertexCoordArray[vertexs[1] * 3 + 1], VertexArray.VertexCoordArray[vertexs[1] * 3 + 2]); OpenTK.Vector3d c2 = new OpenTK.Vector3d( VertexArray.VertexCoordArray[vertexs[2] * 3], VertexArray.VertexCoordArray[vertexs[2] * 3 + 1], VertexArray.VertexCoordArray[vertexs[2] * 3 + 2]); double[] n; double area; CadUtils.UnitNormalAreaTri3D(out n, out area, c0, c1, c2); NormalArray[vertexs[0] * 3 + 0] += n[0]; NormalArray[vertexs[0] * 3 + 1] += n[1]; NormalArray[vertexs[0] * 3 + 2] += n[2]; NormalArray[vertexs[1] * 3 + 0] += n[0]; NormalArray[vertexs[1] * 3 + 1] += n[1]; NormalArray[vertexs[1] * 3 + 2] += n[2]; NormalArray[vertexs[2] * 3 + 0] += n[0]; NormalArray[vertexs[2] * 3 + 1] += n[1]; NormalArray[vertexs[2] * 3 + 2] += n[2]; } } for (int iPt = 0; iPt < ptCnt; iPt++) { double[] p = new double[3]; p[0] = NormalArray[iPt * 3]; p[1] = NormalArray[iPt * 3 + 1]; p[2] = NormalArray[iPt * 3 + 2]; double invLen = 1.0 / Math.Sqrt(p[0] * p[0] + p[1] * p[1] + p[2] * p[2]); NormalArray[0] *= invLen; NormalArray[1] *= invLen; NormalArray[2] *= invLen; } }