我试图将鼠标事件转换为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撞击对撞机的位置的坐标(这样我就可以获得该坐标中的颜色)。
问题1:
在FixedUpdate上,我发出了if语句if (GetComponent<Collider>().Raycast(ray, out hit, 100))
,并且它返回false。我在这里缺少什么?
问题2: 我是否正确假设如果设置了hit.point,我可以得到射线击中对撞机的点的x,y,z坐标为点[0],点1和点[2] ]
答案 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色轮上使用。