android - 为什么使用 Unity 尝试拍照时相机 View 太宽且不清晰?

标签 android ios unity-game-engine camera

尝试拍照并保存在指定路径中。我已将脚本附加到 RawImage。最初尝试过 Barts answer .但它有不同的旋转和图像翻转。所以添加了一些代码来调整旋转和翻转以纠正 View 。即使现在相机 View 看起来正确,看起来来自相机的视频输入太宽而不是清楚。

附上截图和代码。

zoom-wide

private WebCamTexture camTexture;
// public RawImage Img;

// Start is called before the first frame update
void Start()
{
    camTexture = new WebCamTexture();
    WebCamDevice[] devices = WebCamTexture.devices;

    if (devices.Length > 0)
    {
        camTexture.Play();

        //Code below to adjust rotation
        float rotationangle = (360 - camTexture.videoRotationAngle);
        Quaternion rotQuaternion = new Quaternion();
        rotQuaternion.eulerAngles = new Vector3(0, 0, rotationangle);
        this.transform.rotation = rotQuaternion;
    }
}

// Update is called once per frame
void Update()
{
    GetComponent<RawImage>().texture = camTexture;
    //CODE TO FLIP
    float scaleY = camTexture.videoVerticallyMirrored ? -1f : 1f;
    this.GetComponent<RawImage>().rectTransform.localScale = new Vector3(1f, scaleY, 1f);
}

public void PicTake()
{
    TakePhoto();
}

如何纠正这个问题。

最佳答案

我在使用 Android、iOS、Mac、PC 设备进行测试时遇到了类似的问题。下面是我用来解决缩放和旋转问题的脚本。

它使用 Unity Quad 作为背景平面并填充屏幕。

void CalculateBackgroundQuad()
{
    Camera cam = Camera.main;
    ScreenRatio = (float)Screen.width / (float)Screen.height;

    BackgroundQuad.transform.SetParent(cam.transform);
    BackgroundQuad.transform.localPosition = new Vector3(0f, 0f, cam.farClipPlane / 2f);

    float videoRotationAngle = webCamTexture.videoRotationAngle;

    BackgroundQuad.transform.localRotation = baseRotation * Quaternion.AngleAxis(webCamTexture.videoRotationAngle, Vector3.forward);

    float distance = cam.farClipPlane / 2f;
    float frustumHeight = 2.0f * distance * Mathf.Tan(cam.fieldOfView * 0.5f * Mathf.Deg2Rad);

    BackgroundQuad.transform.localPosition = new Vector3(0f, 0f, distance);
    Vector3 QuadScale = new Vector3(1f, frustumHeight, 1f);

    //adjust the scaling for portrait Mode & Landscape Mode
    if (videoRotationAngle == 0 || videoRotationAngle == 180)
    {
        //landscape mode
        TextureRatio = (float)(webCamTexture.width) / (float)(webCamTexture.height);
        if (ScreenRatio > TextureRatio)
        {
            float SH = ScreenRatio / TextureRatio;
            float TW = TextureRatio * frustumHeight * SH;
            float TH = frustumHeight * (webCamTexture.videoVerticallyMirrored ? -1 : 1) * SH;
            QuadScale = new Vector3(TW, TH, 1f);
        }
        else
        {
            float TW = TextureRatio * frustumHeight;
            QuadScale = new Vector3(TW, frustumHeight * (webCamTexture.videoVerticallyMirrored ? -1 : 1), 1f);
        }
    }
    else
    {
        //portrait mode
        TextureRatio = (float)(webCamTexture.height) / (float)(webCamTexture.width);
        if (ScreenRatio > TextureRatio)
        {
            float SH = ScreenRatio / TextureRatio;
            float TW = frustumHeight * -1f * SH;
            float TH = TW * (webCamTexture.videoVerticallyMirrored ? 1 : -1) * SH;
            QuadScale = new Vector3(TW, TH, 1f);
        }
        else
        {
            float TW = TextureRatio * frustumHeight;
            QuadScale = new Vector3(frustumHeight * -1f, TW * (webCamTexture.videoVerticallyMirrored ? 1 : -1), 1f);
        }
    }
    BackgroundQuad.transform.localScale = QuadScale;
}

上面的脚本应该适用于所有设备。只是简单的数学解决方案。

关于android - 为什么使用 Unity 尝试拍照时相机 View 太宽且不清晰?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57757396/

相关文章:

Dotnet Maui 中的 Android Assets 交付

android - TextView 安卓 :ellipsize ="end" issue

ios - Xcode 中关于 iOS 中的 fenceExemptQueue 的奇怪警告

ios - iOS 上的退避算法

c# - Unity 2D项目结构: How to create Player dynamically based on script

android - 如何通过 webview 覆盖一些手势事件,但让其他人通过?

ios - 检查我的应用程序的 iOS 设备 facebook 权限

ios - 我想为 iOS 制作一个交互式的 3D map 。我应该使用什么软件?

user-interface - 在 Unity 中从像素坐标转换为 UI 坐标

android - Android 上的 WebRTC