private void View3DWidget_AfterDraw(object sender, DrawEventArgs e) { if (view3DWidget?.HasBeenClosed == false && this.TrackingObject != null) { // Account for loading items in InsertionGroups - inherit parent transform var offset = TrackingObject.Parent?.Matrix ?? Matrix4X4.Identity; AxisAlignedBoundingBox bounds = TrackingObject.GetAxisAlignedBoundingBox(offset); Vector3 renderPosition = bounds.GetBottomCorner(2); Vector2 cornerScreenSpace = view3DWidget.Object3DControlLayer.World.GetScreenPosition(renderPosition) - new Vector2(20, 0); e.Graphics2D.PushTransform(); Affine currentGraphics2DTransform = e.Graphics2D.GetTransform(); Affine accumulatedTransform = currentGraphics2DTransform * Affine.NewTranslation(cornerScreenSpace.X, cornerScreenSpace.Y); e.Graphics2D.SetTransform(accumulatedTransform); progressBar.OnDraw(e.Graphics2D); if (!string.IsNullOrEmpty(this.State)) { e.Graphics2D.DrawString(this.State, 0, -20, 11); } e.Graphics2D.PopTransform(); } }
private void View3DWidget_AfterDraw(object sender, DrawEventArgs e) { if (view3DWidget?.HasBeenClosed == false && this.TrackingObject != null) { // Account for loading items in InsertionGroups - inherit parent transform var offset = TrackingObject.Parent?.Matrix ?? Matrix4X4.Identity; AxisAlignedBoundingBox bounds = TrackingObject.GetAxisAlignedBoundingBox(offset); Vector3 renderPosition = bounds.GetBottomCorner(2); Vector2 cornerScreenSpace = view3DWidget.Object3DControlLayer.World.GetScreenPosition(renderPosition) - new Vector2(20, 10) * GuiWidget.DeviceScale; e.Graphics2D.PushTransform(); Affine currentGraphics2DTransform = e.Graphics2D.GetTransform(); Affine accumulatedTransform = currentGraphics2DTransform * Affine.NewTranslation(cornerScreenSpace.X, cornerScreenSpace.Y); e.Graphics2D.SetTransform(accumulatedTransform); progressBar.OnDraw(e.Graphics2D); if (!string.IsNullOrEmpty(this.State)) { var stringPrinter = new TypeFacePrinter(this.State, 9, new Vector2(0, -20)); var textBounds = stringPrinter.LocalBounds; textBounds.Inflate(textBounds.Height / 4); e.Graphics2D.Render(new RoundedRect(textBounds, textBounds.Height / 4), theme.BackgroundColor); stringPrinter.Render(e.Graphics2D, theme.TextColor); } e.Graphics2D.PopTransform(); } }
IEnumerator StartBattle(TrackingObject _first_turn, TrackingObject _second_turn) { yield return(new WaitForSeconds(1.0f)); game_state_ = eGameState.Result; int first_hp = _first_turn.hp_; int second_hp = _second_turn.hp_; // 체력 정보 갱신 _first_turn.obj_text_mesh_.text = _first_turn.name_ + "\n HP:" + first_hp; _second_turn.obj_text_mesh_.text = _second_turn.name_ + "\n HP:" + second_hp; while (true) { // 선공의 턴 _first_turn.obj_animation_.Play("Attack"); yield return(new WaitForSeconds(_first_turn.obj_animation_.GetClip("Attack").length)); _first_turn.obj_animation_.Play("Idle"); second_hp -= _first_turn.atk_; // 체력 정보 갱신 _first_turn.obj_text_mesh_.text = _first_turn.name_ + "\n HP:" + first_hp; _second_turn.obj_text_mesh_.text = _second_turn.name_ + "\n HP:" + second_hp; if (second_hp <= 0) { // _second_turn 의 패배 system_message_ = _first_turn.name_ + " 가 승리하였습니다."; break; } yield return(new WaitForSeconds(1.0f)); // 후공의 턴 _second_turn.obj_animation_.Play("Attack"); yield return(new WaitForSeconds(_second_turn.obj_animation_.GetClip("Attack").length)); _second_turn.obj_animation_.Play("Idle"); first_hp -= _second_turn.atk_; // 체력 정보 갱신 _first_turn.obj_text_mesh_.text = _first_turn.name_ + "\n HP:" + first_hp; _second_turn.obj_text_mesh_.text = _second_turn.name_ + "\n HP:" + second_hp; if (first_hp <= 0) { // _first_turn 의 패배 system_message_ = _second_turn.name_ + " 가 승리하였습니다."; break; } yield return(new WaitForSeconds(1.0f)); } }
private void OnGUI() { for (int i = 0; i < obj_zone.Length; i++) { TrackingObject zone = obj_zone[i]; if (zone.is_detected_) { StartCoroutine(getZoneData(zone.model_name, humid_text[i], temp_text[i])); } } }
private void OnGUI() { for (int i = 0; i < obj_band.Length; i++) { TrackingObject band = obj_band[i]; if (band.is_detected_) { StartCoroutine(getBandData(band.model_name, start_time_text[i], end_time_text[i], cost_text[i])); } } }
private void computeCurrentPosition() { TrackingObject obj = tracker.TrackingObject; DoubleRange unit = new DoubleRange(-1, 1); DoubleRange circle = new DoubleRange(Math.PI, 0); currentPosition.X = (float)Tools.Scale(xaxisRange, unit, obj.Center.X); currentPosition.Y = (float)Tools.Scale(yaxisRange, unit, obj.Center.Y); currentAngle = (float)Tools.Scale(angleRange, circle, obj.Angle); currentScale = (float)Tools.Scale(scaleRange, unit, Math.Sqrt(obj.Area)); }
private void computeCurrentPosition() { TrackingObject obj = tracker.TrackingObject; DoubleRange unit = new DoubleRange(-1, 1); DoubleRange circle = new DoubleRange(Math.PI, 0); currentX = (float)Vector.Scale(obj.Center.X, xaxisRange, unit); currentY = (float)Vector.Scale(obj.Center.Y, yaxisRange, unit); currentAngle = (float)Vector.Scale(obj.Angle, angleRange, circle); currentScale = (float)Vector.Scale(Math.Sqrt(obj.Area), scaleRange, unit); }
private static void TrackObjectInternal(Object obj, LoadedBundle loadedBundle) { var id = obj.GetInstanceID(); if (s_TrackingObjects.TryGetValue(id, out var trackingObject)) { trackingObject.RefCount++; } else { trackingObject = new TrackingObject(obj, loadedBundle); RetainBundleInternal(trackingObject.Bundle, 1); } s_TrackingObjects[id] = trackingObject; //update }
private static Maybe <PropertyValue> GetProperty(TrackingObject trackingObject, PropertyTag propertyTag) { var property = trackingObject.GetProperty(propertyTag); if (property.HasNoValue) { return(Maybe <PropertyValue> .NoValue()); } if (property.Value.State == PropertyStates.Deleted || property.Value.State == PropertyStates.LoadedAndDeleted) { return(Maybe <PropertyValue> .NoValue()); } return(property.Value.Value); }
public static Maybe <PropertyValue> GetProperty(this TrackingObject trackingObject, PropertyTag propertyTag, Func <Maybe <PropertyValue> > untrackedPropertyValueReader) { var propertyValue = GetProperty(trackingObject, propertyTag); if (propertyValue.HasValue) { return(propertyValue); } var untrackedPropertyValue = untrackedPropertyValueReader(); if (untrackedPropertyValue.HasNoValue) { return(Maybe <PropertyValue> .NoValue()); } trackingObject.UpdateProperty( propertyTag, p => new PropertyTrackingObject(propertyTag, PropertyStates.Loaded, untrackedPropertyValue.Value)); return(untrackedPropertyValue); }
private void computeCurrentPosition(int width, int height) { TrackingObject obj = tracker.TrackingObject; DoubleRange scaleX = new DoubleRange(0, width); DoubleRange scaleY = new DoubleRange(0, height); DoubleRange unit = new DoubleRange(-1, 1); this.rawX = (float)BestCS.Math.Tools.Scale(scaleX, unit, obj.Center.X); this.rawY = (float)BestCS.Math.Tools.Scale(scaleY, unit, obj.Center.Y); double newPositionX = BestCS.Math.Tools.Scale(xaxisRange, unit, rawX); double newPositionY = BestCS.Math.Tools.Scale(yaxisRange, unit, rawY); xsmooth.Push(newPositionX); ysmooth.Push(newPositionY); newPositionX = xsmooth.Mean; newPositionY = ysmooth.Mean; this.currentX = (float)(Math.Round(newPositionX, 1)); this.currentY = (float)(Math.Round(newPositionY, 1)); }
private static void TrackObjectsInternal <T>(T[] objs, LoadedBundle loadedBundle) where T : Object { int retainCount = 0; for (int i = 0; i < objs.Length; i++) { var id = objs[0].GetInstanceID(); if (s_TrackingObjects.TryGetValue(id, out var trackingObject)) { trackingObject.RefCount++; } else { trackingObject = new TrackingObject(objs[0], loadedBundle); retainCount++; } s_TrackingObjects[id] = trackingObject; //update } if (retainCount > 0) { RetainBundleInternal(loadedBundle, retainCount); //do once } }
private void source_NewFrame(object sender, NewFrameEventArgs eventArgs) { if (!IsRunning || (!IsTracking && !IsDetecting)) { return; } lock (syncObject) { Bitmap frame = eventArgs.Frame; int width = frame.Width; int height = frame.Height; BitmapData data = frame.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, frame.PixelFormat); UnmanagedImage head = new UnmanagedImage(data); if (IsDetecting) { IsDetecting = false; // Process the nose detector in the head image Rectangle[] regions = detector.ProcessFrame(head); if (regions.Length >= 1) { // Re-initialize tracker tracker.Reset(); tracker.SearchWindow = regions[0]; tracker.ProcessFrame(head); // Update initial position computeCurrentPosition(width, height); OnFaceEnter(new FaceEventArgs(currentX, currentY)); } else { IsDetecting = true; } } else if (IsTracking) { // Track the object tracker.ProcessFrame(head); // Get the object position TrackingObject obj = tracker.TrackingObject; // Update current position computeCurrentPosition(width, height); if (obj.IsEmpty) { OnFaceLeave(EventArgs.Empty); } else { OnFaceMove(new FaceEventArgs(currentX, currentY)); } } frame.UnlockBits(data); } }
void Awake() { stepBack = GetComponent <StepBack>(); trackingObject = GetComponent <TrackingObject>(); animator = GetComponent <Animator>(); }
private void source_NewFrame(object sender, NewFrameEventArgs eventArgs) { if (requestedToStop) { return; } if (!IsTracking && !IsDetecting) { return; } lock (syncObject) { // skip first frames during initialization if (skip < 10) { skip++; return; } Bitmap frame = eventArgs.Frame; int width = frame.Width; int height = frame.Height; BitmapData data = frame.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, frame.PixelFormat); UnmanagedImage image = new UnmanagedImage(data); if (IsDetecting) { // Reduce frame size to process it faster float xscale = (float)width / resize.NewWidth; float yscale = (float)height / resize.NewHeight; UnmanagedImage downsample = resize.Apply(image); // Process the face detector in the downsampled image Rectangle[] regions = detector.ProcessFrame(downsample); // Check if the face has been steady 5 frames in a row if (detector.Steady >= 5) { // Yes, so track the face Rectangle face = regions[0]; // Reduce the face size to avoid tracking background Rectangle window = new Rectangle( (int)((face.X + face.Width / 2f) * xscale), (int)((face.Y + face.Height / 2f) * yscale), 1, 1); window.Inflate((int)(0.25f * face.Width * xscale), (int)(0.40f * face.Height * yscale)); // Re-initialize tracker tracker.Reset(); tracker.SearchWindow = window; tracker.ProcessFrame(image); // Update initial position computeCurrentPosition(); OnHeadEnter(new HeadEventArgs(currentPosition, currentAngle, currentScale)); } } else if (IsTracking) { tracker.Extract = (NewFrame != null); // Track the object tracker.ProcessFrame(image); // Get the object position TrackingObject obj = tracker.TrackingObject; // Update current position computeCurrentPosition(); if (obj.IsEmpty || !tracker.IsSteady) { OnHeadLeave(EventArgs.Empty); } else { OnHeadMove(new HeadEventArgs(currentPosition, currentAngle, currentScale)); if (NewFrame != null && obj.Image != null) { Bitmap headFrame = obj.Image.ToManagedImage(); NewFrame(this, new NewFrameEventArgs(headFrame)); } } } frame.UnlockBits(data); } }
// Update is called once per frame void Update() { if (dlg.Active == true) { return; } if (TrackingObject != null) { float camera_angle = 90f; float toCheckDistance = 6f; ViewRader(camera_angle, toCheckDistance, GetComponent <Transform>().position); int index = Search(camera_angle, toCheckDistance, GetComponent <Transform>().position, TrackingObject); // Debug.Log(index); // エネミーに見つかっていないときの処理 if (index == -1) { if (floor.BGM() == "Warning") { floor.BGM("Default"); } TrackingObject.GetComponent <PlayerCellController>().SetColor(); // 自作 // autoMovingSpeed = 1.0f; } // エネミーに見つかっているときの処理 else { floor.BGM("Warning"); TrackingObject.GetComponent <PlayerCellController>().SetColor(new Color32(255, 0, 255, TrackingObject.GetComponent <PlayerCellController>().defaultColor.a)); autoMovingSpeed = 5.0f; // 初めて相手を見つけたときまたは見つけた相手が動いたとき(index番号が変わったとき) if (nextNavigation.Count == 0 || nextNavigation[nextNavigation.Count - 1] != index) { pmotion.Cancel(); // 一個前に自動移動した時間autoMovedTime autoMovedTime = Time.realtimeSinceStartup - AutoMovingSpan; //プレイヤーのいち List <int> route = floor.blocks.Solve(floor.blocks.GetBlockIndex(GetComponent <Transform>().position), index); nextNavigation.Clear(); for (int cnt = 1; cnt < route.Count; cnt++) { nextNavigation.Add(route[cnt]); } routeRenderer.Render(route, i => floor.blocks.GetBlockPosition(i), Color.red); } } } // Playerの条件分岐 if (AutoMovingSpan == 0) { foreach (var elem in actions) { if (Input.GetKeyDown(elem.Key)) { Move(elem.Value); } } } // エネミーの条件分岐 else if (Time.realtimeSinceStartup > autoMovedTime + AutoMovingSpan / autoMovingSpeed) { autoMovedTime = Time.realtimeSinceStartup; pmotion.Unset(); int[] pos = floor.blocks.GetBlockIndexXZ(GetComponent <Transform>().position); bool moved = false; while (nextNavigation.Count > 0) { int next = nextNavigation[0]; int x = floor.blocks.i2x(next); int z = floor.blocks.i2z(next); if (x - pos[0] != 0 || z - pos[1] != 0) { Move(new int[] { x - pos[0], z - pos[1], 0, 1 }, () => { nextNavigation.RemoveAt(0); if (nextNavigation.Count == 0) { autoMovingSpeed = 1.0f; routeRenderer.clear(); // Clearが効かない // routeRenderer.Clear(); } }); moved = true; break; } else { nextNavigation.RemoveAt(0); } } // movedがfalseだった場合は自動運転(ランダム)に切り替える if (moved == false) { List <string> avail = new List <string>(); // 動ける範囲があるか探す処理 foreach (var d in nextPosition) { if (floor.blocks.IsWall(pos[0] + d.Value[0], pos[1] + d.Value[1]) == false) { avail.Add(d.Key); } } if (avail.Count != 0) { Move(nextPosition[avail[UnityEngine.Random.Range(0, avail.Count)]]); } } } // めちゃくちゃ大事な処理 // 動いたあとの場所をしゅとくする // gameObject.nameが何の名前なのかを調べる floor.UpdateObjectPosition(gameObject.name, GetComponent <Transform>().position, GetComponent <Transform>().rotation); }