public void Create(Navmesh navmesh) { this._navmesh = navmesh; //一定要保存起来,Navmesh的析构函数会把非托管内存的指针清掉!! NavStatus status = NavmeshQuery.Create(navmesh, 2048, out this._query); if (status != NavStatus.Sucess) { LLogger.Error(status); } }
public Pathfinder(Navmesh navMesh) { _navMesh = navMesh; _filter = new NavmeshQueryFilter(); if (NavUtil.Failed(NavmeshQuery.Create(_navMesh, 1000, out _query))) { throw new Exception("NavQuery failed"); } _pathCorridor = new PathCorridor(1000, 1000, _query, _filter); }
public List <Waypoint> GenerateWaypointsBetweenTwoPoints(Navmesh navmesh, Vector3 startPos, Vector3 endPos) { List <Waypoint> waypoints = new List <Waypoint>(); NavmeshQuery query; var status = NavmeshQuery.Create(navmesh, 1024, out query); if (!NavUtil.Failed(status)) { org.critterai.Vector3 navStartPointVect; org.critterai.Vector3 navEndPointVect; var navStartPointStatus = query.GetNearestPoint(1, new org.critterai.Vector3(startPos.x, startPos.y, startPos.z), out navStartPointVect); var navEndPointStatus = query.GetNearestPoint(1, new org.critterai.Vector3(startPos.x, startPos.y, startPos.z), out navEndPointVect); if (navStartPointStatus == NavStatus.Sucess && navEndPointStatus == NavStatus.Sucess) { NavmeshPoint navStartPoint = new NavmeshPoint(1, new org.critterai.Vector3(startPos.x, startPos.y, startPos.z)); NavmeshPoint navEndPoint = new NavmeshPoint(1, new org.critterai.Vector3(endPos.x, endPos.y, endPos.z)); uint[] path = new uint[1024]; int pathCount; status = query.FindPath(navStartPoint, navEndPoint, new NavmeshQueryFilter(), path, out pathCount); if (!NavUtil.Failed(status)) { const int MaxStraightPath = 4; int wpCount; org.critterai.Vector3[] wpPoints = new org.critterai.Vector3[MaxStraightPath]; uint[] wpPath = new uint[MaxStraightPath]; WaypointFlag[] wpFlags = new WaypointFlag[MaxStraightPath]; status = query.GetStraightPath(navStartPoint.point, navEndPoint.point , path, 0, pathCount, wpPoints, wpFlags, wpPath , out wpCount); if (!NavUtil.Failed(status) && wpCount > 0) { foreach (var wp in wpPoints) { Mogre.Vector3 wayPointPos = new Vector3(wp.x, wp.y, wp.z); waypoints.Add(new Waypoint(wayPointPos, new Vector3())); } } } } } return(waypoints); }
public NavManager CreateManager() { if (!(mNavmeshData && NavmeshData.HasNavmesh)) { Debug.LogError(name + ": Aborted initialization. Navigation mesh not available."); return(null); } if (!mAvoidanceSet || !mGroupsSettings) { Debug.LogError( name + ": Aborted initialization. Avoidance and/or agent groups not available."); return(null); } Navmesh navmesh = NavmeshData.GetNavmesh(); NavmeshQuery query; NavStatus status = NavmeshQuery.Create(navmesh, mMaxQueryNodes, out query); if ((status & NavStatus.Sucess) == 0) { Debug.LogError( name + ": Aborted initialization. Failed query creation: " + status.ToString()); return(null); } CrowdManager crowd = CrowdManager.Create(mMaxCrowdAgents, mMaxAgentRadius, navmesh); if (crowd == null) { Debug.LogError(name + ": Aborted initialization. Failed crowd creation."); return(null); } for (int i = 0; i < CrowdManager.MaxAvoidanceParams; i++) { crowd.SetAvoidanceConfig(i, mAvoidanceSet[i]); } NavGroup mGroup = new NavGroup(navmesh, query, crowd, crowd.QueryFilter, mExtents, false); int count = mGroupsSettings.GroupCount; Dictionary <byte, NavAgentGroup> mAgentGroups = new Dictionary <byte, NavAgentGroup>(count); for (int i = 0; i < count; i++) { byte groupId; NavAgentGroup group = mGroupsSettings.CreateAgentGroup(i, mMaxPath, mMaxStraightPath, out groupId); group.angleAt = mAngleAt; group.heightTolerance = mHeightTolerance; group.radiusAt = mRadiusAt; group.radiusNear = mRadiusNear; group.turnThreshold = mTurnThreshold; mAgentGroups.Add(groupId, group); } return(NavManager.Create(mMaxAgents, mGroup, mAgentGroups)); }
public void createScene() { // set background and some fog AdvancedMogreFramework.Singleton.m_pViewport.BackgroundColour = new ColourValue(1.0f, 1.0f, 0.8f); m_pSceneMgr.SetFog(FogMode.FOG_LINEAR, new ColourValue(1.0f, 1.0f, 0.8f), 0, 15, 100); // set shadow properties m_pSceneMgr.ShadowTechnique = ShadowTechnique.SHADOWTYPE_TEXTURE_MODULATIVE; m_pSceneMgr.ShadowColour = new ColourValue(0.5f, 0.5f, 0.5f); m_pSceneMgr.SetShadowTextureSize(1024); m_pSceneMgr.ShadowTextureCount = 1; // disable default camera control so the character can do its own m_pCameraMan.setStyle(CameraStyle.CS_MANUAL); // use a small amount of ambient lighting m_pSceneMgr.AmbientLight = new ColourValue(0.3f, 0.3f, 0.3f); // add a bright light above the scene Light light = m_pSceneMgr.CreateLight(); light.Type = (Light.LightTypes.LT_POINT); light.Position = new Mogre.Vector3(-10, 40, 20); light.SpecularColour = ColourValue.White; // create a floor mesh resource MeshManager.Singleton.CreatePlane("floor", ResourceGroupManager.DEFAULT_RESOURCE_GROUP_NAME, new Plane(Mogre.Vector3.UNIT_Y, 0), 100, 100, 10, 10, true, 1, 10, 10, Mogre.Vector3.UNIT_Z); // create a floor entity, give it a material, and place it at the origin SceneProp floorSceneProp = new SceneProp( this, m_pSceneMgr, m_pSceneMgr.RootSceneNode, physicsScene, "Floor", "floor" ); floorSceneProp.SetMaterialName("Examples/Rockwall"); //Navmesh Navmesh floorNavMesh = MeshToNavmesh.LoadNavmesh(floorSceneProp.Entity); NavmeshQuery query; NavmeshPoint retStartPoint; NavmeshPoint retEndPoint; org.critterai.Vector3 pointStart = new org.critterai.Vector3(0, 0, 0); org.critterai.Vector3 pointEnd = new org.critterai.Vector3(0, 0, 0); org.critterai.Vector3 extents = new org.critterai.Vector3(2, 2, 2); NavStatus status = NavmeshQuery.Create(floorNavMesh, 100, out query); Console.WriteLine("Status returned when NavmeshQuery was built: " + status); NavmeshQueryFilter filter = new NavmeshQueryFilter(); filter.IncludeFlags = 1; status = query.GetNearestPoint(pointStart, extents, filter, out retStartPoint); Console.WriteLine("\nStatus of startPoint GetNearestPoint: " + status); status = query.GetNearestPoint(pointEnd, extents, filter, out retEndPoint); Console.WriteLine("\nStatus of endPoint GetNearestPoint: " + status); uint[] path = new uint[100]; int pathCount; status = query.FindPath(retStartPoint, retEndPoint, filter, path, out pathCount); Console.WriteLine("\nStatus of Find path: " + status); // create our character controller m_pChara = new SinbadCharacterController(this, physicsScene, m_pCamera, new Mogre.Vector3(0, 5, 0), 0); SinbadCharacterController bot1 = new SinbadCharacterController(this, physicsScene, m_pCamera, new Mogre.Vector3(-10, 5, 0), 1, false); SinbadCharacterController bot2 = new SinbadCharacterController(this, physicsScene, m_pCamera, new Mogre.Vector3(0, 5, -10), 2, false); SinbadCharacterController bot3 = new SinbadCharacterController(this, physicsScene, m_pCamera, new Mogre.Vector3(10, 5, 0), 3, false); agents.Add(m_pChara); agents.Add(bot1); agents.Add(bot2); agents.Add(bot3); AdvancedMogreFramework.Singleton.m_pTrayMgr.toggleAdvancedFrameStats(); StringVector items = new StringVector(); items.Insert(items.Count, "Help"); ParamsPanel help = AdvancedMogreFramework.Singleton.m_pTrayMgr.createParamsPanel(TrayLocation.TL_TOPLEFT, "HelpMessage", 100, items); help.setParamValue("Help", "H / F1"); }
public void CreateQuery(float fMoveSpeed, float fTurnSpeed) { this.mTurnSpeed = fTurnSpeed; this.mMoveSpeed = fMoveSpeed; NavStatus status = NavmeshQuery.Create(navmesh, mMaxQueryNodes, out query); if ((status & NavStatus.Sucess) == 0) { Debug.LogError( fileName + ": Aborted initialization. Failed query creation: " + status.ToString()); mCrowdManager = null; return; } mCrowdManager = CrowdManager.Create(mMaxCrowdAgents, mMaxAgentRadius, navmesh); if (mCrowdManager == null) { Debug.LogError(fileName + ": Aborted initialization. Failed crowd creation."); } CrowdAvoidanceParams mCrowdParam = CrowdAvoidanceParams.CreateStandardMedium(); mCrowdManager.SetAvoidanceConfig(0, mCrowdParam); mCrowdAgentParams = new CrowdAgentParams(); mCrowdAgentParams.avoidanceType = 0; mCrowdAgentParams.collisionQueryRange = 3.2f; mCrowdAgentParams.height = 1.8f; mCrowdAgentParams.maxAcceleration = 8.0f; mCrowdAgentParams.maxSpeed = this.mMoveSpeed; mCrowdAgentParams.pathOptimizationRange = 12.0f; mCrowdAgentParams.radius = 1.0f; mCrowdAgentParams.separationWeight = 2.0f; mCrowdAgentParams.updateFlags = CrowdUpdateFlags.AnticipateTurns | CrowdUpdateFlags.ObstacleAvoidance | CrowdUpdateFlags.CrowdSeparation | CrowdUpdateFlags.OptimizeVis | CrowdUpdateFlags.OptimizeTopo; polyResult = new uint[300]; pointResult = new Vector3[300]; tileBufferPoints = new Vector3[3000]; pointResultBuffer = new Vector3[300]; polyResultBuffer = new uint[300]; NavmeshTile tile = navmesh.GetTile(0); int count = tile.GetVerts(tileBufferPoints); Debug.Log("Tile " + tile.GetTileRef() + " count:" + count); if (count > 3000) { tileBufferPoints = new Vector3[count]; } tileBufferRef = -1; //NavmeshPoly[] polys=new NavmeshPoly[3000]; //int polyCount; //polyCount=tile.GetPolys(polys); //for (int i = 0; i < polyCount; i++) //{ // NavmeshPoly poly = polys[i]; // //if (poly.Type == NavmeshPolyType.OffMeshConnection) // { // Debug.Log("Poly" + i+"type"+poly.Type.ToString()); // } //} }
public NavManager CreateManager() { CheckCrowdAvoidanceSet(); if (!(mNavmeshData && NavmeshData.HasNavmesh)) { Debug.LogError("Aborted initialization. Navigation mesh not available."); return(null); } //Debug.Log("NavmeshData-------"+ NavmeshData); Navmesh navmesh = NavmeshData.GetNavmesh(); if (navmesh == null) { NavStatus theStatus = Navmesh.Create(navMeshData, out navmesh); Debug.Log("Navmesh.Create ---->" + theStatus + "---->" + (int)(theStatus & NavStatus.Sucess)); if (NavUtil.Failed(theStatus)) { Debug.LogError("NavUtil.Failed(Navmesh.Create(navMeshData, out navmesh) Fail!"); } Debug.Log("--------------------\n" + navMeshData + "---" + navMeshData.Length + "\n-----------------\nNavmesh-------" + navmesh); } if (navmesh == null) { Debug.LogError(" navmesh is null"); return(null); } NavmeshQuery query; NavStatus status = NavmeshQuery.Create(navmesh, mMaxQueryNodes, out query); if ((status & NavStatus.Sucess) == 0) { Debug.LogError(" Aborted initialization. Failed query creation: " + status.ToString()); return(null); } CrowdManager crowd = CrowdManager.Create(mMaxCrowdAgents, mMaxAgentRadius, navmesh); if (crowd == null) { Debug.LogError("Aborted initialization. Failed crowd creation."); return(null); } for (int i = 0; i < CrowdManager.MaxAvoidanceParams; i++) { crowd.SetAvoidanceConfig(i, CrowdAvoidanceConfig[i]); } NavGroup mGroup = new NavGroup(navmesh, query, crowd, crowd.QueryFilter, mExtents, false); int count = AgentGroupSettingManager.GetGroupCount(); Dictionary <byte, NavAgentGroups> mAgentGroups = new Dictionary <byte, NavAgentGroups>(count); for (int i = 0; i < count; i++) { byte groupId; NavAgentGroups group = AgentGroupSettingManager.CreateAgentGroup(i, mMaxPath, mMaxStraightPath, out groupId); group.angleAt = mAngleAt; group.heightTolerance = mHeightTolerance; group.turnThreshold = mTurnThreshold; mAgentGroups.Add(groupId, group); } return(NavManager.Create(mMaxAgents, mGroup, mAgentGroups)); }