Координаты объекта в камере

Программирование на Юнити.

Координаты объекта в камере

Сообщение absolute_null 29 янв 2018, 14:32

Всем добрый день. Оптимизирую 2d приложение для разных расширений камеры (Android). У меня есть 3d объект, на сцене, на него смотрит камера сверху. Что-то вроде Space Shooter (https://unity3d.com/ru/learn/tutorials/s/space-shooter-tutorial

Но возникла проблема, когда я начал компилить это всё под Андроид. Начал настраивать камеру, и понял, что проблема в координатах объекта, как бы ни хотелось, меняя расширение камеры, меняется область видимости, а объект будет стоять на месте при изначальном положении. Тогда я написал формулу высчита новых координат. Задал начальные расширения в переменные, создал переменные, чтобы получать новые расширения, и с помощью пропорции высчитал. Но оказалось, что при расширении 400x800 и 400x900 (400 - координата x, горизонталь, 800/900 - координата z, вертикаль. Камера повёрнута на 90) координаты x разные! Глупый unity, вот на этом моменте и застрял.

Синтаксис:
Используется csharp
    public float xMin, xMax, zMin, zMax;
    public float screenHStandart;
    public float screenWStandart;
    public float screenNewH;
    public float screenNewW;

    private void Start()
    {
        screenHStandart = 854f;
        screenWStandart = 480f;
        screenNewH = Screen.height;
        screenNewW = Screen.width;
        xMin = ((screenNewW * -2.5f) / screenWStandart);
        xMax = ((screenNewW * 2.5f) / screenWStandart);
        zMin = -1;
        zMax = 6;

    }


Это нужно, чтобы объект не выходил на границы экрана. Координата начальная xMin -2.5f и xMax 2.5f при расширении 480x854 это границы боковые экрана, куда объекту не следует заходить.
absolute_null
UNец
 
Сообщения: 6
Зарегистрирован: 10 янв 2018, 20:35

Re: Координаты объекта в камере

Сообщение samana 29 янв 2018, 22:28

absolute_null писал(а):Глупый unity

Unity делает то, что ему говорят делать, не более)

По поводу вашего вопроса, я не знаю, как найти минимальную и максимальную границу видимой зоны от камеры с помощью разрешения экрана.
Но при старте игры, вы можете единожды стрельнуть двумя лучами из камеры и узнать где эти лучи пересеклись с плоскостью (в нулевых координатах, смотрящую вверх, то-есть пол). И таким образом узнать - какие минимальные и максимальные координаты по икс и зед видимы этой камерой (перспективная или ортографическая камера, это не важно).

Синтаксис:
Используется csharp
private void Start()
{
    Plane plane = new Plane(Vector3.up, Vector3.zero);

    Ray minRay = Camera.main.ViewportPointToRay(Vector2.zero);
    Ray maxRay = Camera.main.ViewportPointToRay(Vector2.one);

    float minHit;
    float maxHit;

    plane.Raycast(minRay, out minHit);
    plane.Raycast(maxRay, out maxHit);

    Vector3 minVector = minRay.GetPoint(minHit);
    Vector3 maxVector = maxRay.GetPoint(maxHit);

    // то, что вы ищите
    float minX = minVector.x;
    float maxX = maxVector.x;

    float minZ = minVector.z;
    float maxZ = maxVector.z;
}


Думаю есть способы проще и правильнее, но и этот работает.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Координаты объекта в камере

Сообщение Cr0c 30 янв 2018, 14:20

1. Camera.ScreenToWorldPoint(Vector3, float) - переносит плоскость экрана на float юнитов и возвращает мировые координаты;
2. Через ScreenPointToRay находить координату на нужном удалении от камеры (это будет равноудаленная точка);
3. Считать размер объекта в пикселях (WorldToScreenPoint) и пересчитывать объект в экранные с учетом его размеров;
Третий способ самый простой при произвольном повороте камеры.
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 3035
Зарегистрирован: 19 июн 2015, 13:50
Skype: cr0c81


Вернуться в Скрипты

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

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