妮妮在学习 2024-03-07 17:01 采纳率: 0%
浏览 6

unity代码运行比例问题

unity中加入AR相机后,用代码运行的箭头比例变得非常大,有哪位小天才可以帮我看看应该怎么改吗┭┮﹏┭┮


```c++
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 导航箭头
/// </summary>
public class NavPathArrow : MonoBehaviour
{
    public MeshRenderer meshRenderer;//箭头3D对象Quad
    public List<Transform> points = new List<Transform>();//路径点
    private List<MeshRenderer> lines = new List<MeshRenderer>();//显示的路径

    public float xscale = 1f;//缩放比例
    public float yscale = 1f;

    void Start()
    {
        //箭头宽度缩放值
        xscale = meshRenderer.transform.localScale.x;
        //箭头长度缩放值
        yscale = meshRenderer.transform.localScale.y;
    }

    //画路径
    public void DrawPath()
    {
        if (points == null || points.Count <= 1)
            return;
        for (int i = 0; i < points.Count - 1; i++)
        {
            DrawLine(points[i].position, points[i + 1].position, i);
        }
    }

    //画路径 参数为路径点数组
    public void DrawPath(Vector3[] points)
    {
        if (points == null || points.Length <= 1)
            return;
        for (int i = 0; i < points.Length - 1; i++)
        {
            DrawLine(points[i], points[i + 1], i);
        }
    }

    //隐藏路径
    public void HidePath()
    {
        for (int i = 0; i < lines.Count; i++)
            lines[i].gameObject.SetActive(false);
    }

    //画路径
    private void DrawLine(Vector3 start, Vector3 end, int index)
    {
        Debug.Log(transform.gameObject.name);
        MeshRenderer mr;
        if (index >= lines.Count)
        {
            mr = Instantiate(meshRenderer);
            lines.Add(mr);
        }
        else
        {
            mr = lines[index];
        }

        var tran = mr.transform;
        var length = Vector3.Distance(start, end);
        tran.localScale = new Vector3(xscale, length, 1);
        tran.position = (start + end) / 2;
        //指向end
        tran.LookAt(end);
        //旋转偏移
        tran.Rotate(90, 0, 0);
        mr.material.mainTextureScale = new Vector2(1, length * yscale);
        mr.gameObject.SetActive(true);
    }

    void OnGUI()
    {
        if (GUI.Button(new Rect(20, 40, 80, 20), "显示路径"))
        {
            DrawPath();
        }
        if (GUI.Button(new Rect(20, 80, 80, 20), "隐藏路径"))
        {
            HidePath();
        }
    }
}

```

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-07 17:01
    关注

    引自免费微信小程序:皆我百晓生

    在Unity中,当您添加AR相机后,发现导航箭头的比例变得非常大,这可能是由于AR相机的坐标空间、缩放比例或视口设置与3D箭头渲染不匹配导致的。针对您的代码,要解决箭头比例过大的问题,请尝试以下修改:

    1. 确保xscaleyscale变量被正确地初始化为预期的比例值。您可以根据需要调整它们以适应AR相机的空间。

    2. 检查AR相机的Transform组件中的位置、旋转和局部/全局缩放属性是否影响了箭头的比例显示。如果有必要,您可能需要在画线函数(DrawLine)中对箭头的位置和长度进行额外的转换或补偿。

    3. 考虑到AR相机可能会动态改变场景的比例,您可以在Start()方法或者每帧更新时获取AR相机的实际视野大小或其他相关参数,并据此动态调整箭头的比例。

    4. 修改DrawLine函数内的tran.localScale赋值,确保箭头长度基于真实世界单位进行缩放,例如,可以将长度(length)除以一个预设的系数来减小箭头在AR环境下的视觉尺寸。

    示例代码修改:

    // 在 Start() 方法中获取并应用 AR 相机的缩放系数
    void Start()
    {
        // 箭头宽度缩放值
        xscale = meshRenderer.transform.localScale.x;
        // 箭头长度缩放值,假设我们有一个全局的ARScaleFactor用于调节AR环境中物体的比例
        yscale = meshRenderer.transform.localScale.y * ARScaleFactor; // 假设ARScaleFactor是一个预先计算好的比例因子
    
        // 获取AR相机,并检查其缩放属性,如有必要,将它应用于箭头的比例
        Camera arCamera = FindObjectOfType<ARCamera>();
        if (arCamera)
        {
            float cameraScaleAdjustment = ...; // 根据AR相机的具体情况计算调整系数
            xscale *= cameraScaleAdjustment;
            yscale *= cameraScaleAdjustment;
        }
    }
    
    // 修改 DrawLine 函数中的长度缩放部分
    private void DrawLine(Vector3 start, Vector3 end, int index)
    {
        // ...
        var length = Vector3.Distance(start, end);
        // 将长度按比例缩小,这里假设ARLengthScaleFactor是调节AR环境下箭头长度的额外系数
        tran.localScale = new Vector3(xscale, length / ARLengthScaleFactor, 1);
        // ...
    }
    

    请注意,上述解决方案提供了基本思路和示例代码,但具体实现取决于您项目中AR系统的细节以及您希望如何控制箭头在AR环境下的视觉效果。您需要根据实际需求适配这些参数和逻辑。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 3月7日

悬赏问题

  • ¥15 用C语言完成一个复杂的游戏
  • ¥15 如何批量更改很多个文件夹里的文件名中包含文件夹名?
  • ¥50 MTK手机模拟HID鼠标出现卡顿
  • ¥20 求下下面这个数据结构代码
  • ¥15 路由器考试怎么办,有懂行的吗 ,eNSP
  • ¥20 前端 二进制文件流图片转化异常
  • ¥15 github上的这个C语言项目如何跑起来
  • ¥15 java 判断某个数 区间是否存在
  • ¥15 appium控制多个雷电模拟器问题
  • ¥15 C# iMobileDevice