/// <summary> /// . /// </summary> private static AugmentedRealityManager _arManager; /// <summary> /// . /// </summary> private static ITrackable _ninjaTrackable; /// <summary> /// . /// </summary> private static List<ITrackable> _animationTrackables=new List<ITrackable>(); /// <summary> /// C . /// </summary> private static AnimationState _animationState; /// <summary> /// C . /// </summary> private static float _animTime = 0.1f;
// var camera = CameraManager.Instance.GetFirstWorkedCamera(); if (camera == null) { MessageBox.Show(Resources.CameraNotFoundString, Resources.WarningString, MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } // 64048030FPS , var displayParameters = new DisplayParameters(30, new Size(640, 480)); camera.DisplayParameters = camera.IsSupportedDisplayParameters(displayParameters) ? displayParameters : camera.GetSupportedDisplayParameters()[0];
// , // - 4 var tracker = new SquareMarkerTracker(4); // _ninjaTrackable = new SquareMarker("Ninja Marker", "Trackable\\1.trackable"); var animationAttackTrackable = new SquareMarker("Attack3", "Trackable\\5.trackable"); var animationCrouchTrackable = new SquareMarker("Crouch", "Trackable\\6.trackable"); var animationBackflipTrackable = new SquareMarker("Backflip", "Trackable\\7.trackable"); _animationTrackables.Add(animationCrouchTrackable); _animationTrackables.Add(animationBackflipTrackable); _animationTrackables.Add(animationAttackTrackable); // tracker.TrackableObjects.Add(_ninjaTrackable); tracker.TrackableObjects.AddRange(_animationTrackables);
// , var ogreSimpleSceneForm = new Form { Size = new Size(640, 480), Text = Resources.SwarpSDKExampleString, }; // var renderer = new Ogre3DRenderSystem(ogreSimpleSceneForm.Handle, "OgreConfig\\plugins.cfg", "OgreConfig\\ogre.cfg", "OgreConfig\\ogre.log") { SizeMode = SizeMode.Autosize }; // renderer.LoadResources("OgreConfig\\resources.cfg"); // . . var ninjaScene = new Ogre3DScene(renderer.Root, "Ninja Scene"); renderer.Scenes.Add(ninjaScene); LoadScene(ninjaScene.SceneManager);
private static void LoadScene(SceneManager sceneManager) { // , . var ninjaNode = sceneManager.RootSceneNode.CreateChildSceneNode("NinjaNode"); // ( ). var ninjaEntity = sceneManager.CreateEntity("Ninja", "ninja.mesh"); _animationState = ninjaEntity.GetAnimationState("Idle1"); _animationState.Loop = true; _animationState.Enabled = true; // MaterialPtr material = MaterialManager.Singleton.Create("NinjaMaterial", ResourceGroupManager.DEFAULT_RESOURCE_GROUP_NAME); material.GetTechnique(0).GetPass(0).CreateTextureUnitState("nskingr.jpg"); material.GetTechnique(0).GetPass(0).SetSceneBlending(SceneBlendType.SBT_TRANSPARENT_ALPHA); material.GetTechnique(0).GetPass(0).DepthCheckEnabled = true; material.GetTechnique(0).GetPass(0).DepthWriteEnabled = true; material.GetTechnique(0).GetPass(0).LightingEnabled = false; ninjaEntity.SetMaterial(material); // 3 , ninjaNode.Scale(3f,3f,3f); ninjaNode.AttachObject(ninjaEntity); ninjaNode.SetVisible(true); }
// . _arManager = new AugmentedRealityManager(camera, tracker, renderer); // . camera.Start(); // . _arManager.Start(); ogreSimpleSceneForm.Show(); while (ogreSimpleSceneForm.Created) { // , UpdateScenes(ninjaScene.SceneManager); // . // , , // . _arManager.Renderer.RenderFrame(); // . Application.DoEvents(); } // . _arManager.Dispose(); renderer.Dispose(); camera.Dispose();
private static void UpdateScenes(SceneManager ninjaSceneManager) { foreach (var tracker in _arManager.Trackers) { // , // , . var foundTrackableObjects = new List<ITrackable>(tracker.LastDetectedObjects); // . foreach (var scene in _arManager.Renderer.Scenes) { // , . if (foundTrackableObjects.Contains(_ninjaTrackable)) { // , . scene.Visible = true; // . var trackablePose = tracker.GetPose(_ninjaTrackable); // . scene.OrientScene(trackablePose); // ( =)) var ninjaEntity = ninjaSceneManager.GetEntity("Ninja"); // var newAnimationState = ninjaEntity.GetAnimationState(SelectAnimation(foundTrackableObjects, _animationTrackables)); // , if (newAnimationState.AnimationName != _animationState.AnimationName) { _animationState.Enabled = false; _animationState = newAnimationState; _animationState.Loop = true; _animationState.Enabled = true; } // , _animationState.AddTime(_animTime); } else { scene.Visible = false; } } } } private static string SelectAnimation(ICollection<ITrackable> found, IEnumerable<ITrackable> target) { foreach (var trackable in target.Where(trackable => !found.Contains(trackable))) { return trackable.Name; } return "Idle1"; }
// var newAnimationState = ninjaEntity.GetAnimationState(SelectAnimation(foundTrackableObjects, _animationTrackables)); // , if (newAnimationState.AnimationName != _animationState.AnimationName) { _animationState.Enabled = false; _animationState = newAnimationState; _animationState.Loop = true; _animationState.Enabled = true; }
Source: https://habr.com/ru/post/146604/
All Articles