Unity和VR:使用“ ReadPixels()”函数的偏移量

时间:2018-10-16 19:07:25

标签: unity3d virtual-reality oculus

我在为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;
}

已更新以添加图片参考。

0 个答案:

没有答案