我想探测到球体上有个水龙头。我在google上搜索过,并发现了许多方法,如on ()和使用光线投射等。
但是,我想要得到的一些价值,也是用户接触球的地方。
就像球体的中心是x=0,y=0。当用户触摸球的右上角时,我应该得到正x和y。
没有必要精确地得到这个值,值可以是任何东西,但是通过这些值,我应该能够知道用户已经点击了这8个部分中的一个。
发布于 2015-11-03 12:55:45
您可以使用您找到的方法,通过光线投射,您将得到准确的位置的龙头。然后,您必须将球体的中心点和点击位置转换为屏幕空间坐标。然后,你可以得到这些向量之间的差值,得到距离中心的方向和距离。
PS:圆圈有角吗?
您需要一个带有对撞机的GameObject,对撞机设置为“是触发器”。以及包含以下代码的脚本。
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");
}
}到中心的距离变得越来越复杂。我们必须得到一个垂直于摄像机中心的矢量,并将其缩放到螺旋桨大小。如果我们把这个加到中心,并把它转换成屏幕空间,我们就会得到球体表面上的最大震级。
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:请向考斯威斯询问你想要达到的最终目标,而不仅仅是你认为完成工作所需要的一步。
发布于 2015-11-03 15:41:23
你不需要使用射线管,你可以使用"OnMouseDown"。
这里的文档:http://docs.unity3d.com/ScriptReference/MonoBehaviour.OnMouseDown.html注释:您的对象需要一个对撞机才能工作。
https://stackoverflow.com/questions/33491315
复制相似问题