Радар для 2D плоскости

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Радар для 2D плоскости

Сообщение Friend123 18 июн 2013, 15:25

День добрый.
Помогите разобраться с радаром. Взял за основу скрипт с забугорного ресурса http://wiki.unity3d.com/index.php?title=Radar. Но мне не нужна трехмерная среда, у меня используются всего две оси - X и Y.
В геометрии разбираюсь весьма туго еще со школы, учусь ей сейчас в процессе. Вот мой кусок кода, отвечающий за расчеты положений точек на радаре, он не дает точных значений (приблизительные весьма):
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;
using System;

public class Radar : MonoBehaviour {
        public Texture eTexture; // текстура иконок на радаре
        public Texture radarBG;  // текстура самого радара

        private OTSprite playerObj;
        public float mapScale = 0.3f;
        public float mapSizePercent = 15;
        private float maxDist = 200;

        private float mapWidth;
        private float mapHeight;
        private Vector2 mapCenter; // центр на радаре
       
        private float bX, bY;
       
        // Use this for initialization
        void Start () {
                playerObj = GameObject.FindGameObjectWithTag("Player").GetComponent<OTSprite>();
                setMapLocation();
        }
       
        void OnGUI () {
                GUI.DrawTexture(new Rect(mapCenter.x - mapWidth/2, mapCenter.y - mapHeight/2, mapWidth, mapHeight), radarBG);
                // Рисуем точки врагов
                DrawBlipsForObjects("Enemy");
        }
       
        private void setMapLocation () {               
                mapWidth = Screen.width * mapSizePercent/100.0f;
                mapHeight = mapWidth;

                // Центр на радаре
                mapCenter = new Vector2(mapWidth/2, Screen.height - mapHeight/2);
        }
 
        private void DrawBlipsForObjects(string tag){
        GameObject[] gos = GameObject.FindGameObjectsWithTag(tag);
 
        foreach (GameObject go in gos){
                        drawBlip(go.GetComponent<OTSprite>());
                }
        }
       
        private void drawBlip(OTSprite go){    
                Vector2 centerPos = playerObj.position;
                Vector2 extPos = go.position;
                int kfX = 1;
                int kfY = 1;
       
                // Дистанция до объекта
                float dist = Vector2.Distance(centerPos, extPos);
                               
                // Поправочные коэффициенты
                if(centerPos.x > extPos.x) kfX = -1;
                if(centerPos.y > extPos.y) kfY = -1;

                // Мат. расчеты
                float deltay = Vector2.Angle(centerPos, extPos);
                float bX = dist * (float)Math.Round(Mathf.Sin(deltay * Mathf.Deg2Rad), 4);
                float bY = dist * (float)Math.Round(Mathf.Cos(deltay * Mathf.Deg2Rad), 4);
               
                // Вычисляем положение от центра радара
                bX = bX * mapScale * kfX;
                bY = bY * mapScale * kfY;
 
                if(dist<= maxDist)
                {
                   GUI.DrawTexture(new Rect(mapCenter.x + bX, mapCenter.y + bY, 4, 4), eTexture);
                }      
        }
}
 


Помогите если и не кодом, то хотя бы технологией - куда копать, что читать!
Последний раз редактировалось Friend123 21 июн 2013, 07:26, всего редактировалось 2 раз(а).
Аватара пользователя
Friend123
Старожил
 
Сообщения: 701
Зарегистрирован: 26 фев 2012, 22:12
Откуда: Тверь
  • ICQ

Re: Радар для 2D плоскости

Сообщение Friend123 20 июн 2013, 08:30

Коллеги, не скупитесь на мысли :)
Аватара пользователя
Friend123
Старожил
 
Сообщения: 701
Зарегистрирован: 26 фев 2012, 22:12
Откуда: Тверь
  • ICQ

Re: Радар для 2D плоскости

Сообщение Tolking 20 июн 2013, 08:47

Технология: Перевод координат из одной системы координат в другую и маштабирование.
Ковчег построил любитель, профессионалы построили Титаник.
Аватара пользователя
Tolking
Адепт
 
Сообщения: 2716
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула

Re: Радар для 2D плоскости

Сообщение Friend123 20 июн 2013, 10:14

Tolking писал(а):Технология: Перевод координат из одной системы координат в другую и маштабирование.

Это я понимаю, посмотрите приведенный в первом посте код, логика размышлений вроде правильная, но не дает до конца корректный результат.
Аватара пользователя
Friend123
Старожил
 
Сообщения: 701
Зарегистрирован: 26 фев 2012, 22:12
Откуда: Тверь
  • ICQ

Re: Радар для 2D плоскости

Сообщение Tolking 20 июн 2013, 20:02

В первом посте нет ни перевода, ни масшабирования. Там что-то навороченное и непонятное...
Ковчег построил любитель, профессионалы построили Титаник.
Аватара пользователя
Tolking
Адепт
 
Сообщения: 2716
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула

Re: Радар для 2D плоскости

Сообщение Friend123 21 июн 2013, 07:31

Tolking писал(а):В первом посте нет ни перевода, ни масшабирования. Там что-то навороченное и непонятное...

