相机:"Linear" 变焦
Camera: "Linear" zoom
我想在 Unity 中将相机移近一个对象,以便缩放是线性的。在 Unity 编辑器中查看场景 window 中的缩放。相机不是以恒定速度移动。放大得越多,相机移动得越慢。而且我确实想移动相机,我不想改变FOV。
我建议你用FOV(因为玩家感觉不错)
1- 使用 Transform.localPosition 将相机距离更改为近或远 - 您应该更改 z 轴以更改相机距离
2- 使用相机渲染纹理并在 GUI 中更改它的比例(不好,因为需要 pro unity 许可证并获得内存分配);
但不知道你为什么要忘记改变 FOV
一点透视投影的一步是除以该点的距离。这意味着任何物体的投影尺寸都不会随其距离线性变化。
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
首先,是的,不要使用 FOV 来做到这一点,控制运动会非常痛苦。处于低 FOV 状态,意味着您专注于一个微小的部分,并且运动将难以控制,因为一个单元在小 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 处击中的光线投射。只是一个想法。也可以是一个重点对象,这完全取决于你在做什么。
这里的重点是,如果您远离焦点,您的相机将移动得更快。此外,您可能希望限制运动,以便从远处开始不会导致巨大的运动。
我想在 Unity 中将相机移近一个对象,以便缩放是线性的。在 Unity 编辑器中查看场景 window 中的缩放。相机不是以恒定速度移动。放大得越多,相机移动得越慢。而且我确实想移动相机,我不想改变FOV。
我建议你用FOV(因为玩家感觉不错)
1- 使用 Transform.localPosition 将相机距离更改为近或远 - 您应该更改 z 轴以更改相机距离
2- 使用相机渲染纹理并在 GUI 中更改它的比例(不好,因为需要 pro unity 许可证并获得内存分配);
但不知道你为什么要忘记改变 FOV
一点透视投影的一步是除以该点的距离。这意味着任何物体的投影尺寸都不会随其距离线性变化。
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
首先,是的,不要使用 FOV 来做到这一点,控制运动会非常痛苦。处于低 FOV 状态,意味着您专注于一个微小的部分,并且运动将难以控制,因为一个单元在小 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 处击中的光线投射。只是一个想法。也可以是一个重点对象,这完全取决于你在做什么。
这里的重点是,如果您远离焦点,您的相机将移动得更快。此外,您可能希望限制运动,以便从远处开始不会导致巨大的运动。