在项目制作过程中,我们可能会用到镜头的拉伸与旋转操作,不管在pc端还是移动端,拉伸效果要么就是放大target,要么就是移动camera,旋转也是一样,要么旋转摄像机,要么是旋转物体本身,具体情况具体对待。下面就两个方法的具体实现方法:
下面是通过控制camera与target的距离,实时更新camera的位置来实现物体的方法缩小,也就是拉伸效果。同样旋转物体也是通过setpos方法,实时更新位置实现摄像机的旋转。这种拉伸效果适合用在target是三维模型时。
using UnityEngine;
using System.Collections;
public class RotateAndPinch_2 : MonoBehaviour
{
public Transform target;
private float minVertical = 0f;
private float maxVertical = 85f;
private float x = 0.0f;
private float y = 0.0f;
private float distance = 0.0f;
private float newdis = 0;
private float olddis = 0;
// Use this for initialization
void Start()
{
distance = (transform.position - target.position).magnitude;
}
// Update is called once per frame
void Update()
{
transform.LookAt(target);
float dt = Time.deltaTime;
x = transform.eulerAngles.y;
y = transform.eulerAngles.x;
if (Application.platform == RuntimePlatform.Android || Application.platform == RuntimePlatform.IPhonePlayer)
{
if (Input.touchCount == 1)
{
if (Input.GetTouch(0).phase == TouchPhase.Moved)
{
float x1 = Input.GetAxis("Mouse X");
float y1 = Input.GetAxis("Mouse Y");
x += x1 * dt * 150;
y += -y1 * dt * 150;
SetPos(x, y);
}
}
if (Input.touchCount == 2)
{
if (Input.GetTouch(0).phase == TouchPhase.Moved && Input.GetTouch(1).phase == TouchPhase.Moved)
{
Vector3 s1 = Input.GetTouch(0).position;
Vector3 s2 = Input.GetTouch(1).position;
newdis=Vector2.Distance(s1,s2);
if(newdis>olddis)
{
distance-=Time.deltaTime*50f;
}
if(newdis<olddis)
{
distance+=Time.deltaTime*50f;
}
print("distance = "+distance);
SetPos(x,y);
olddis=newdis;
}
}
}
else
{
if (Input.GetMouseButton(0))
{
float x1 = Input.GetAxis("Mouse X");
float y1 = Input.GetAxis("Mouse Y");
x += x1 * dt * 150f;
y += -y1 * dt * 150f;
SetPos(x, y);
}
if (Input.GetAxis("Mouse ScrollWheel") != 0)
{
distance -= Input.GetAxis("Mouse ScrollWheel");
SetPos(x, y);
}
}
}
void SetPos(float x, float y)
{
y = ClampAngle(y, minVertical, maxVertical);
var rotation = Quaternion.Euler(y, x, 0.0f);
var position = rotation * new Vector3(0.0f, 0.0f, -distance) + target.position;
transform.rotation = rotation;
transform.position = position;
}
static float ClampAngle(float angle, float min, float max)
{
if (angle < -360)
angle += 360;
if (angle > 360)
angle -= 360;
return Mathf.Clamp(angle, min, max);
}
}
下面这个方法,实现上则比上面的简单一点,放大缩小是通过改变scale来实现,这种方法使用在二维平面中。
using UnityEngine;
/// <summary>
/// 旋转和缩放模型
/// </summary>
public class ScaleOrRotateModels : MonoBehaviour
{
//最大和最小缩放比例值
private float maxScale = 100;
private float minScale = 20;
private float newdis = 0;
private float olddis = 0;
private float horizontalSpeed = 5;
private float verticalSpeed = 5;
private Vector3 rotatepos;
private Vector3 defaultScale;
void Start()
{
rotatepos = transform.position;
defaultScale = transform.localScale;
}
void LateUpdate()
{
if (Application.platform == RuntimePlatform.Android)
{
//单指触屏滑动,物体的旋转
if (Input.touchCount == 1)
{
if (Input.GetTouch(0).phase == TouchPhase.Moved)
{
float h = Input.GetAxis("Mouse X");//右正左负
float v = Input.GetAxis("Mouse Y");//上正下负
if (Mathf.Abs(h) >= Mathf.Abs(v))
{
if (h < 0)
{
transform.RotateAround(rotatepos, Vector3.up, horizontalSpeed);
}
if (h > 0)
{
transform.RotateAround(rotatepos, -Vector3.up, horizontalSpeed);
}
}
else
{
if (v < 0)
{
transform.RotateAround(rotatepos, -Vector3.right, verticalSpeed);
}
if (v > 0)
{
transform.RotateAround(rotatepos, Vector3.right, verticalSpeed);
}
}
}
}
//两指触屏滑动,物体的缩放
if (Input.touchCount > 1)
{
if (Input.GetTouch(0).phase == TouchPhase.Moved || Input.GetTouch(1).phase == TouchPhase.Moved)
{
var pos1 = Input.GetTouch(0).position;
var pos2 = Input.GetTouch(1).position;
newdis = Vector2.Distance(pos1, pos2);
if (newdis < olddis && transform.localScale.x > minScale)
{
transform.localScale -= defaultScale * Time.deltaTime * 2;
}
if (newdis > olddis && transform.localScale.x < maxScale)
{
transform.localScale += defaultScale * Time.deltaTime * 2;
}
olddis = newdis;
}
}
}
else
{
//鼠标左键,物体旋转
if (Input.GetMouseButton(0))
{
float h = Input.GetAxis("Mouse X");//右正左负
float v = Input.GetAxis("Mouse Y");//上正下负
if (Mathf.Abs(h) >= Mathf.Abs(v))
{
if (h < 0)
{
transform.RotateAround(rotatepos, Vector3.up, horizontalSpeed);
}
if (h > 0)
{
transform.RotateAround(rotatepos, -Vector3.up, horizontalSpeed);
}
}
else
{
if (v < 0)
{
transform.RotateAround(rotatepos, -Vector3.right, verticalSpeed);
}
if (v > 0)
{
transform.RotateAround(rotatepos, Vector3.right, verticalSpeed);
}
}
}
if (Input.GetAxis("Mouse ScrollWheel") < 0 && transform.localScale.x < maxScale)
{
transform.localScale += defaultScale * Time.deltaTime * 2;
}
else if (Input.GetAxis("Mouse ScrollWheel") > 0 && transform.localScale.x > minScale)
{
transform.localScale -= defaultScale * Time.deltaTime * 2;
}
}
}
}
本文介绍了在Unity项目中实现镜头拉伸和旋转的两种方法。一种是通过调整camera与目标距离及setpos方法更新位置,适用于三维模型;另一种是通过改变物体scale进行放大缩小,适用于二维平面场景。

820

被折叠的 条评论
为什么被折叠?



