// Update is called once per frame void Update() { gps_info = "手机实际位置: " + Input.location.lastData.longitude + "," + Input.location.lastData.latitude; testBallLoc = "小球位置: " + testLon + "," + testLat; if (baseLat > 1 && baseLon > 1) //start follow { testLon += Input.location.lastData.longitude - baseLon; testLat += Input.location.lastData.latitude - baseLat; baseLon = Input.location.lastData.longitude; baseLat = Input.location.lastData.latitude; } LonLatPoint lonlatpoint = new LonLatPoint(testLon, testLat); PixelPoint point = gp.lonlatToPixel(lonlatpoint, 17); controller.SimpleMove(controller.transform.InverseTransformPoint((new Vector3(-(float)point.pointX / 100f, 0.8f, (float)point.pointY / 100f)))); // LonLatPoint mylonlatpoint = new LonLatPoint(Input.location.lastData.longitude,Input.location.lastData.latitude); // PixelPoint mypoint = gp.lonlatToPixel (mylonlatpoint,17); // controller.SimpleMove (controller.transform.InverseTransformPoint((new Vector3 (-(float)mypoint.pointX/100f,0.8f,(float)mypoint.pointY/100f)))); // print ("x:"+(-(float)mypoint.pointX/100f)+" y:"+(float)mypoint.pointY/100f); if (isRotateBack) // { Vector3 centerPoint = new Vector3(Screen.width / 2, Screen.height / 2, transform.position.y / Mathf.Sin(DegreetoRadians(transform.eulerAngles.x))); float angleBefore = transform.eulerAngles.y; float rotateSpeed; if (angleBefore > 180) { rotateSpeed = -50.0f * Time.deltaTime; } else { rotateSpeed = 50.0f * Time.deltaTime; } transform.RotateAround(camera.ScreenToWorldPoint(centerPoint), new Vector3(0, 1, 0), rotateSpeed); for (int i = 0; i <= 12; i++) { texts[i].transform.Rotate(Vector3.forward * rotateSpeed); } float angleAfter = transform.eulerAngles.y; print("angleBefore is " + angleBefore + " angleAfter is " + angleAfter); if (angleBefore <= 180 && angleAfter > 180) { isRotateBack = false; hasRotated = false; // _unityCallIOS("back"); } print("transform.eulerAngles.y is " + transform.eulerAngles.y); } speed = transform.position.y / scale; if (Input.touchCount == 1) { if (Input.GetTouch(0).phase == TouchPhase.Began) //屏幕点击事件 { touchBefore = Input.GetTouch(0).position; Ray ray = camera.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if (Physics.Raycast(ray, out hit)) { print("click:" + hit.transform.gameObject.name); clickMessage = "点击:" + kav.getValueFromkey(hit.transform.gameObject.name); } currentGesture = ""; } if (Input.GetTouch(0).phase == TouchPhase.Moved) { if (!currentGesture.Equals("")) { return; } Vector2 touchAfter = Input.GetTouch(0).position; Vector2 touchDeltaPosition = touchAfter - touchBefore; float lengthScreen = touchDeltaPosition.magnitude; Vector3 touchAfterToWorld = camera.ScreenToWorldPoint(new Vector3(touchAfter.x, touchAfter.y, transform.position.y / Mathf.Sin(DegreetoRadians(transform.eulerAngles.x)))); Vector3 touchBeforeToWorld = camera.ScreenToWorldPoint(new Vector3(touchBefore.x, touchBefore.y, transform.position.y / Mathf.Sin(DegreetoRadians(transform.eulerAngles.x)))); Vector3 deltaWorld = touchAfterToWorld - touchBeforeToWorld; float lengthWorld = deltaWorld.magnitude; float scaleFromSceenToWorld = lengthWorld / lengthScreen; float y_weight = -touchDeltaPosition.y * Mathf.Sin(DegreetoRadians(transform.eulerAngles.x)); float z_weight = -touchDeltaPosition.y * Mathf.Cos(DegreetoRadians(transform.eulerAngles.x)); transform.Translate(-touchDeltaPosition.x * scaleFromSceenToWorld, y_weight * scaleFromSceenToWorld, z_weight * scaleFromSceenToWorld); touchBefore = touchAfter; } } else if (Input.touchCount == 2) { Touch touchZero = Input.GetTouch(0); Touch touchOne = Input.GetTouch(1); if (touchZero.phase == TouchPhase.Began || touchOne.phase == TouchPhase.Began) { touch0before = Input.GetTouch(0).position; touch1before = Input.GetTouch(1).position; currentGesture = "begin"; gestureList.Clear(); // print("coor0:"+testCoorString0); // print("coor1:"+testCoorString1); testCoorString0 = ""; testCoorString1 = ""; } else if (touchZero.phase == TouchPhase.Moved && touchOne.phase == TouchPhase.Moved) { testCoorString0 += touchZero.position + "\n"; testCoorString1 += touchOne.position + "\n"; //判断之前和之后,两点间的距离的变化是否是巨大的 float pinchDistance = Vector2.Distance(touchZero.position, touchOne.position); float prevDistance = Vector2.Distance(touch0before, touch1before); pinchDistanceDelta = pinchDistance - prevDistance; print("pinchDistanceDelta is " + pinchDistanceDelta); if (Mathf.Abs(pinchDistanceDelta) > minPinchDistance) { isDistanceChangeHuge = true; } else { isDistanceChangeHuge = false; } // Vector2 touch0before = touchZero.position - touchZero.deltaPosition; // Vector2 touch1before = touchOne.position - touchOne.deltaPosition; Vector2 vectorbefore01 = new Vector2(touch1before.x - touch0before.x, touch1before.y - touch0before.y); float angleZero = VectorAngle(vectorbefore01, touchZero.position - touch0before); Vector2 vectorbefore10 = new Vector2(touch0before.x - touch1before.x, touch0before.y - touch1before.y); float angleOne = VectorAngle(vectorbefore10, touchOne.position - touch1before); if (angleZero * angleOne > 0 && Mathf.Abs(angleZero) > 90 - angleRangeOfRotate / 2 && Mathf.Abs(angleZero) < 90 + angleRangeOfRotate / 2 && Mathf.Abs(angleOne) > 90 - angleRangeOfRotate / 2 && Mathf.Abs(angleOne) < 90 + angleRangeOfRotate / 2) { isRotate = true; } else { isRotate = false; } if (isRotate) { if (currentGesture.Equals("begin")) { gestureList.Add("rotate"); if (isContinuousSameGesture("rotate")) //连续三个rotate { currentGesture = "rotate"; } else { touch0before = touchZero.position; touch1before = touchOne.position; return; } } else { if (!currentGesture.Equals("rotate")) //zoom or updown { touch0before = touchZero.position; touch1before = touchOne.position; return; } } print("---------rotate_camera"); Vector2 vectorAfter01 = new Vector2(touchOne.position.x - touchZero.position.x, touchOne.position.y - touchZero.position.y); float rotateAngle = VectorAngle(vectorbefore01, vectorAfter01); Vector3 centerPoint = new Vector3((touch0before.x + touch1before.x) / 2, (touch0before.y + touch1before.y) / 2, transform.position.y / Mathf.Sin(DegreetoRadians(transform.eulerAngles.x))); transform.RotateAround(camera.ScreenToWorldPoint(centerPoint), new Vector3(0, 1, 0), -rotateAngle); print("centerPoint is " + camera.ScreenToWorldPoint(centerPoint)); hasRotated = true; //text rotate // text.transform.Rotate(Vector3.forward*rotateAngle); for (int i = 0; i <= 12; i++) { texts[i].transform.Rotate(Vector3.forward * (-rotateAngle)); } } else { if (isDistanceChangeHuge) { if (currentGesture.Equals("begin")) { gestureList.Add("zoom"); if (isContinuousSameGesture("zoom")) //连续三个zoom { currentGesture = "zoom"; } else { touch0before = touchZero.position; touch1before = touchOne.position; return; } } else { if (!currentGesture.Equals("zoom")) //rotate or updown { touch0before = touchZero.position; touch1before = touchOne.position; return; } } print("------------zoom"); Vector2 touchZeroPrevPos = touchZero.position - (touchZero.position - touch0before); Vector2 touchOnePrevPos = touchOne.position - (touchOne.position - touch1before); // Find the magnitude of the vector (the distance) between the touches in each frame. float prevTouchDeltaMag = (touchZeroPrevPos - touchOnePrevPos).magnitude; float touchDeltaMag = (touchZero.position - touchOne.position).magnitude; // Find the difference in the distances between each frame. float deltaMagnitudeDiff = prevTouchDeltaMag - touchDeltaMag; print("height:" + transform.position.y); if (deltaMagnitudeDiff > 0) //zoom out { if (transform.position.y > maxHigh) { print("too high"); hasUpDown = false; //call ios native function back touch0before = touchZero.position; touch1before = touchOne.position; return; } } else //zoom in { if (transform.position.y < minHigh) { print("too low"); touch0before = touchZero.position; touch1before = touchOne.position; return; } } float h1 = transform.position.y; transform.Translate(-Vector3.forward * deltaMagnitudeDiff * speed); if (transform.position.y > maxHigh * 9 / 10) { supportRotate = false; if (h1 <= maxHigh * 9 / 10) //转回来 { startRotateBack(); hasUpDown = false; } } else { supportRotate = true; } print("after height:" + transform.position.y); float h2 = transform.position.y; float angle1 = 90.0f - transform.eulerAngles.x; if (deltaMagnitudeDiff > 0) //zoom out { if (transform.eulerAngles.x < getMaxAngleByHeight()) { print("transform.eulerAngles.x is " + transform.eulerAngles.x + " getMaxAngleByHeight is " + getMaxAngleByHeight()); Vector3 cameraLeftWorldVector = transform.TransformDirection(Vector3.left); float anglecorret = getMaxAngleByHeight() - transform.eulerAngles.x; transform.RotateAround(transform.position, cameraLeftWorldVector, -anglecorret); float dis1 = Mathf.Tan(DegreetoRadians(angle1)) * h2; float dis2 = Mathf.Tan(DegreetoRadians(angle1 - anglecorret)) * h2; float dis = dis1 - dis2; float y_weight = dis * Mathf.Sin(DegreetoRadians(transform.eulerAngles.x)); float z_weight = dis * Mathf.Cos(DegreetoRadians(transform.eulerAngles.x)); transform.Translate(0, y_weight, z_weight); } } else //zoom in { if (!hasUpDown) { Vector3 cameraLeftWorldVector = transform.TransformDirection(Vector3.left); float anglecorret = transform.eulerAngles.x - getMaxAngleByHeight(); print("transform.eulerAngles.x is " + transform.eulerAngles.x); print("getMaxAngleByHeight() is " + getMaxAngleByHeight()); print("anglecorret is " + anglecorret); transform.RotateAround(transform.position, cameraLeftWorldVector, anglecorret); float dis1 = Mathf.Tan(DegreetoRadians(angle1)) * h2; float dis2 = Mathf.Tan(DegreetoRadians(angle1 + anglecorret)) * h2; float dis = dis2 - dis1; float y_weight = dis * Mathf.Sin(DegreetoRadians(transform.eulerAngles.x)); float z_weight = dis * Mathf.Cos(DegreetoRadians(transform.eulerAngles.x)); transform.Translate(0, -y_weight, -z_weight); } } } else { if (currentGesture.Equals("begin")) { gestureList.Add("updown"); if (isContinuousSameGesture("updown")) //连续三个updown { currentGesture = "updown"; } else { touch0before = touchZero.position; touch1before = touchOne.position; return; } } else { if (!currentGesture.Equals("updown")) //zoom or rotate { touch0before = touchZero.position; touch1before = touchOne.position; return; } } print("look up and down"); float angle = (touchZero.position - touch0before).y * 90.0f / Screen.height; if (angle > 0) //look up { if (transform.eulerAngles.x < getMaxAngleByHeight()) { print("can not look up anymore"); touch0before = touchZero.position; touch1before = touchOne.position; return; } } else { if (transform.eulerAngles.x > maxAngle) { print("can not look down anymore"); touch0before = touchZero.position; touch1before = touchOne.position; return; } } if (transform.eulerAngles.x - angle > maxAngle) //防止倒过来看 { angle = transform.eulerAngles.x - maxAngle; } Vector3 cameraLeftWorldVector = transform.TransformDirection(Vector3.left); Vector3 centerPoint = new Vector3(Screen.width / 2, Screen.height / 2, transform.position.y / Mathf.Sin(DegreetoRadians(transform.eulerAngles.x))); transform.RotateAround(camera.ScreenToWorldPoint(centerPoint), cameraLeftWorldVector, angle); hasUpDown = true; } } touch0before = touchZero.position; touch1before = touchOne.position; } } }