Unity MRTK:地形交互

Unity MRTK: Terrain Interaction

我正在寻找可能有幸与 Unity Terrain 和 MRTK 交互的任何人的一些指导。

我正在使用在线地图,我正在尝试将一个应用程序移植到 Hololens 2 中。一切就绪,除了我似乎无法触发对地形的点击——这是我需要做什么。

基本上我渲染了一个设定地理位置的地形,无论用户点击地形,我都会存储这些坐标,并会在该位置生成一个 3d 模型供其他用户查看。

在Play的编辑器中,如果我用鼠标点击地形一切正常。但是,如果我尝试使用凝视圈,我可以看到凝视与地形很好地碰撞,并且我可以看到在鼠标单击期间圆圈缩小,但点击事件不会触发(实际鼠标不在此时的地形——这就是为什么什么都没有发生的原因)。使用 space 栏和手部替身,投射光线根本不会击中地形——这正是我在构建和部署到头显时所看到的,地形本身就好像没有碰撞器,几乎被所有交互忽略。

我已经尝试了所有可能的可交互状态组合,但我只能生成一个非常基本的地形被点击状态,它忽略了地形被点击的“位置”,这是我需要的关键实现。

本质上,我需要弄清楚如何通过耳机中的光线投射线或实际触摸地形来复制鼠标点击。

旁注,我注意到当我按住 space 条并在编辑器中使用 3d 手时,我也无法与我的按钮进行交互。这些是 MRTK 示例中使用的相同按钮预制件,如果我使用凝视圈,它们可以在编辑器中进行交互。我不知道,也许如果我能弄清楚如何让它与按钮交互,它可能会让我朝着正确的方向开始,让它与地形交互。

经过大量挖掘,这是我想出的解决方案。

首先是附加到空游戏对象的组件代码:

using Microsoft.MixedReality.Toolkit;
using Microsoft.MixedReality.Toolkit.Utilities;
using UnityEngine;

public class GetCoordHandler : MonoBehaviour
{
    private Vector3 gazePoint, gazeNormal;

    private void Update()
    {
        // key z in editor, A button on xbox controller
        if (Input.GetKeyDown(KeyCode.Z) || Input.GetKeyDown(KeyCode.Joystick1Button0))
        {
            // make sure we have hit something
            if (CoreServices.InputSystem.GazeProvider.GazeTarget)
            {
                // grab where the gaze pointer is
                gazePoint = CoreServices.InputSystem.GazeProvider.HitInfo.point;
                // convert this position to screen coords and fire the method
                AddMarker(CameraCache.Main.WorldToScreenPoint(gazePoint));
        }
    }
}

private void AddMarker(Vector3 point)
{
    // Get the coordinates under the cursor.
    double lng, lat;
    // custom method that returns the coordinates
    OnlineMapsControlBase.instance.GetCoords_MRTK(point, out lng, out lat);

    Debug.Log("Lat: " + lat + "  Lng: " + lng);
    // Create a label for the marker.
    string label = "Marker: " + (OnlineMapsMarkerManager.CountItems + 1);
    // Create a new marker.
    OnlineMapsMarkerManager.CreateItem(lng, lat, label);
 }
}

最后是一个简单的 OnlineMaps 自定义方法,它使用从 Gaze 传入的 Vector3 而不是使用鼠标位置。

 public bool GetCoords_MRTK(Vector2 gazePosition, out double lng, out double lat)
 {
    return GetCoords(gazePosition, out lng, out lat);
 }