Rays from the Camera
射线是从摄像机的near clipping plane发射,而不是从相机的位置,摄像机提供了两种方法, ScreenPointToRay 和ViewportPointToRay ,二者的不同是 ScreenPointToRay 需要提供一个像素位置 ,它取决于你的屏幕分辨率, ViewportPointToRay 接受0..1范围内的归一化坐标 ( 0代表左下角 1 代表右上角)
Moving the Camera Along a Ray
有时得到一条与屏幕位置相对应的光线,然后沿着这条光线移动相机是很有用的。例如,您可能希望允许用户使用鼠标选择一个对象,然后在将其“固定”在鼠标下相同的屏幕位置的同时对其进行缩放(例如,当相机在查看战术地图时,这可能很有用)。实现这一点的代码相当简单:
using UnityEngine;
using System.Collections;
public class ExampleScript : MonoBehaviour {
public bool zooming;
public float zoomSpeed;
public Camera camera;
void Update() {
if (zooming) {
Ray ray = camera.ScreenPointToRay(Input.mousePosition);
float zoomDistance = zoomSpeed * Input.GetAxis("Vertical") * Time.deltaTime;
camera.transform.Translate(ray.direction * zoomDistance, Space.World);
}
}
}
Using an Oblique Frustum
默认情况下,视图截锥是对称地围绕camera对称排列的,你可以使截锥体“斜”,这意味着一边与中心线的夹角比另一边小。这使得图像一侧的透视图看起来更紧凑,给人的印象是,观察者非常接近该边缘可见的对象
可以通过 Physical Camera 的属性, Lens Shift来修改,也可以添加一个脚本修改 camera的 projection matrix.
第一种方法上篇博客已经说过了,
Setting Frustum Obliqueness Using a Script
using UnityEngine;
using System.Collections;
public class ExampleScript : MonoBehaviour {
void SetObliqueness(float horizObl, float vertObl) {
Matrix4x4 mat = Camera.main.projectionMatrix;
mat[0, 2] = horizObl;
mat[1, 2] = vertObl;
Camera.main.projectionMatrix = mat;
}
}
1 或者 –1 表示一侧的边缘和中心线重叠,0代表不偏移,
左边是0,右边是1,这两种方法都可以改变偏移值,我大概试了一下, Lens Shift 的值是 projection matrix值的二分之一,它俩的效果是一致的,就是 Lens Shift的y值是0.5,projection matrix的y值是1,二者的效果相同