使用World Space画布

时间:2016-09-12 16:43:31

标签: unity3d raycasting

我试图将鼠标事件转换为VR Raycast事件。

Input.mousePosition.x& Input.mousePosition.y作为鼠标单击事件的坐标。我想在VR Raycast上应用相同的事件。

我有以下代码

Ray ray = new Ray(CameraRay.transform.position, CameraRay.transform.forward);
RaycastHit hit;

if (GetComponent<Collider>().Raycast(ray, out hit, 100)) {
     Debug.Log ("True");
    Vector3 point = camera.WorldToScreenPoint(hit.point);
} else {
    Debug.Log ("False");
}

从Raycast命中点,我如何获得Ray击中对撞机的等效x-y坐标?

更新:

以下脚本附加到我的用于Google Cardboard的Unity设置中的颜色选择器对象。在悬停在颜色选择器上时,我想获得Raycast撞击对撞机的位置的坐标(这样我就可以获得该坐标中的颜色)。

enter image description here

问题1: 在FixedUpdate上,我发出了if语句if (GetComponent<Collider>().Raycast(ray, out hit, 100)),并且它返回false。我在这里缺少什么?

问题2: 我是否正确假设如果设置了hit.point,我可以得到射线击中对撞机的点的x,y,z坐标为点[0],点1和点[2] ]

1 个答案:

答案 0 :(得分:1)

我不是Unity中的VR专家,但您通常会将Camera.WorldToScreenPoint用于这些目的。要在主摄像头上使用它,请使用以下行:

Ray ray = new Ray(CameraRay.transform.position, CameraRay.transform.forward);
RaycastHit hit;

if (GetComponent<Collider>().Raycast(ray, out hit, 100)) {
    Vector3 point = camera.WorldToScreenPoint(hit.point);
}

如果您对此感兴趣,z值会为您提供相机的距离。 Unity文档:https://docs.unity3d.com/ScriptReference/Camera.WorldToScreenPoint.html

修改

问题1:

RaycastHit hit;

if (Physics.Raycast(CameraRay.transform.position, Vector3.forward, out hit)) {
     Debug.Log ("True");
    Vector3 point = camera.WorldToScreenPoint(hit.point);
} else {
    Debug.Log ("False");
}

尝试使用此代码,从我所读过的内容来看,Physics.Raycast()几乎总是比Collider.Raycast()更好用。

问题2:

Vector3[] point = new Vector3[3] {hit.point.x, hit.point.y, hit.point.z};

这将创建一个名为point的数组,该数组分配了三个变量,但可以丢弃z坐标以便在2D色轮上使用。