`
berry_gong
  • 浏览: 5144 次
  • 性别: Icon_minigender_2
  • 来自: 厦门
最近访客 更多访客>>
社区版块
存档分类
最新评论

Camera 2 Ray

阅读更多

在上一节的视锥里说到,视图上的每个点都是三维空间中的一条线。用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分部的虚拟面。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics