在上一节的视锥里说到,视图上的每个点都是三维空间中的一条线。用Ray来描述。
Camerar提供了两个方法: ScreenPointToRay(提供屏幕坐标) ViewportPointToRay(提供标准化的坐标,0表示左和下,1表示右和上)。两个方法都返回一个由起始点和标示方向的向量构成的Ray。起始点在近裁剪面上。而不是相机原点。
Raycasting 从相机发出一条虚拟射线,直到撞到目标固体
var hit: RaycastHit; var ray: Ray = camera.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, hit)) { var objectHit: Transform = hit.transform; // Do something with the object that was hit by the raycast. }
相机随着Ray移动:效果如,选中一个物体,相机就靠近他,放大细节。
var zooming: boolean; var zoomSpeed: float; if (zooming) { var ray: Ray = camera.ScreenPointToRay(Input.mousePosition); zoomDistance = zoomSpeed * Input.GetAxis("Vertical") * Time.deltaTime; camera.transform.Translate(ray.direction * zoomDistance, Space.World); }
跟某个平面的撞击点
Plane mDragPlane; private float mDis = 0.0f; private Vector3 mPos; //距平面撞击点mDis的点 mDragPlane = new Plane(Vector3.up, new Vector3(0f, mOrigonPos.y, 0f)); mRay = Camera.main.ScreenPointToRay(Input.mousePosition); mDragPlane.Raycast(mRay, out mDis); mPos= mRay.GetPoint(mDis);
其中 plane是由平面法向量及平面上的一个点来确定这个平面的。它是一个把三维空间分成2分部的虚拟面。