Ограничивающая рамка на экране правильная, но смещенная вверх, когда я использую тот же прямоугольник, чтобы получить Texture2d - PullRequest
0 голосов
/ 17 января 2019

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

Сначала я делаю это стандартным вызовом Screen

ScreenCapture.CaptureScreenshot(filename)

затем я вызываю SnapShotInBoundingBox() в своем коде, чтобы создать Texture2d из прямоугольника ограничивающей рамки и сохранить его как снимок экрана.

Проблема, с которой я столкнулся, заключается в том, что при сохранении текстуры изображение смещается на несколько пикселей вверх.

public void OnGUI()  //draws the boundingbox 
{

   Bounds b = theCube.GetComponent<Renderer>().bounds;
   Camera cam = Camera.main;
    if (cam == null) return;
   //The object is behind us
   if (cam.WorldToScreenPoint(b.center).z < 0) return;

   //All 8 vertices of the bounds
   pts[0] = cam.WorldToScreenPoint(new Vector3(b.center.x + b.extents.x, b.center.y + b.extents.y, b.center.z + b.extents.z));
   pts[1] = cam.WorldToScreenPoint(new Vector3(b.center.x + b.extents.x, b.center.y + b.extents.y, b.center.z - b.extents.z));
   pts[2] = cam.WorldToScreenPoint(new Vector3(b.center.x + b.extents.x, b.center.y - b.extents.y, b.center.z + b.extents.z));
   pts[3] = cam.WorldToScreenPoint(new Vector3(b.center.x + b.extents.x, b.center.y - b.extents.y, b.center.z - b.extents.z));
   pts[4] = cam.WorldToScreenPoint(new Vector3(b.center.x - b.extents.x, b.center.y + b.extents.y, b.center.z + b.extents.z));
   pts[5] = cam.WorldToScreenPoint(new Vector3(b.center.x - b.extents.x, b.center.y + b.extents.y, b.center.z - b.extents.z));
   pts[6] = cam.WorldToScreenPoint(new Vector3(b.center.x - b.extents.x, b.center.y - b.extents.y, b.center.z + b.extents.z));
   pts[7] = cam.WorldToScreenPoint(new Vector3(b.center.x - b.extents.x, b.center.y - b.extents.y, b.center.z - b.extents.z));

   //Get them in GUI space
   for (int i = 0; i < pts.Length; i++) pts[i].y = Screen.height - pts[i].y;

   //Calculate the min and max positions
   Vector3 min = pts[0];
   Vector3 max = pts[0];
   for (int i = 1; i < pts.Length; i++)
   {
       min = Vector3.Min(min, pts[i]);
       max = Vector3.Max(max, pts[i]);
   }

   //Construct a rect of the min and max positions and apply some margin
   r = Rect.MinMaxRect(min.x, min.y, max.x, max.y);
   r.xMin -= BoundingBoxMargin;
   r.xMax += BoundingBoxMargin;
   r.yMin -= BoundingBoxMargin;
   r.yMax += BoundingBoxMargin;

    //Render the bounding box
    GUI.backgroundColor = new Color(0, 0, 0, 0);

    GUI.DrawTexture(r, boundingBoxTexture);
}

byte[] SnapShotInBoundingBox()
{

    Rect lasso = new Rect(r.x, r.y, r.width+3, r.height);
    Debug.Log(lasso);
    tex = new Texture2D((int)lasso.width, (int)lasso.height, TextureFormat.RGBA32,false);
    tex.ReadPixels(lasso, 0, 0);        //only render what's inside the bounding box,including the box itself
    tex.Apply();

    return tex.EncodeToJPG();

}

1 Ответ

0 голосов
/ 17 января 2019

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

CaptureScreenshot немедленно возвращается на Android. Снимок экрана продолжается в фоновом режиме. Полученный снимок экрана сохраняется в файловой системе через несколько секунд.

В то же время камера может двигаться, так что SnapShotInBoundingBox(); возвращает немного другое изображение.


Вы, вероятно, должны вызывать методы в обратном порядке:

SnapShotInBoundingBox();
ScreenCapture.CaptureScreenshot(filename);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...