Unity и VR: смещение с помощью функции «ReadPixels ()» - PullRequest
0 голосов
/ 16 октября 2018

Я столкнулся с небольшой проблемой при разработке программы для создания снимков для проекта VR.Мне нужно сделать скриншот определенной зоны, которая представляет собой прямоугольник с переменной шириной и высотой.Чтобы сделать это, у меня есть преобразование, привязанное к верхнему правому углу ограничительной рамки, которая представляет, где снимок будет сделан, и одно привязанное к нижнему правому углу.

Вот что этодолжен выглядеть следующим образом. Я добавил маленькие красные кружочки, чтобы показать положение преобразований.

Вот как выглядит скриншот с использованием левого глаза. Это тот же результат, если я использую«оба глаза» как цель в настройках камеры.

Вот как выглядит скринкап с правым глазом. Так что не только слишком далеко влево или вправо, но и немногослишком высоко.

Вот код, который создает Rect, и вот код, который читает пиксели.

Когда основная камера нацелена на левый глаз, есть почти половина Rect с каксмещение влево, когда он нацеливается на правый глаз, то же самое смещение вправо, когда нацеливается на оба, есть более мягкое смещение влево, и все они имеют небольшое вертикальное смещениевверх.

Любая помощь приветствуется.Я буду обновлять эту ветку, если найду что-нибудь!

public void SubmitPicture()
{
    Vector2 upperLeftPosition = mainCamera.WorldToScreenPoint(upperLeftTransform.position);
    Vector2 lowerRightPosition = mainCamera.WorldToScreenPoint(lowerRightTransform.position);
    pictureBoxRect.x = upperLeftPosition.x;
    pictureBoxRect.y = mainCamera.scaledPixelHeight - upperLeftPosition.y;

    pictureBoxRect.width = lowerRightPosition.x - upperLeftPosition.x;
    pictureBoxRect.height = lowerRightPosition.y - upperLeftPosition.y;

    pictureSnapper.OnInput(AbsoluteRect(pictureBoxRect));
}

public void OnInput(Rect pictureBox)
{
    if ((int)pictureBox.width > 0 && (int)pictureBox.height > 0)
    {
        videoPlayer.Stop();

        Texture2D videoTexture = new Texture2D((int)pictureBox.width, (int)pictureBox.height);
        videoTexture.ReadPixels(pictureBox, 0, 0);
        videoTexture.Apply();

        byte[] imageData = videoTexture.GetRawTextureData();

        if (debug)
        {
            byte[] imagePng = videoTexture.EncodeToPNG();
            File.WriteAllBytes(Application.dataPath + "/" + savename + ".png", imagePng);
        }
    }
}

private Rect AbsoluteRect(Rect rect)
{
    if (rect.width < 0)
    {
        rect.x -= rect.width;
        rect.width = Mathf.Abs(rect.width);
    }
    if (rect.height < 0)
    {
        rect.y += rect.height / 2;
        rect.height = Mathf.Abs(rect.height);
    }
    return rect;
}

Обновлен, чтобы добавить ссылки на изображения.

...