public Vector3 CalcBarycentricCoords(Vector3 point) { Vector3 result; Triangle3.CalcBarycentricCoords(ref point, ref this.V0, ref this.V1, ref this.V2, out result); return(result); }
/// <summary> /// Sampples an array of random points on the surface. Users can provide additional parameters for sampling. /// Sample map controls the chance of sampling (texture is read from r channel), where white gives maximum chance /// and black gives no chance. To read the texture an array of uv coordinates is used. It's also possible to /// explicitly set additional range of chances (so that if sample map has gradient from 0 to 1, then adding /// min to 0.5 will result in no samples generated in areas with color <= 0.5). Notice that in this function /// count is upper bound of samples to generate, resulting array may have less samples due to some samples /// being rejected according to sample map. /// </summary> public Vector3[] SampleArray(int count, Vector2[] uvs, Texture2D sampleMap, float min = 0f, float max = 1f) { Vector3[] temp = new Vector3[count]; int c = 0; for (int i = 0; i < count; ++i) { int index = SampleIndex() * 3; int i0 = _indices[index]; int i1 = _indices[index + 1]; int i2 = _indices[index + 2]; Vector3 v0 = _vertices[i0]; Vector3 v1 = _vertices[i1]; Vector3 v2 = _vertices[i2]; Vector3 vec = _rand.InTriangle(ref v0, ref v1, ref v2); Vector3 bary; Triangle3.CalcBarycentricCoords(ref vec, ref v0, ref v1, ref v2, out bary); Vector2 uv = uvs[i0] * bary.x + uvs[i1] * bary.y + uvs[i2] * bary.z; float factor = sampleMap.GetPixelBilinear(uv.x, uv.y).r; if (min <= factor && factor <= max && _rand.NextFloat() < factor) { temp[c] = vec; ++c; } } Vector3[] result = new Vector3[temp.Length]; System.Array.Copy(temp, result, temp.Length); return(result); }
public static Vector3 CalcAnglesRad(Vector3 v0, Vector3 v1, Vector3 v2) { return(Triangle3.CalcAnglesRad(ref v0, ref v1, ref v2)); }