【问题标题】:Make object visual size constant despite the distance尽管距离很远,但使对象的视觉大小保持不变
【发布时间】:2018-05-23 05:28:39
【问题描述】:

Visual aid here

请参阅视觉帮助。在 gif 之后,有两个 GUI。左侧的 GUI 会根据摄像机到对象的距离正确缩放。右侧的 GUI 是缩放的,在“场景”视图中清晰可见,但在游戏视图中甚至不明显。该应用程序适用于 Hololens,因为用户头部控制 Unity 场景中的相机。

问题在于设置对象的缩放比例。一整天都在绞尽脑汁,试图复制左侧 GUI 上显示的缩放类型。划分距离并将其用作比例因子显然是不正确的,因为对象要么太大而增长太快,要么太小而增长太慢,但我不知道如何在中间的某个地方相遇。以明显但不令人讨厌的大或难以察觉的速度在两个方向上同等缩放。

目前的实现代码:

// GameObject and GUI assigned in Editor
public GameObject sphere, rotationManager;

// For rotationManager scaling
private float cameraToObject,

void Update()
{
    /* Scale rotationManager based on Cameras distance to object */
    cameraToObject = Vector3.Distance(
        sphere.transform.position, 
        Camera.main.transform.position);

    Debug.Log("distance: " + cameraToObject);

    // If camera isn't too close to our object
    if (cameraToObject > 4f)
    {
        // adjust scale
        rotationManager.transform.localScale = new Vector3(
            cameraToObject / 5, 
            cameraToObject / 5, 
            rotationManager.localScale.z);

        // enable rotationManager
        rotationManager.gameObject.SetActive(true);

    }
    // Camera is too close, turn off GUI
    else
        rotationManager.gameObject.SetActive(false);
}

【问题讨论】:

  • 它在游戏视图中不明显的原因是预期的目标,当你在做这样的事情时:它看起来不像它的缩放的原因是因为它是更靠近相机,这使它看起来更大,另外它被缩小了相同的数量。 x * (1 / x)
  • @Draco18s 如果我只缩放 X&Y,它如何更接近相机? Z 缩放和/或定位不会引起这种效果。我也尝试缩放 Z,但我也无法获得所需的行为
  • 相机正在移动。它附着在你的头上。 :|

标签: c# unity3d scale distance


【解决方案1】:

不确定您做错了什么,因为将距离除以常数必须产生所需的效果。无论如何试试这个代码:

using UnityEngine;

public class AutoSize : MonoBehaviour
{
    public float FixedSize = .005f;
    public Camera Camera;

    void Update ()
    {
        var distance = (Camera.transform.position - transform.position).magnitude;
        var size = distance * FixedSize * Camera.fieldOfView;
        transform.localScale = Vector3.one * size;
        transform.forward = transform.position - Camera.transform.position;
    }
}

它似乎工作正常 - preview

也许创建恒定的菜单大小并通过将世界空间转换为屏幕空间来定位它会更有效。

【讨论】:

  • @jtth 查看project
  • transform.position = (Camera.main.transform.position - sphere.transform.position) / 2f;
  • @jtth 在你的情况下,你有一半的方向是从相机到球体的。你应该对位置求和,而不是减去。中心 = (pos0 + pos1) / 2.
  • 伟大的维克多,谢谢。
猜你喜欢
  • 2020-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-14
  • 1970-01-01
  • 2019-02-05
相关资源
最近更新 更多