unity Camera发射射线

Rays from the Camera

射线是从摄像机的near clipping plane发射,而不是从相机的位置,摄像机提供了两种方法, ScreenPointToRayViewportPointToRay ,二者的不同是 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,二者的效果相同

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TO_ZRG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值