示例#1
0
    void Update()
    {
        if (!initDone)
        {
            return;
        }

        // Show tracking result
        if (0 < Plugins.ULS_UnityGetPoints(_trackPoints))
        {
#if DRAW_MARKERS
            for (int j = 0; j < Plugins.MAX_TRACKER_POINTS; ++j)
            {
                _marker2d[j].transform.localPosition = new Vector3(_trackPoints [j * 2], _trackPoints [j * 2 + 1], 0);
                _marker2d[j].SetActive(drawMarkers);
            }
#endif
            // get transform matrix for alignment 3d objects
            Plugins.ULS_UnityGetTransform(_mtx, intrinsic_camera_matrix, null);
            for (int i = 0; i < 16; ++i)
            {
                transformationM[i] = _mtx[i];
            }
            ARM = adjustMatrix * transformationM;

            // apply alignment matrix to object's transform
            ARUtils.SetTransformFromMatrix(_anchor3d.transform, ref ARM);

            // apply local scale to fit user's face
            Plugins.ULS_UnityGetScale3D(_scaleX, _scaleY, _scaleZ);
            Vector3 s = new Vector3(_scaleX [0], _scaleY [0], _scaleZ [0]);
            s.Scale(_original_scale);
            _helmet.transform.localScale = s;
        }
    }
        public void FindARMarker(Mat imgMat)
        {
            PatternTrackingInfo patternTrackingInfo = new PatternTrackingInfo();

            foreach (string patternName in _Patterns.Keys)
            {
                bool patternFound = _PatternDetectors[patternName].findPattern(imgMat, patternTrackingInfo);
                // Debug.Log ("PatternFound " + patternFound);

                if (patternFound)
                {
                    patternTrackingInfo.computePose(_Patterns[patternName], _CamMatrix, _DistCoeffs);

                    Matrix4x4 transformationM = patternTrackingInfo.pose3d; // Marker to Camera Coordinate System Convert Matrix

                    Matrix4x4 scaleMat = _ARObjectScaleMatrix[patternName];
                    Matrix4x4 ARM      = ARCamera.transform.localToWorldMatrix * scaleMat * _InvertYMat * transformationM * _InvertZMat;

                    GameObject ARGameObject;
                    if (!_ARObjects.TryGetValue(patternName, out ARGameObject))
                    {
                        ARGameObject            = GameObject.Instantiate(ARObjectPrefab, Vector3.zero, Quaternion.identity);
                        ARGameObject.name       = ARObjectPrefab.name + "_" + patternName;
                        _ARObjects[patternName] = ARGameObject;

                        Material material = ARGameObject.GetComponentInChildren <MeshRenderer>().material;
                        material.mainTexture = _TextureImages[patternName];
                    }

                    ARUtils.SetTransformFromMatrix(ARGameObject.transform, ref ARM);
                    ARGameObject.transform.Rotate(ARObjLocalRotEuler);
                }
            }
        }
示例#3
0
    private void UpdateARObjectTransform_2(Mat rvec, Mat tvec)
    {
        // Convert to unity pose data.
        double[] rvecArr = new double[3];
        rvec.get(0, 0, rvecArr);
        double[] tvecArr = new double[3];
        tvec.get(0, 0, tvecArr);
        PoseData poseData = ARUtils.ConvertRvecTvecToPoseData(rvecArr, tvecArr);

        // Changes in pos/rot below these thresholds are ignored.
        if (enableLowPassFilter)
        {
            ARUtils.LowpassPoseData(ref oldPoseData, ref poseData, positionLowPass, rotationLowPass);
        }
        oldPoseData = poseData;

        // Convert to transform matrix.
        ARM = ARUtils.ConvertPoseDataToMatrix(ref poseData, true, true);

        //if (shouldMoveARCamera) {

        //  ARM = arGameObject.transform.localToWorldMatrix * ARM.inverse;

        //  ARUtils.SetTransformFromMatrix(arCamera.transform, ref ARM);

        //} else {

        ARM = arCamera.transform.localToWorldMatrix * ARM;

        ARUtils.SetTransformFromMatrix(arGameObject.transform, ref ARM);
        //}
    }
