首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >检测球体上的水龙头。

检测球体上的水龙头。
EN

Stack Overflow用户
提问于 2015-11-03 04:18:07
回答 2查看 841关注 0票数 1

我想探测到球体上有个水龙头。我在google上搜索过,并发现了许多方法,如on ()和使用光线投射等。

但是,我想要得到的一些价值,也是用户接触球的地方。

就像球体的中心是x=0,y=0。当用户触摸球的右上角时,我应该得到正x和y。

没有必要精确地得到这个值,值可以是任何东西,但是通过这些值,我应该能够知道用户已经点击了这8个部分中的一个。

  1. 右上圆中心附近
  2. 右下角圆中心附近
  3. 左上角圆中心附近
  4. 左下角近圆心
  5. 圆右上角
  6. 圆右下角
  7. 圆左上角
  8. 圆左下角
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-03 12:55:45

您可以使用您找到的方法,通过光线投射,您将得到准确的位置的龙头。然后,您必须将球体的中心点和点击位置转换为屏幕空间坐标。然后,你可以得到这些向量之间的差值,得到距离中心的方向和距离。

PS:圆圈有角吗?

您需要一个带有对撞机的GameObject,对撞机设置为“是触发器”。以及包含以下代码的脚本。

代码语言:javascript
运行
复制
void OnMouseDown()
{
    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    RaycastHit hit;
    //hits for sure, because we are in the click event
    Physics.Raycast(ray, out hit);

    Vector3 hitOnScreen = Camera.main.WorldToScreenPoint(hit.point);
    Vector3 centerOnScreen = Camera.main.WorldToScreenPoint(transform.position);

    Vector3 offset = hitOnScreen - centerOnScreen;

    if(offset.x > 0 && offset.y > 0)
    {
        Debug.Log("upper right");
    }else if(offset.x < 0 && offset.y > 0)
    {
        Debug.Log("upper left");
    }else if(offset.x > 0 && offset.y < 0)
    {
        Debug.Log("lower right");
    } else //if(offset.x < 0 && offset.y < 0)
    {
        Debug.Log("lower left");
    }
}

到中心的距离变得越来越复杂。我们必须得到一个垂直于摄像机中心的矢量,并将其缩放到螺旋桨大小。如果我们把这个加到中心,并把它转换成屏幕空间,我们就会得到球体表面上的最大震级。

代码语言:javascript
运行
复制
    Vector3 perpendicular = Vector3.Cross(transform.position - Camera.main.transform.position, Vector3.one);
    Vector3 maxDistToCenter = transform.position + (perpendicular.normalized * (transform.lossyScale.x * 0.5f));

    Vector3 maxDistToCenterOnScreen = Camera.main.WorldToScreenPoint(maxDistToCenter);

    float maxDist = (maxDistToCenterOnScreen - centerOnScreen).magnitude;
    float dist = offset.magnitude;

    if (dist < maxDist * 0.5f) // 50% of the way not the area
    {
        Debug.Log("inner 50%");
    }
    else
    {
        Debug.Log("outer 50%");
    }

两者的结合使你有能力用角度和距离来评估球体上的任意一点,与最大距离相比。

如果你只想对点击的点施加力量,你只需要一个脊体和光线投射。这个官方统一教程将导出它。

也许你必须把这两种答案结合起来,但我认为团结教程已经足够满足你的需求了。

PS:请向考斯威斯询问你想要达到的最终目标,而不仅仅是你认为完成工作所需要的一步。

票数 1
EN

Stack Overflow用户

发布于 2015-11-03 15:41:23

你不需要使用射线管,你可以使用"OnMouseDown"

这里的文档:http://docs.unity3d.com/ScriptReference/MonoBehaviour.OnMouseDown.html注释:您的对象需要一个对撞机才能工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33491315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档