【问题标题】:Unity3d with vuforia showing 2d image when targed is detected带有 vuforia 的 Unity3d 在检测到目标时显示 2d 图像
【发布时间】:2015-01-14 22:10:13
【问题描述】:

我有一个关于如何在检测到的标记上显示简单 2d 图像的问题。我已经按照一些教程来展示 3d 模型,它工作正常。 3d没有问题。 当我想添加普通的 2d object->sprite 时,问题就开始了。当我添加简单精灵时,我无法添加纹理,当我插入 UI 图像时,它与画布一起添加,当目标为 检测到。编辑器上的原始图像放置得如此之远以至于很难找到它。 如果有人能指出我正确的方向,我将不胜感激。

我需要让这张图片像按钮一样具有触感。单击它必须显示新场景(我有它但在 GUI.Button 下)。最好的方法是替换原来的标记,但我也可以让新的精灵变大以隐藏它下面的标记。

【问题讨论】:

    标签: unity3d augmented-reality vuforia unity3d-gui


    【解决方案1】:

    为了帮助理解答案,这里简要介绍了 Vuforia 如何处理标记检测。如果您查看附加到 ImageTarget 预制件DefaultTrackableEventHandler 脚本,您会发现当跟踪系统发现或丢失一个图片。

    这些是 DefaultTrackableEventHandler.cs 中的 OnTrackingFound(第 67 行)和 OnTrackingLost(第 88 行)

    如果您想在跟踪时显示 Sprite,您需要做的就是放置 Image Target 预制件(或任何其他)并使 Sprite 成为预制件的子代。启用和禁用应该自动发生。

    但是,如果您想做更多事情,这里有一些经过编辑的代码。

    DefaultTrackableEventHandler.cs

    //Assign this in the inspector. This is the GameObject that 
    //has a SpriteRenderer and Collider2D component attached to it
    public GameObject spriteGameObject ;
    

    将以下行添加到 OnTrackingFound

        //Enable both the Sprite Renderer, and the Collider for the sprite
        //upon Tracking Found. Note that you can change the type of 
        //collider to be more specific (such as BoxCollider2D)
        spriteGameObject.GetComponent<SpriteRenderer>().enabled = true;
        spriteGameObject.GetComponent<Collider2D>().enabled = true;
    
        //EDIT 1
        //Have the sprite inherit the position and rotation of the Image
        spriteGameObject.transform.position = transform.position;
        spriteGameObject.transform.rotation = transform.rotation;
    

    以下是OnTrackingLost

        //Disable both the Sprite Renderer, and the Collider for the sprite
        //upon Tracking Lost. 
        spriteGameObject.GetComponent<SpriteRenderer>().enabled = false;
        spriteGameObject.GetComponent<Collider2D>().enabled = false;
    



    接下来,您关于检测此 Sprite 的点击的问题。 Unity 的 Monobehaviour 会为很多鼠标事件触发事件,例如 OnMouseUpOnMouseDown 等。

    Link to Monobehaviour on Unity's API docs
    您需要的是一个名为 OnMouseUpAsButton

    的事件

    创建一个名为 HandleClicks.cs 的新脚本并将以下代码添加到其中。将此脚本作为组件附加到您为上述分配的 spriteGameObject

    public class HandleClicks : MonoBehaviour {
    
        //Event fired when a collider receives a mouse down
        //and mouse up event, like the interaction with a button
        void OnMouseUpAsButton () {
            //Do whatever you want to
            Application.LoadLevel("myOtherLevel");
        }
    
    }
    

    【讨论】:

    • 哇,谢谢你的精彩回答,我今天就试试 :)。如果你不介意,我还有一个问题。假设我根据您的示例显示我的图像 - 当我改变手机和标记之间的角度时,我是否必须移动/旋转它 - 我不想实现的是始终打印我的图像在目标下方且位置相同。
    • 我不完全确定我是否理解了这个问题。你是说你想让 Sprite 看起来完全一样,而不管相机角度和图像目标旋转如何?还是说 Sprite 应该具有 Image Target 的方向?
    • 精灵应该有图像目标的位置和方向。另外,请让我知道您所说的“您需要做的就是放置图像目标”是什么意思-您的意思是我应该在对象树中的图像目标下的图形编辑器中添加精灵吗?
    • 编辑代码以执行您的要求。在上面的响应中查找“EDIT 1”。是的,Sprite GameObject 应该在层次结构中的图像目标“下方”。基本上,Image Target GameObject 左边应该有一个小三角形,如果你点击它,你应该可以看到 Sprite。
    • Axiom Studios 的 Venkat,再次感谢您的帮助。我不得不说你给我指明了正确的方向。我要做的就是将我的 .png 文件的纹理类型设置为“Sprite(2d 和 UI)”。之后,我可以将其设置为我新添加的精灵的纹理。将其连接到 Image 目标时,只要检测到标记,它就会开始工作。第二种情况是让它触摸敏感 - 你描述的方法对我有很大帮助,我唯一需要添加的是精灵上的 Box Collider。没有那个精灵是不负责任的。问候扬
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-03
    • 1970-01-01
    • 1970-01-01
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多