示例#4
0
    private void UpdateARObjectTransform(Mat rvec, Mat tvec, int id)
    {
        // Find the object of this id
        if (idDict.ContainsKey(id))
        {
            arGameObject = GameObject.Find(idDict[id]);
        }
        // Convert to unity pose data.
        double[] rvecArr = new double[3];
        rvec.get(0, 0, rvecArr);
        double[] tvecArr = new double[3];
        tvec.get(0, 0, tvecArr);
        PoseData poseData = ARUtils.ConvertRvecTvecToPoseData(rvecArr, tvecArr);


        // Changes in pos/rot below these thresholds are ignored.
        if (enableLowPassFilter)
        {
            ARUtils.LowpassPoseData(ref oldPoseData, ref poseData, positionLowPass, rotationLowPass);
        }
        oldPoseData = poseData;

        // Convert to transform matrix.
        ARM = ARUtils.ConvertPoseDataToMatrix(ref poseData, true, true);


        ARM = arCamera.transform.localToWorldMatrix * ARM;
        ARUtils.SetTransformFromMatrix(arGameObject.transform, ref ARM);


        //Only move and do not rotate
        Vector3 rawRotation = arGameObject.transform.rotation.eulerAngles;

        arGameObject.transform.rotation = Quaternion.Euler(new Vector3(0, adjustRotation(rawRotation[1]), 0));
    }
示例#5
0
        void LateUpdate()
        {
            if (webCamTextureToMatHelper.isPlaying() && webCamTextureToMatHelper.didUpdateThisFrame())
            {
                Mat rgbaMat = webCamTextureToMatHelper.GetMat();

                //for frontFaceingCamera
                //Core.flip (rgbaMat, rgbaMat, 1);

                markerDetector.processFrame(rgbaMat, 1);


                foreach (MarkerSettings settings in markerSettings)
                {
                    settings.setAllARGameObjectsDisable();
                }

                List <Marker> findMarkers = markerDetector.getFindMarkers();
                for (int i = 0; i < findMarkers.Count; i++)
                {
                    Marker marker = findMarkers[i];

                    foreach (MarkerSettings settings in markerSettings)
                    {
                        if (marker.id == settings.getMarkerId())
                        {
                            transformationM = marker.transformation;
                            //Debug.Log ("transformationM " + transformationM.ToString ());

                            ARM = ARCamera.transform.localToWorldMatrix * invertYM * transformationM * invertZM;
                            //Debug.Log ("arM " + arM.ToString ());


                            GameObject ARGameObject = settings.getARGameObject();
                            if (ARGameObject != null)
                            {
                                ARUtils.SetTransformFromMatrix(ARGameObject.transform, ref ARM);
                                ARGameObject.SetActive(true);
                            }
                        }
                    }
                }

                Utils.matToTexture2D(rgbaMat, texture, colors);


                currentARCameraLocalRotation = ARCamera.transform.localRotation;
            }
            ARCamera.transform.localRotation = currentARCameraLocalRotation;
        }
示例#6
0
        void UpdateARObjectTransform()
        {
            foreach (string patternName in _Patterns.Keys)
            {
                if (_ARObjectHasUpdate[patternName])
                {
                    _ARObjectHasUpdate[patternName] = false;

                    Matrix4x4 ARM = _ARObjectTransformMatrix[patternName];

                    GameObject ARGameObject;
                    if (!_ARObjects.TryGetValue(patternName, out ARGameObject))
                    {
                        ARGameObject            = GameObject.Instantiate(ARObjectPrefab, Vector3.zero, Quaternion.identity);
                        ARGameObject.name       = ARObjectPrefab.name + "_" + patternName;
                        _ARObjects[patternName] = ARGameObject;
                    }

                    ARUtils.SetTransformFromMatrix(ARGameObject.transform, ref ARM);
                }
            }
        }
