/// <summary> /// Returns a random triangle within the navmesh. /// </summary> /// <returns></returns> public AimNavMeshTriangle GetRandomTriangle() { if (aimNavMeshTriangles.Count > 0) { int randomIndex = AimRandom.RandomRange(0, aimNavMeshTriangles.Count); return(aimNavMeshTriangles[randomIndex]); } return(new AimNavMeshTriangle()); }
public void Flock() { float noisiness = 0.5f; UpdateFriendAgents(); float randomSeperation = (float)AimRandom.RandomRange(-2.0f, 2.0f); float randomAlign = (float)AimRandom.RandomRange(-1.0f, 1.0f); float randomCohesion = (float)AimRandom.RandomRange(-1.0f, 1.0f); vec3 alignForce = CalculateAlign() * randomAlign; vec3 seperationForce = CalculateSeperate() * randomSeperation; vec3 cohesion = CalculateCohesion() * randomCohesion; m_moveForce = alignForce + seperationForce + cohesion + (CalculateNoise() * noisiness); if (glm.length(m_moveForce) > 0) { m_moveForce = glm.normalize(m_moveForce) * m_maxForce; } ApplyForce(m_moveForce); }
/// <summary> /// Generates a random point within the navmesh. /// </summary> /// <returns></returns> public vec3 RandomPoint() { AimNavMeshTriangle randomTriangle = GetRandomTriangle(); float r1 = AimRandom.RandomRange(0.0f, 1.0f); float r2 = AimRandom.RandomRange(0.0f, 1.0f); if ((r1 + r2) > 1.0f) { r1 = 1.0f - r1; r2 = 1.0f - r2; } float r3 = 1 - r1 - r2; float x = (r1 * randomTriangle.v1.x) + (r2 * randomTriangle.v2.x) + (r3 * randomTriangle.v3.x); float y = (r1 * randomTriangle.v1.y) + (r2 * randomTriangle.v2.y) + (r3 * randomTriangle.v3.y); float z = (r1 * randomTriangle.v1.z) + (r2 * randomTriangle.v2.z) + (r3 * randomTriangle.v3.z); vec3 p = new vec3(x, y, z); return(p); }
private vec3 CalculateNoise() { return(new vec3((float)AimRandom.RandomRange(-20, 20.0), (float)AimRandom.RandomRange(-5, 5), (float)AimRandom.RandomRange(-20, 20.0))); }