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); } } }
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); //} }
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)); }
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; }
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); } } }
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); } }
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); } }