public Character(World world, CharacterConfiguration configuration, string colliderName) : base(world) { this.Configuration = configuration; if (Configuration.EntityNames.Length == 0) throw new ArgumentException("At least one body entity must be provided."); CharacterNode = World.WorldNode.CreateChildSceneNode(); EyeNode = CharacterNode.CreateChildSceneNode(new Vector3(0, 1.7f, 0)); FirstPersonModel = new FirstPersonModel(this, EyeNode); FirstPersonModel.Visible = false; ThirdPersonModel = new ThirdPersonModel(this, CharacterNode, Configuration.EntityNames); BodyCollisionTree = new BodyCollisionTree(ThirdPersonModel.BodyEntities[0], AllLowerBodyAnimations.Concat(AllUpperBodyAnimations)); BodyColliders = ColliderLoader.ParseColliders(colliderName, BodyCollisionTree, "Alpha_").ToArray(); BoundingSphere = new SphereNode(CharacterNode, new Vector3(0, 1, 0), 2); SimpleCollider = new UprightCylinderNode(CharacterNode, Vector3.ZERO, 1.7f, 0.7f); AnimationManagerMapper.Add( AnimationKind.LowerBody, new AnimationManager( AllLowerBodyAnimations, ThirdPersonModel.BodyEntities, "Idle" ) ); AnimationManagerMapper.Add( AnimationKind.UpperBody, new AnimationManager( AllUpperBodyAnimations, ThirdPersonModel.BodyEntities, "Wield_USP" ) ); Camera = World.CreateCamera(Vector3.ZERO, MathHelper.Forward); EyeNode.AttachObject(Camera); ViewFrustum = new FrustumNode(Camera); SpecialMoveHandlers = new SpecialMoveHandler[3]; Reset(); }
public IEnumerable<BodyCollider> GetFrustumCollisionResult(FrustumNode frustum) { if (!frustum.Intersects(BoundingSphere)) yield break; List<BodyCollider> collidedColliders = new List<BodyCollider>(); foreach (BodyCollider collider in BodyColliders) { if (World.IsBodyColliderVisibleFromFrustum(frustum, collider)) yield return collider; } }
public bool IsBodyColliderVisibleFromFrustum(FrustumNode frustum, BodyCollider collider) { Vector3 colliderCenter = collider.PrimitiveNode.GetCenter(true); if (!frustum.Contains(colliderCenter)) return false; Vector3 delta = colliderCenter - frustum.Position; Ray ray = new Ray(frustum.Position, delta); float? buildingDistance = GetNearestIntersectingBuilding(ray); if (!buildingDistance.HasValue || delta.SquaredLength < buildingDistance.Value.Squared()) return true; return false; }
protected static bool Intersects(FrustumNode a, SphereNode b) { Vector3 bTransformedCenter = b.ReferenceNode.ConvertLocalToWorldPosition(b.Position); Vector3 bTransformedTop = b.ReferenceNode.ConvertLocalToWorldPosition(MathHelper.Up * b.Radius); float bTransformedRadius = bTransformedCenter.Distance(bTransformedTop); return a.Camera.IsVisible(new Sphere(bTransformedCenter, bTransformedRadius)); }
public bool Intersects(FrustumNode frustum) { return PrimitiveNode.Intersects(frustum, this); }