其他分享
首页 > 其他分享> > android – 当用户触摸GameObject时,如何阻止ARCore模型放置?

android – 当用户触摸GameObject时,如何阻止ARCore模型放置?

作者:互联网

免责声明:我对Unity3D和ARCore都很陌生,所以请耐心等待.

我在Unity3D中使用ARCore来创建一个场景,用户可以在屏幕上的ScrollView中选择模型,并使用Google的ARCore框架放置它们.

到目前为止,我有它的工作;用户触摸ScrollView中的模型(在Panel中作为当前选定的模型显示在屏幕上,因为我的计划是让ScrollView切换可见性以获得更多的屏幕视图空间).

问题在于,当用户选择模型时,ARCore会将模型放置在ScrollView和所选模型Panel对象后面的检测到的平面上(即使您第一次触摸开始滚动ScrollView).请参阅下文以帮助可视化.

enter image description here

如何让ARCore不将对象置于ScrollView和Panel后面?我尝试过的是添加到我的控制器(实际上只是Google HelloARController)的一组对象,我想阻止它们的ARCore的Raycast并用foreach迭代它们以查看Raycast是否击中了集合中的GameObjects

Touch touch;
if (Input.touchCount < 1 || (touch = Input.GetTouch(0)).phase != TouchPhase.Began)
{
    return;
}

//my code; above is Google's
foreach (var item in BlockingObjects) { //BlockingObjects is a List<GameObject>
    if (IsTouchInObject(FirstPersonCamera.ScreenPointToRay(touch.position), item)) {
        return;
    }
}
//end of my code; below is Google's

TrackableHit hit;
TrackableHitFlag raycastFilter = TrackableHitFlag.PlaneWithinBounds | TrackableHitFlag.PlaneWithinPolygon;

使用如下定义的IsTouchInObject函数:

private bool IsTouchInObject(Ray ray, GameObject obj) {
    RaycastHit rch;
    Physics.Raycast (ray, out rch);
    return (rch.collider != null);
}

失败的是rch.collider总是为null(我知道我根本没有测试对象,我会担心一旦我能让Raycast实际上与GameObject碰撞).我已经尝试将Physics / Physics2D与RaycastHit / RacastHit2D一起使用,并将BoxCollider / BoxCollider2D组件附加到我想要检测到的对象,但我没有做任何工作.

(这个解决方案取自Unity3D论坛上的某些东西,其中有人有类似的问题,但没有AR,他们自己的3D世界有2D覆盖.我找不到该论坛帖子提供参考,对不起).

任何帮助将不胜感激.

编辑/注意:我现在已经注意到Canvas上有一个Graphic Raycaster组件,它包含我的ScrollView和Panel.我已经尝试将阻挡对象设置为两个D(同时将一个Box Collider 2D添加到ScrollView和Panel)和阻止掩码以忽略Raycast(以及其他一些东西)无济于事.这些属性的值是否可以组合使用?

本着今天的精神:

帮助我,StackOverflow ……呃…… Kenobi ……你是我唯一的希望.

解决方法:

你有没有试过用以下方法包装Raycast:

 if (!EventSystem.current.IsPointerOverGameObject(touch.fingerId)) {...}

https://answers.unity.com/questions/1406243/ui-in-arcore-helloar-example.html

标签:android,arcore,raycasting
来源: https://codeday.me/bug/20190727/1550633.html