UNITY3D如何检查相机的方向向量?

时间:2016-01-17 11:01:06

标签: unity3d unityscript

我是Unity的新人。我用FPS模式玩游戏,用鼠标移动相机旋转,太阳是定向光。我必须写脚本,检查太阳是否在玩家的视野中。我以为我可以计算2个向量之间的角度然后我决定太阳是否可见。第一个向量是:

var playerSun =  light.transform.position - camera.transform.position;

但我对第二个问题有疑问......我不知道应该使用哪个变量,camera.transform.forward总是(0,0,1)...

你能帮帮我吗?我将非常感激。

2 个答案:

答案 0 :(得分:3)

Vector3 direction = light.position - player.position;
float dot = Vector3.Dot(direction.normalized, player.forward);
if(dot > 0) { Debug.Log("Sun is on the front"); }

当两个向量对齐时,点积返回1,当它们为90度时返回0,当它们相反时返回-1。

该值以弧度为单位,因此如果您需要90度FOV,它将是45度(因为90是45左右),这是适当的。 0.7F。

if(dot > 0.7f) { Debug.Log("Sun is withing 90 degrees");}

答案 1 :(得分:1)

有几种方法可以实现这一点,但我建议使用Raycast。 我认为太阳不仅仅是一个点,它有一些区域可供玩家看到,所以即使他没有看到太阳的中心点,他仍然可以看到它的一部分区域。如果是这样,我建议为sun对象添加一个新脚本,以便以编程方式识别它。然后确保它的碰撞器组件的尺寸大约等于太阳。 然后在您想要检测玩家太阳能见度的脚本中,您可以执行以下操作:

var ray = Camera.main.ScreenPointToRay(pos);    
RaycastHit hit;

        if (!Physics.Raycast(ray, out hit, 100))
            return false; //sun or any other collider wasnt hit

        var objHit = hit.collider.gameObject.GetComponent<Sun>();

所以objHit!= null意味着玩家可以看到太阳所在区域的任何部分。