Как добавить несколько моделей в сцену, а затем извлечь ее, используя распознавание сцены в единстве? - PullRequest
0 голосов
/ 21 сентября 2018

Каждый раз, когда я касаюсь экрана, на экране появляется одна и та же модель. Если я касаюсь экрана в пяти различных позициях, модели создаются в 5 точках касания на экране. Позднее они сохраняются в облаке. Когда я загружаю сохраненныенаносит на карту и сканирует то же место, где он распознает сцену, но на экране отображается только одна модель. Я добавляю «стрелку» в качестве модели. Я предоставлю код ниже.

Так как же позиция сохраняется?здесь?. Сохраняется только одна позиция модели? Почему другие модели позиций не отображаются? Это потому, что я использую ту же модель? Как сохранить положение других моделей?

Если я добавлю код под строками(// если строка ниже добавлена) реализация работает. Многие фигуры будут созданы при прикосновении и позже могут быть загружены даже после закрытия приложения.

bool HitTestWithResultType(ARPoint point, ARHitTestResultType resultTypes)
{
    List<ARHitTestResult> hitResults = UnityARSessionNativeInterface.GetARSessionNativeInterface().HitTest(point, resultTypes);

    if (hitResults.Count > 0)
    {
        foreach (var hitResult in hitResults)
        {

            Debug.Log("Got hit!");

            Vector3 position = UnityARMatrixOps.GetPosition(hitResult.worldTransform);
            Quaternion rotation = UnityARMatrixOps.GetRotation(hitResult.worldTransform);

            //Transform to placenote frame of reference (planes are detected in ARKit frame of reference)
            Matrix4x4 worldTransform = Matrix4x4.TRS(position, rotation, Vector3.one);
            Matrix4x4? placenoteTransform = LibPlacenote.Instance.ProcessPose(worldTransform);

            Vector3 hitPosition = PNUtility.MatrixOps.GetPosition(placenoteTransform.Value);
            Quaternion hitRotation = PNUtility.MatrixOps.GetRotation(placenoteTransform.Value);

            // add shape
            AddShape(hitPosition, hitRotation);


            return true;
        }
    }
    return false;
}


//-----------------------------------
// Update function checks for hittest
//-----------------------------------

void Update()
{

    // Check if the screen is touched
    //-----------------------------------

    if (Input.touchCount > 0)
    {
        var touch = Input.GetTouch(0);
        if (touch.phase == TouchPhase.Began  )
        {
            if (EventSystem.current.currentSelectedGameObject == null)
            {

                Debug.Log("Not touching a UI button. Moving on.");

                // add new shape
                var screenPosition = Camera.main.ScreenToViewportPoint(touch.position);
                ARPoint point = new ARPoint
                {
                    x = screenPosition.x,
                    y = screenPosition.y
                };

                // prioritize reults types
                ARHitTestResultType[] resultTypes = {
                    //ARHitTestResultType.ARHitTestResultTypeExistingPlaneUsingExtent,
                    //ARHitTestResultType.ARHitTestResultTypeExistingPlane,
                    //ARHitTestResultType.ARHitTestResultTypeEstimatedHorizontalPlane,
                    //ARHitTestResultType.ARHitTestResultTypeEstimatedVerticalPlane,
                    ARHitTestResultType.ARHitTestResultTypeFeaturePoint
                };

                foreach (ARHitTestResultType resultType in resultTypes)
                {
                    if (HitTestWithResultType(point, resultType))
                    {
                        Debug.Log("Found a hit test result");
                        return;
                    }
                }
            }
        }
    }
}

public void OnSimulatorDropShape()
{
    Vector3 dropPosition = Camera.main.transform.position + Camera.main.transform.forward * 0.3f;
    Quaternion dropRotation = Camera.main.transform.rotation;

    AddShape(dropPosition, dropRotation);

}

//-------------------------------------------------
// All shape management functions (add shapes, save shapes to metadata etc.
//-------------------------------------------------

public void AddShape(Vector3 shapePosition, Quaternion shapeRotation)
{
//if line below added
   // System.Random rnd = new System.Random(); 
//if line below added
    //PrimitiveType type = (PrimitiveType)rnd.Next(0, 3);

    ShapeInfo shapeInfo = new ShapeInfo();
    shapeInfo.px = shapePosition.x;
    shapeInfo.py = shapePosition.y;
    shapeInfo.pz = shapePosition.z;
    shapeInfo.qx = shapeRotation.x;
    shapeInfo.qy = shapeRotation.y;
    shapeInfo.qz = shapeRotation.z;
    shapeInfo.qw = shapeRotation.w;
//if line below added
   // shapeInfo.shapeType = type.GetHashCode();
    shapeInfoList.Add(shapeInfo);

    GameObject shape = ShapeFromInfo(shapeInfo);
    shapeObjList.Add(shape);
}


public GameObject ShapeFromInfo(ShapeInfo info)
{
    //if line below added
//GameObject shape = GameObject.CreatePrimitive((PrimitiveType)info.shapeType);

//Instead of
    GameObject shape =Instantiate(arrow);   

    shape.transform.position = new Vector3(info.px, info.py, info.pz);
    shape.transform.rotation = new Quaternion(info.qx, info.qy, info.qz, info.qw);
    shape.transform.localScale = new Vector3(0.05f, 0.05f, 0.05f);
    shape.GetComponent<MeshRenderer>().material = mShapeMaterial;
    shape.GetComponent<MeshRenderer> ().material.color = Color.yellow;
    return shape;
}

1 Ответ

0 голосов
/ 21 сентября 2018

В HitTestWithResultType () вы получаете возврат в foreach, поэтому, когда одна итерация выполнена, код выходит из метода.По сути, вы делаете только одну итерацию в foreach каждый раз, когда вызываете метод.переместите возврат на 2 строки ниже после закрывающей скобки.

Думаю, всем нужна другая пара глаз:)

...