Привел полный код в первом посту с русскими комментами. Сложного там на самом деле ничего нет. Кратко суть - вычисляем координаты центра радара. Принимаем, что центром на радаре является игрок. Далее идут расчеты положения врагов от положения игрока, по сути - как они находятся относительно друг друга: сверху-снизу, слева-справа и рисуем точки, исходя из коэффициента масштаба. Загвоздка именно в расчетах. Может есть какой-то более простой способ отрисовки радара, я не знаю о нем.
Аватара пользователя
Friend123
Старожил
 
Сообщения: 701
Зарегистрирован: 26 фев 2012, 22:12
Откуда: Тверь
  • ICQ

Re: Радар для 2D плоскости

Сообщение Woolf 21 июн 2013, 07:55

До чего дошло российское образование. Люди уже два вычитания и два деления сделать не могут ((

Вычисляете разницу в координатах между игроком и целью. Т.е. вычитаете координаты игрока от координат цели, ну или наоборот, как вам удобнее. делите на масштабность радара. Все. У вас координаты точки на радаре. Что еще нужно?
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: Радар для 2D плоскости

Сообщение Friend123 25 июн 2013, 13:25

Woolf писал(а):До чего дошло российское образование. Люди уже два вычитания и два деления сделать не могут ((

Вычисляете разницу в координатах между игроком и целью. Т.е. вычитаете координаты игрока от координат цели, ну или наоборот, как вам удобнее. делите на масштабность радара. Все. У вас координаты точки на радаре. Что еще нужно?


Помучавшись какое-то время, вывел всё-таки корректные результаты. Костыль оказался в этой строке "GUI.DrawTexture(new Rect(mapCenter.x - bX, mapCenter.y + bY, 4, 4), eTexture)". Чтобы положение точки врага относительно центра радара (игрока) было верным, от X нужно отнять рассчитываемую величину, а к Y - прибавить.
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;
using System;

public class Radar : MonoBehaviour {
        public Texture eTexture; // текстура иконок на радаре
        public Texture radarBG;  // текстура самого радара

        private OTSprite playerObj;
        public float mapScale = 0.3f;
        public float mapSizePercent = 15;
        private float maxDist = 200;

        private float mapWidth;
        private float mapHeight;
        private Vector2 mapCenter; // центр на радаре
       
        private float bX, bY;
       
        // Use this for initialization
        void Start () {
                playerObj = GameObject.FindGameObjectWithTag("Player").GetComponent<OTSprite>();
                setMapLocation();
        }
       
        void OnGUI () {
                GUI.DrawTexture(new Rect(mapCenter.x - mapWidth/2, mapCenter.y - mapHeight/2, mapWidth, mapHeight), radarBG);
                // Рисуем точки врагов
                DrawBlipsForObjects("Enemy");
        }
       
        private void setMapLocation () {                
                mapWidth = Screen.width * mapSizePercent/100.0f;
                mapHeight = mapWidth;

                // Центр на радаре
                mapCenter = new Vector2(mapWidth/2, Screen.height - mapHeight/2);
        }
 
        private void DrawBlipsForObjects(string tag){
        GameObject[] gos = GameObject.FindGameObjectsWithTag(tag);
 
        foreach (GameObject go in gos){
                        drawBlip(go.GetComponent<OTSprite>());
                }
        }
       
        private void drawBlip(OTSprite go){    
                Vector2 centerPos = playerObj.position;
                Vector2 extPos = go.position;
       
                // Дистанция до объекта
                float dist = Vector2.Distance(centerPos, extPos);

                bX = (centerPos.x - extPos.x) * mapScale;
                bY = (centerPos.y - extPos.y) * mapScale;
 
                if(dist<= maxDist){
                   GUI.DrawTexture(new Rect(mapCenter.x - bX, mapCenter.y + bY, 4, 4), eTexture);
                }      
        }
}
 
Аватара пользователя
Friend123
Старожил
 
Сообщения: 701
Зарегистрирован: 26 фев 2012, 22:12
Откуда: Тверь
  • ICQ

Re: Радар для 2D плоскости

Сообщение extravert 25 июн 2013, 14:49

public float scale = 10
точкаНаРадаре.х = центрРадара.х - (враг.позишн.х - игрок.позишн.х)/scale
точкаНаРадаре.y= центрРадара.y - (враг.позишн.y - игрок.позишн.y)/scale

Вам не нужны ни синусы, ни косинусы.
Аватара пользователя
extravert
UNIверсал
 
Сообщения: 465
Зарегистрирован: 24 дек 2012, 11:54

Re: Радар для 2D плоскости

Сообщение Friend123 25 июн 2013, 15:00

extravert писал(а):public float scale = 10
точкаНаРадаре.х = центрРадара.х - (враг.позишн.х - игрок.позишн.х)/scale
точкаНаРадаре.y= центрРадара.y - (враг.позишн.y - игрок.позишн.y)/scale

Вам не нужны ни синусы, ни косинусы.


Да, я разобрался, в предыдущем моем посте приведен как раз похожий код, без всяких синусов с маленьким уточнением по поводу X и Y, в одном нужно отнять, в другом прибавить к центру.
Аватара пользователя
Friend123
Старожил
 
Сообщения: 701
Зарегистрирован: 26 фев 2012, 22:12
Откуда: Тверь
  • ICQ


Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 30