我正在尝试在Unity3D/C#中创建一个准确的相机捏合缩放。它必须基于地形上的物理点。下面的图片展示了我想要实现的效果。
相机是空物体的子对象,该空物体会缩放(在0到1之间缩放)以“缩放”,这样就不会影响相机的透视。
因此,我想到的方法是每个手指都必须使用一条射线投射来获取A和B点以及相机父对象的当前缩放比例。
例如:A(10,0,2),B(14,0,4),S(0.8,0.8,0.8)>> A(10,0,2),B(14,0,4),S(0.3,0.3,0.3)
手指的位置会改变,但是通过改变比例,hit.point值应该保持不变。
额外加分项:除了中心点之外,将相机缩放到两个手指之间的某个点也很好。
非常感谢任何帮助或参考。
编辑:到目前为止,我想出了以下代码,但不是我想要的精度。它包含了我上面提到的一些想法,我认为问题在于它不应该是/1000,而应该是包含当前比例的方程式。
相机是空物体的子对象,该空物体会缩放(在0到1之间缩放)以“缩放”,这样就不会影响相机的透视。
因此,我想到的方法是每个手指都必须使用一条射线投射来获取A和B点以及相机父对象的当前缩放比例。
例如:A(10,0,2),B(14,0,4),S(0.8,0.8,0.8)>> A(10,0,2),B(14,0,4),S(0.3,0.3,0.3)
手指的位置会改变,但是通过改变比例,hit.point值应该保持不变。
额外加分项:除了中心点之外,将相机缩放到两个手指之间的某个点也很好。
非常感谢任何帮助或参考。
编辑:到目前为止,我想出了以下代码,但不是我想要的精度。它包含了我上面提到的一些想法,我认为问题在于它不应该是/1000,而应该是包含当前比例的方程式。
if (Input.touchCount == 2) {
if (!CamZoom) {
CamZoom = true;
var rayA = Camera.main.ScreenPointToRay (Input.GetTouch (0).position);
var rayB = Camera.main.ScreenPointToRay (Input.GetTouch (1).position);
int layerMask = (1 << 8);
if (Physics.Raycast (rayA, out hit, 1500, layerMask)) {
PrevA = new Vector3 (hit.point.x, 0, hit.point.z);
Debug.Log ("PrevA: " + PrevA);
}
if (Physics.Raycast (rayB, out hit, 1500, layerMask)) {
PrevB = new Vector3 (hit.point.x, 0, hit.point.z);
Debug.Log ("PrevB: " + PrevB);
}
PrevDis = Vector3.Distance (PrevB, PrevA);
Debug.Log ("PrevDis: " + PrevDis);
PrevScaleV = new Vector3 (PrevScale, PrevScale, PrevScale);
PrevScale = this.transform.localScale.x;
Debug.Log ("PrevScale: " + PrevScale);
}
if (CamZoom) {
var rayA = Camera.main.ScreenPointToRay (Input.GetTouch (0).position);
var rayB = Camera.main.ScreenPointToRay (Input.GetTouch (1).position);
int layerMask = (1 << 8);
if (Physics.Raycast (rayA, out hit, 1500, layerMask)) {
NewA = new Vector3 (hit.point.x, 0, hit.point.z);
}
if (Physics.Raycast (rayB, out hit, 1500, layerMask)) {
NewB = new Vector3 (hit.point.x, 0, hit.point.z);
}
DeltaDis = PrevDis - (Vector3.Distance (NewB, NewA));
Debug.Log ("Delta: " + DeltaDis);
NewScale = PrevScale + (DeltaDis / 1000);
Debug.Log ("NewScale: " + NewScale);
NewScaleV = new Vector3 (NewScale, NewScale, NewScale);
this.transform.localScale = Vector3.Lerp(PrevScaleV,NewScaleV,Time.deltaTime);
PrevScaleV = NewScaleV;
CamAngle();
}
}