Я столкнулся с небольшой проблемой при разработке программы для создания снимков для проекта 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;
}
Обновлен, чтобы добавить ссылки на изображения.