android – 当用户触摸GameObject时,如何阻止ARCore模型放置?
作者:互联网
免责声明:我对Unity3D和ARCore都很陌生,所以请耐心等待.
我在Unity3D中使用ARCore来创建一个场景,用户可以在屏幕上的ScrollView中选择模型,并使用Google的ARCore框架放置它们.
到目前为止,我有它的工作;用户触摸ScrollView中的模型(在Panel中作为当前选定的模型显示在屏幕上,因为我的计划是让ScrollView切换可见性以获得更多的屏幕视图空间).
问题在于,当用户选择模型时,ARCore会将模型放置在ScrollView和所选模型Panel对象后面的检测到的平面上(即使您第一次触摸开始滚动ScrollView).请参阅下文以帮助可视化.
如何让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