我在为VR项目开发图片拍摄器时遇到了一个小问题。我需要截取特定区域的屏幕截图,该区域是宽度和高度可变的矩形。为此,我在锚定框的右上角固定了一个变换,该变换表示要在哪里拍摄图片,在锚定的右下角固定了一个变换。
Here's what it should look like.我添加了红色小圆圈以显示变换的位置。
Here's what a screencap using the left eye looks like.如果在“相机”设置中使用“两只眼睛”作为目标,结果相同。
Here's what a screencap using the right eye looks like.因此,它不仅离得太远,而且太高。
这是创建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;
}
已更新以添加图片参考。