我想将相机移近Unity中的物体,以便缩放是线性的。在Unity Editor中查看“场景”窗口中的缩放。相机没有以恒定速度移动。放大的越多,相机移动的速度就越慢。我确实想要移动相机,我不想改变FOV。
答案 0 :(得分:2)
首先,是的,不要使用FOV来做到这一点,控制运动将是一个巨大的痛苦。处于低视野,意味着你专注于一个很小的部分,并且运动将难以控制,因为一个单位将是小视野中的大运动。此外,大FOV会产生鱼眼效果。所以没有。
实现这种快速减速效果的一种方法是使用距离来定义运动量
让我们考虑使用鼠标滚轮进行放大和缩小,您可以听取值并根据该值创建一个动作。
float movement = Input.GetAxis("Mouse ScrollWheel");
if(movement == 0)
{
return;
}
Transform camTr = Camera.main.transform;
float distance = Vector3.Distance(camTr.position, origin.position) + 1;
camTr.Translate(camTr.forward * distance * movement * Time.deltaTime * speed);
速度变量用于控制无论距离多远都有多快。距离得到加1,所以你仍然可以在靠近原点的地方移动。
需要定义原点位置,它可以基于从相机前进的光线投射并且在y = 0时击中。只是一个想法。它也可能是一个集中的对象,一切都取决于你在做什么。
这里的重点是,如果远离焦点,相机会移动得更快。此外,您可能想要夹住机芯,以便从远处开始不会导致巨大的移动。
答案 1 :(得分:0)
我建议你使用FOV(因为玩家感觉很好)
1-使用Transform.localPosition更改相机到近处或远处的距离 - 您应该将z轴更改为更改相机的距离
2-使用相机rendertotexture并在GUI中改变它的尺度(因为需要专业许可证并获得分配内存所以不是很好);
但是不知道你想忘记改变FOV的原因是什么
答案 2 :(得分:0)
点的透视投影的一个步骤是该点的距离除。这意味着任何物体的投影尺寸不会随其距离线性变化。
projectedSize = originalSize / distance
因此,如果您希望以其投影大小线性增长的方式接近对象,则必须非线性地改变距离。
我们通过将距离除以某个值f
来实现这一点。 f
的确切值取决于stepSize和(我认为)相机的FoV。
通过使用FixedUpdate()而不是Update(),我们确保我们有一个常量stepSize,它允许我们假设f
也是常量。
void FixedUpdate()
{
newDistance = oldDistance / f;
}
对于f
的定义,您可以使用任何大于但接近1的值。例如f = 1.01f
。这将很好地接近期望的行为。如果您希望它是完全线性的,那么您必须深入研究透视投影背后的计算并自己计算f
的确切值:https://en.wikipedia.org/wiki/3D_projection#Perspective_projection