从相机中心投射光线不起作用
Posted
技术标签:
【中文标题】从相机中心投射光线不起作用【英文标题】:Raycasting from the camera center doesn't work 【发布时间】:2021-02-18 18:24:38 【问题描述】:我正在使用以下代码从相机中心进行光线投射。
using UnityEngine;
using System.Collections;
[RequireComponent(typeof(Camera))]
public class CameraPointer : MonoBehaviour
private GameObject hitObject = null;
private Vector3 reticlePosition = Vector3.zero;
public Camera mcamera;
public float Distance = 10f;
void Update ()
reticlePosition = mcamera.transform.position;
Ray ray = mcamera.ScreenPointToRay(reticlePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, Distance))
if (hitObject != hit.transform.gameObject)
if (hitObject != null)
hitObject.SendMessage("OnReticleExit", SendMessageOptions.DontRequireReceiver);
hitObject = hit.transform.gameObject;
hitObject.SendMessage("OnReticleEnter", SendMessageOptions.DontRequireReceiver);
else
hitObject.SendMessage("OnReticleHover", SendMessageOptions.DontRequireReceiver);
else
if (hitObject != null)
hitObject.SendMessage("OnReticleExit", SendMessageOptions.DontRequireReceiver);
hitObject = null;
不幸的是,它根本不起作用。它根本没有击中任何物体。我该如何解决这个问题?
【问题讨论】:
【参考方案1】:Ray ray = mcamera.ScreenPointToRay(reticlePosition);
这个函数是错误的方法。
screenpoint中的vector3参数应该是GameScreen Position(例如:屏幕1920x1080的坐标)
所以,你必须使用函数mcamera.ViewportPointToRay(new Vector3(0.5f,0.5f));
或者你可以使用
if (Physics.Raycast(reticlePosition, transform.forward,out hit Distance))
...
【讨论】:
【参考方案2】:这可能会按您的预期工作的原因是您在调用时将光线从屏幕空间投射到世界空间:
Ray ray = mcamera.ScreenPointToRay(reticlePosition);
请参阅文档here
因此,如果mcamera
位于原点,则您正在从屏幕的左下角进行光线投射。
如果您只想从相机视口的中心投射光线,那么这样的方法会起作用:
Ray ray = new Ray(mcamera.transform.position, mcamera.transform.forward);
这基本上从相机的当前位置开始沿着相机的前向矢量投射光线。
【讨论】:
以上是关于从相机中心投射光线不起作用的主要内容,如果未能解决你的问题,请参考以下文章