无论距离如何,都使对象的视觉大小保持不变
Make object visual size constant despite the distance
请看视觉辅助。在 gif 之后,有两个 GUI。左侧的 GUI 会根据相机到物体的距离进行适当缩放。右侧的 GUI 正在缩放,在 'Scene' 视图中可以清楚地看到,但在游戏视图中甚至看不到。该应用程序适用于 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);
}
不太确定你做错了什么,因为距离除以常数必须给出所需的效果。无论如何试试这个代码:
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
另外,创建恒定的菜单大小并通过将世界 space 转换为屏幕 space 来定位它可能会更有效。
请看视觉辅助。在 gif 之后,有两个 GUI。左侧的 GUI 会根据相机到物体的距离进行适当缩放。右侧的 GUI 正在缩放,在 'Scene' 视图中可以清楚地看到,但在游戏视图中甚至看不到。该应用程序适用于 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);
}
不太确定你做错了什么,因为距离除以常数必须给出所需的效果。无论如何试试这个代码:
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
另外,创建恒定的菜单大小并通过将世界 space 转换为屏幕 space 来定位它可能会更有效。