public static SHRotateMatrix transfer(Matrix4x4 rot, int bands) { SHRotateMatrix result = new SHRotateMatrix(bands * bands); result.SetValue(0, 0, 1); PermutedMatrix pm = new PermutedMatrix(rot); for (int m = -1; m <= 1; m++) { for (int n = -1; n <= 1; n++) { result.SetValueByBand(1, m, n, pm.GetByMN(m, n)); } } for (int band = 2; band < bands; band++) { for (int m = -band; m <= band; m++) { for (int n = -band; n <= band; n++) { result.SetValueByBand(band, m, n, M(band, m, n, pm, result)); } } } return(result); }
private static float U(int l, int m, int n, PermutedMatrix R, SHRotateMatrix M) { if (m == 0) { return(P(0, l, 0, n, R, M)); } return(P(0, l, m, n, R, M)); }
private static float P(int i, int l, int a, int b, PermutedMatrix R, SHRotateMatrix M) { if (b == -l) { return(R.GetByMN(i, 1) * M.GetValueByBand(l - 1, a, -l + 1) + R.GetByMN(i, -1) * M.GetValueByBand(l - 1, a, l - 1)); } else if (b == l) { return(R.GetByMN(i, 1) * M.GetValueByBand(l - 1, a, l - 1) - R.GetByMN(i, -1) * M.GetValueByBand(l - 1, a, -l + 1)); } else { return(R.GetByMN(i, 0) * M.GetValueByBand(l - 1, a, b)); } }
private static float W(int l, int m, int n, PermutedMatrix R, SHRotateMatrix M) { if (m == 0) { return(0); } else if (m > 0) { float p0 = P(1, l, m + 1, n, R, M); float p1 = P(-1, l, -m - 1, n, R, M); return(p0 + p1); } else // m < 0 { float p0 = P(1, l, m - 1, n, R, M); float p1 = P(-1, l, -m + 1, n, R, M); return(p0 - p1); } }
private static float M(int l, int m, int n, PermutedMatrix R, SHRotateMatrix M) { // First get the scalars float u = 0.0f, v = 0.0f, w = 0.0f; uvw(l, m, n, ref u, ref v, ref w); // Scale by their functions if (u != 0.0f) { u *= U(l, m, n, R, M); } if (v != 0.0f) { v *= V(l, m, n, R, M); } if (w != 0.0f) { w *= W(l, m, n, R, M); } return(u + v + w); }
private static float V(int l, int m, int n, PermutedMatrix R, SHRotateMatrix M) { if (m == 0) { float p0 = P(1, l, 1, n, R, M); float p1 = P(-1, l, -1, n, R, M); return(p0 + p1); } else if (m > 0) { float d = delta(m, 1); float p0 = P(1, l, m - 1, n, R, M); float p1 = P(-1, l, -m + 1, n, R, M); return(p0 * Mathf.Sqrt(1 + d) - p1 * (1 - d)); } else { float d = delta(m, -1); float p0 = P(1, l, m + 1, n, R, M); float p1 = P(-1, l, -m - 1, n, R, M); return(p0 * (1 - d) + p1 * Mathf.Sqrt(1 - d)); } }