示例#7
0
        void Update()
        {
            if (Input.GetKeyDown(KeyCode.Escape))
            {
                OnBackButton();
            }

            if (webCamTextureToMatHelper.IsPlaying() && webCamTextureToMatHelper.DidUpdateThisFrame())
            {
                Mat rgbaMat = webCamTextureToMatHelper.GetMat();

                markerDetector.processFrame(rgbaMat, 1);

                foreach (MarkerSettings settings in markerSettings)
                {
                    if (!settings.shouldNotSetToInactivePerFrame)
                    {
                        settings.setAllARGameObjectsDisable();
                    }
                    else
                    {
                        GameObject ARGameObject = settings.getARGameObject();
                        if (ARGameObject != null)
                        {
                            DelayableSetActive obj = ARGameObject.GetComponent <DelayableSetActive> ();
                            if (obj != null)
                            {
                                obj.SetActive(false, 0.5f);
                            }
                        }
                    }
                }

                List <Marker> findMarkers = markerDetector.getFindMarkers();
                for (int i = 0; i < findMarkers.Count; i++)
                {
                    Marker marker = findMarkers [i];

                    foreach (MarkerSettings settings in markerSettings)
                    {
                        if (marker.id == settings.getMarkerId())
                        {
                            transformationM = marker.transformation;
                            //Debug.Log ("transformationM " + transformationM.ToString ());

                            ARM = ARCamera.transform.localToWorldMatrix * invertYM * transformationM * invertZM;
                            //Debug.Log ("arM " + arM.ToString ());

                            GameObject ARGameObject = settings.getARGameObject();
                            if (ARGameObject != null)
                            {
                                ARUtils.SetTransformFromMatrix(ARGameObject.transform, ref ARM);

                                DelayableSetActive obj = ARGameObject.GetComponent <DelayableSetActive> ();
                                if (obj != null)
                                {
                                    obj.SetActive(true);
                                }
                                else
                                {
                                    ARGameObject.SetActive(true);
                                }
                            }
                        }
                    }
                }
                Utils.fastMatToTexture2D(rgbaMat, texture);
            }
        }
