Ejemplo n.º 1
0
    /// <summary>
    ///
    /// </summary>
    public void InstantiateObjectOnPlaceable()
    {
        const int QueryResultMaxCount = 512;

        SpatialUnderstandingDllShapes.ShapeResult[] resultsShape = new SpatialUnderstandingDllShapes.ShapeResult[QueryResultMaxCount];

        // Pin managed object memory going to native code
        IntPtr resultsShapePtr = SpatialUnderstanding.Instance.UnderstandingDLL.PinObject(resultsShape);

        // Find the half dimensions of "Sittable" objects via the DLL
        int shapeCount = SpatialUnderstandingDllShapes.QueryShape_FindShapeHalfDims("Placeable", resultsShape.Length, resultsShapePtr);

        for (int i = 0; i < shapeCount; i++)
        {
            Instantiate(PlaceablePrefab, resultsShape[i].position, Quaternion.identity);
        }
    }
Ejemplo n.º 2
0
    private void InstantiateObjectOnTable()
    {
        const int MaxResultCount = 512;
        var       shapeResults   = new SpatialUnderstandingDllShapes.ShapeResult[MaxResultCount];

        var resultsShapePtr = SpatialUnderstanding.Instance.UnderstandingDLL.PinObject(shapeResults);
        var locationCount   = SpatialUnderstandingDllShapes.QueryShape_FindPositionsOnShape("ElectricBox", 0.1f, shapeResults.Length, resultsShapePtr);

        if (locationCount > 0)
        {
            Instantiate(_object,
                        shapeResults[0].position,
                        Quaternion.LookRotation(shapeResults[0].position.normalized, Vector3.up));
            // For some reason the halfDims of the shape result are always 0,0,0 so we can't scale
            // to the size of the surface. This may be a bug in the HoloToolkit?

            SpatialText.text = "Placed Hologram";
        }
        else
        {
            SpatialText.text = "Hologram not placed";
        }
    }
Ejemplo n.º 3
0
    //if any problems arises (i.e. fps spikes when placing), this function will need to be split in multiple stages.
    //Then, rest must be given to Unity between the stages. I.e. call the stages one at a time in the Update() part. Don't call multiple stages in the same Update() call.
    //placePlat handles the placement for the Platform type of placement.
    //it relies on the SpatialUnderstandingDllShapes API. To add other Shape Definitions, see the ShapeDefinition script from HoloToolkit-Example/SpatialUnderstanding scripts
    private void placePlat()
    {
        List <Vector3>[] lPositions = new List <Vector3> [mPlatformLeftToPlace.Count];
        SpatialUnderstandingDllShapes.ShapeResult[] lPlatPos = new SpatialUnderstandingDllShapes.ShapeResult[mMaxPlatLoc];
        System.IntPtr lPlatPtr = SpatialUnderstanding.Instance.UnderstandingDLL.PinObject(lPlatPos);

        for (int i = 0; i < mPlatformLeftToPlace.Count; i++) //prepare to find all positions for each clue
        {
            lPositions[i] = new List <Vector3>();
        }

        for (int lIt = 0; lIt < mPlatformLeftToPlace.Count; lIt++) //here we find all Platform positions for each clue
        {
            int      i          = mPlatformLeftToPlace[lIt];
            Collider lColl      = mToPlace[i].GetComponent <Collider>();
            float    lMax       = Mathf.Max(lColl.bounds.extents.x, Mathf.Max(lColl.bounds.extents.y, lColl.bounds.extents.z));
            int      lPlatCount = SpatialUnderstandingDllShapes.QueryShape_FindPositionsOnShape(
                "Platform", 1.1f * lMax,
                lPlatPos.Length, lPlatPtr);

            for (int lPlatIt = 0; lPlatIt < lPlatCount; lPlatIt++)
            {
                lPositions[lIt].Add(lPlatPos[lPlatIt].position);
            }

            if (lPositions[lIt].Count == 0) //if there is no position for an object, just exit. The placement failed.
            {
                lIt = mPlatformLeftToPlace.Count + 2;
            }
        }

        int lItObj;

        //here we choose a random position from all our positions for each clue.
        //since there might be multiple clues of the same size on platforms, those will have exactly the same positions.
        //So it would be faster to try to select a position at random than collide for a while on the first positions
        for (lItObj = 0; lItObj < mPlatformLeftToPlace.Count; lItObj++)
        {
            int  iObj    = mPlatformLeftToPlace[lItObj];
            int  lItPos  = 2;
            bool lPlaced = false;
            while ((lPositions[lItObj].Count != 0) && (!lPlaced)) //choose positions at random until we run out of positions
            {
                lItPos = Random.Range(0, lPositions[lItObj].Count - 1);

                //put object correctly on position. Without placing it upper than the position returned, we would have the center of the object at the position on the Platform
                //which essentially means the lower half will go through the Platform
                mToPlace[iObj].transform.localPosition = lPositions[lItObj][lItPos] + mToPlace[iObj].GetComponent <Collider>().bounds.extents.y *Vector3.up;

                if (canPlace(iObj)) //can place the object at this position
                {
                    mPlaced.Add(iObj);
                    lPlaced = true;
                }
                else
                {
                    lPositions[lItObj].RemoveAt(lItPos); //position unusable
                }
            }
            if (!lPlaced) //couldn't place the object, so just exit this for loop. The placement failed.
            {
                lItObj = mPlatformLeftToPlace.Count + 2;
                mToPlace[iObj].transform.localPosition = new Vector3(0, -1000, 0);
            }
        }

        if (lItObj == mPlatformLeftToPlace.Count) //successfully placed all the objects
        {
            mPlacePComplete = true;
        }
        else //could not place the objects
        {
            mPlacePComplete = false;
            mSuccessful     = false;
            mComplete       = true;
        }
    }