示例#8
0
    void Update()
    {
        if (!initDone)
        {
            return;
        }

        bool isOnTracking = false;

        // Show tracking result
        if (0 < Plugins.ULS_UnityGetPoints(_trackPoints))
        {
#if DRAW_MARKERS
            //似乎是用来生成人脸特征点数量的
            for (int j = 0; j < Plugins.MAX_TRACKER_POINTS; ++j)
            {
                _marker2d[j].transform.localPosition = new Vector3(_trackPoints [j * 2], _trackPoints [j * 2 + 1], 0);
                _marker2d[j].SetActive(drawMarkers);
                //if (j >= 0) { break; }
            }
#endif

            //Debug.Log("on tracking" + Random.Range(0.0f, 1.0f).ToString());
            // get transform matrix for alignment 3d objects
            Plugins.ULS_UnityGetTransform(_mtx, intrinsic_camera_matrix, null);
            for (int i = 0; i < 16; ++i)
            {
                transformationM[i] = _mtx[i];
            }
            ARM = adjustMatrix * transformationM;

            // apply alignment matrix to object's transform
            ARUtils.SetTransformFromMatrix(_anchor3d.transform, ref ARM);

            // apply local scale to fit user's face
            Plugins.ULS_UnityGetScale3D(_scaleX, _scaleY, _scaleZ);
            Vector3 s = new Vector3(_scaleX [0], _scaleY [0], _scaleZ [0]);
            s.Scale(_original_scale);
            _helmet.transform.localScale = s;

            isOnTracking = true;
        }

        if (isOnTracking)
        {
            isOpenMouth();
            isCloseLeftEye();
            isCloseRightEye();
            if (isMouseOpenCounter > isMouseOpenJudger)
            {
                isMouseOpen = true;
            }
            else
            {
                isMouseOpen = false;
            }
        }
        else
        {
            isMouseOpenCounter = 0;
            isMouseOpen        = false;
        }
    }
        void Update()
        {
            //            if (!initDone)
            //                return;

            //            // Show tracking result
            //            if (0 < Plugins.ULS_UnityGetPoints(_trackPoints))
            //            {

            //#if DRAW_MARKERS
            //                for (int j = 0; j < Plugins.MAX_TRACKER_POINTS; ++j)
            //                {
            //                    _marker2d[j].transform.localPosition = new Vector3(_trackPoints[j * 2], _trackPoints[j * 2 + 1], 0);
            //                    _marker2d[j].SetActive(false);
            //                }
            //#endif

            //                float distanceNoseLeftEyeBrow = (_marker2d[(int)FacePoint.Nose].transform.position.x - _marker2d[(int)FacePoint.LeftEyeBrow].transform.position.x);
            //                float distanceNoseRightEyeBrow = (_marker2d[(int)FacePoint.RightEyeBrow].transform.position.x - _marker2d[(int)FacePoint.Nose].transform.position.x);
            //                float distanceNoseLeftEye = (_marker2d[(int)FacePoint.Nose].transform.position.x - _marker2d[(int)FacePoint.LeftEye].transform.position.x);
            //                float distanceNoseRightEye = (_marker2d[(int)FacePoint.RightEye].transform.position.x - _marker2d[(int)FacePoint.Nose].transform.position.x);
            //                float distanceNoseLeftFace = (_marker2d[(int)FacePoint.Nose].transform.position.x - _marker2d[(int)FacePoint.LeftFace].transform.position.x);
            //                float distanceNoseRightFace = (_marker2d[(int)FacePoint.RightFace].transform.position.x - _marker2d[(int)FacePoint.Nose].transform.position.x);

            //                //float distanceNoseLeftFace = (_marker2d[(int)FacePoint.Nose].transform.position.x - _marker2d[(int)FacePoint.LeftFace].transform.position.x);
            //                //float distanceNoseRightFace = (_marker2d[(int)FacePoint.RightFace].transform.position.x - _marker2d[(int)FacePoint.Nose].transform.position.x);

            //                //Debug.Log("Left:   " + distanceNoseLeftFace + "   Right:    " + distanceNoseRightFace);

            //                if ((distanceNoseLeftEyeBrow > distanceNoseLeftEye && distanceNoseLeftEye > distanceNoseLeftFace &&
            //                    distanceNoseLeftFace < 20.0f && distanceNoseLeftEyeBrow > 40.0f) ||
            //                   (distanceNoseRightEyeBrow > distanceNoseRightEye && distanceNoseRightEye > distanceNoseRightFace &&
            //                   distanceNoseRightFace < 20.0f && distanceNoseRightEyeBrow > 40.0f))
            //                {
            //                    Debug.Log("Face detect failed");
            //                    _anchor3d.transform.position = new Vector3(0, 0, -180.0f);
            //                }
            //                else
            //                {
            //                    // get transform matrix for alignment 3d objects
            //                    Plugins.ULS_UnityGetTransform(_mtx, intrinsic_camera_matrix, null);

            //                    for (int i = 0; i < 16; ++i) transformationM[i] = _mtx[i];
            //                    ARM = adjustMatrix * transformationM;

            //                    // apply alignment matrix to object's transform
            //                    ARUtils.SetTransformFromMatrix(_anchor3d.transform, ref ARM);

            //                    m_Anchor3DYRotation = _anchor3d.transform.eulerAngles.y;

            //                    if ((m_Anchor3DYRotation >= 0 && m_Anchor3DYRotation < 20) ||
            //                       (m_Anchor3DYRotation > 340 && m_Anchor3DYRotation < 360))
            //                    {
            //                        //m_Anchor3DHead.SetActive(true);
            //                        // apply local scale to fit user's face
            //                        Plugins.ULS_UnityGetScale3D(_scaleX, _scaleY, _scaleZ);
            //                        //Vector3 s = new Vector3(_scaleX[0], _scaleY[0], _scaleZ[0]);
            //                        Vector3 s = new Vector3(_scaleX[0], _scaleY[0], _scaleZ[0]);
            //                        s.Scale(_original_scale);
            //                        _helmet.transform.localScale = s;
            //                        _helmet.transform.localScale = new Vector3(s.x, 2.5f, s.z);
            //                    }
            //                    else
            //                    {
            //                        //m_Anchor3DHead.SetActive(false);
            //                        if ((m_Anchor3DYRotation >= 20 && m_Anchor3DYRotation < 30) ||
            //                            (m_Anchor3DYRotation > 330 && m_Anchor3DYRotation < 340))
            //                        {
            //                            _helmet.transform.localScale = new Vector3(2.5f, 2.5f, 2.5f);
            //                        }
            //                        else
            //                        {
            //                            _helmet.transform.localScale = new Vector3(2.4f, 2.4f, 2.4f);
            //                        }
            //                    }
            //                }



            //                // apply local scale to fit user's face
            //                //Plugins.ULS_UnityGetScale3D (_scaleX,_scaleY,_scaleZ);
            //                //Vector3 s = new Vector3 (_scaleX [0], _scaleY [0], _scaleZ [0]);
            //                //s.Scale (_original_scale);
            //                //_helmet.transform.localScale = s;
            //            }
            //            else
            //            {
            //                _anchor3d.transform.position = new Vector3(0, 0, -180.0f);
            //            }
            if (!initDone)
            {
                return;
            }

            // Show tracking result
            if (0 < Plugins.ULS_UnityGetPoints(_trackPoints))
            {
#if DRAW_MARKERS
                for (int j = 0; j < Plugins.MAX_TRACKER_POINTS; ++j)
                {
                    _marker2d[j].transform.localPosition = new Vector3(_trackPoints[j * 2], _trackPoints[j * 2 + 1], 0);
                    //  _marker2d[j].SetActive(true);
                }
#endif
                // get transform matrix for alignment 3d objects
                Plugins.ULS_UnityGetTransform(_mtx, intrinsic_camera_matrix, null);
                for (int i = 0; i < 16; ++i)
                {
                    transformationM[i] = _mtx[i];
                }
                ARM = adjustMatrix * transformationM;

                // apply alignment matrix to object's transform
                ARUtils.SetTransformFromMatrix(_anchor3d.transform, ref ARM);

                // apply local scale to fit user's face
                Plugins.ULS_UnityGetScale3D(_scaleX, _scaleY, _scaleZ);
                Vector3 s = new Vector3(_scaleX[0], _scaleY[0], _scaleZ[0]);
                s.Scale(_original_scale);
                //_helmet.transform.localScale = s;
            }
        }
    void Update()
    {
        if (!initDone)
        {
            return;
        }

        // Show tracking result
        if (0 < Plugins.ULS_UnityGetPoints(_trackPoints))
        {
#if DRAW_MARKERS
            for (int j = 0; j < Plugins.MAX_TRACKER_POINTS; ++j)
            {
                _marker2d[j].transform.localPosition = new Vector3(_trackPoints[j * 2], _trackPoints[j * 2 + 1], 0);
                _marker2d[j].SetActive(false);
            }
#endif
            // get transform matrix for alignment 3d objects
            Plugins.ULS_UnityGetTransform(_mtx, intrinsic_camera_matrix, null);
            for (int i = 0; i < 16; ++i)
            {
                transformationM[i] = _mtx[i];
            }
            ARM = adjustMatrix * transformationM;

            // apply alignment matrix to object's transform
            ARUtils.SetTransformFromMatrix(_anchor3d.transform, ref ARM);

            // apply local scale to fit user's face
            //Plugins.ULS_UnityGetScale3D(_scaleX, _scaleY, _scaleZ);
            //Vector3 s = new Vector3(_scaleX[0], _scaleY[0], _scaleZ[0]);
            //s.Scale(_original_scale);
            //_helmet.transform.localScale = s;

            //distancia de los cachetes
            float disAn = Vector3.Distance(_marker2d[0].transform.position, _marker2d[4].transform.position);
            //Distancia de la nariz al punto medio de los ojos
            float disAl = Vector3.Distance(_marker2d[9].transform.position, _marker2d[10].transform.position);

            //distancia de la boca
            float DisMouth = Vector3.Distance(_marker2d[28].transform.position, _marker2d[29].transform.position);

            //distancia constante para calcular la escala
            float d = disAn / disAl;
            // _helmet.transform.localScale = new Vector3(d, d, d);

            Debug.Log(d);


            float parcentaje = DisMouth / disAn;

            if (parcentaje > 0.05f)
            {
                float newPosZ = parcentaje * 500;
                _anchor3d.transform.position = new Vector3(_anchor3d.transform.position.x, _anchor3d.transform.position.y, _anchor3d.transform.position.z + newPosZ);
            }
        }
        else
        {
            _anchor3d.transform.position = new Vector3(0, 0, -180.0f);
        }
    }