基于Unity3D的相机功能的实现(八)—— 收藏篇
来源:互联网 发布:yii2开源cms推荐 编辑:程序博客网 时间:2024/05/20 18:49
看到的不错的相机代码,分享一下。
// Marmoset Skyshop// Copyright 2013 Marmoset LLC// http://marmoset.cousing UnityEngine;using System.Collections;public class FreeCamera : MonoBehaviour {public float thetaSpeed = 250.0f;public float phiSpeed = 120.0f;public float moveSpeed = 10.0f;public float zoomSpeed = 30.0f;public float phiBoundMin = -89f;public float phiBoundMax = 89f;public bool useMoveBounds = true;public float moveBounds = 100f;public float rotateSmoothing = 0.5f;public float moveSmoothing = 0.7f;public float distance = 2.0f;private Vector2 euler;private Quaternion targetRot;private Vector3 targetLookAt;private float targetDist;private Vector3 distanceVec = new Vector3(0,0,0);private Transform target;private Rect inputBounds;public Rect paramInputBounds = new Rect(0,0,1,1);public bool usePivotPoint = true;public Vector3 pivotPoint = new Vector3(0,2,0);public Transform pivotTransform = null;#if UNITY_IPHONE || UNITY_ANDROIDprivate bool firstTouch = true;#endifpublic void Start () { Vector3 angles = transform.eulerAngles; euler.x = angles.y; euler.y = angles.x;//unity only returns positive euler angles but we need them in -90 to 90euler.y = Mathf.Repeat(euler.y+180f, 360f)-180f;GameObject go = new GameObject("_FreeCameraTarget");go.hideFlags = HideFlags.HideAndDontSave | HideFlags.HideInInspector;target = go.transform;if( usePivotPoint ) {target.position = pivotPoint;targetDist = (transform.position-target.position).magnitude;} else if(pivotTransform != null) {usePivotPoint = true;Vector3 localPos = transform.worldToLocalMatrix.MultiplyPoint3x4(pivotTransform.position);localPos.x = 0;localPos.y = 0;targetDist = localPos.z;target.position = transform.localToWorldMatrix.MultiplyPoint3x4(localPos);} else {target.position = transform.position + transform.forward * distance;targetDist = distance;}targetRot = transform.rotation;targetLookAt = target.position;#if UNITY_IPHONE || UNITY_ANDROIDfirstTouch = true;#endif}public void Update () {//NOTE: mouse coordinates have a bottom-left origin, camera top-leftinputBounds.x = GetComponent<Camera>().pixelWidth * paramInputBounds.x;inputBounds.y = GetComponent<Camera>().pixelHeight * paramInputBounds.y;inputBounds.width = GetComponent<Camera>().pixelWidth * paramInputBounds.width;inputBounds.height = GetComponent<Camera>().pixelHeight * paramInputBounds.height; if(target && inputBounds.Contains(Input.mousePosition)) { float dx = Input.GetAxis("Mouse X");float dy = Input.GetAxis("Mouse Y");#if UNITY_IPHONE || UNITY_ANDROIDif(Input.multiTouchEnabled) {if(Input.touchCount > 0) {//touch-down detection. kekeke.if(!firstTouch) {dx += Input.GetTouch(0).deltaPosition.x * 0.01f;dy += Input.GetTouch(0).deltaPosition.y * 0.01f;}firstTouch = false;} else {firstTouch = true;}}#endifbool click1 = Input.GetMouseButton(0) || Input.touchCount == 1; bool click2 = Input.GetMouseButton(1) || Input.touchCount == 2; bool click3 = Input.GetMouseButton(2) || Input.touchCount == 3; bool click4 = Input.touchCount >= 4;bool rotInput = click1;bool skyInput = click4 || click1 && (Input.GetKey(KeyCode.LeftShift) || Input.GetKey (KeyCode.RightShift));bool panInput = click3 || click1 && (Input.GetKey(KeyCode.LeftControl) || Input.GetKey(KeyCode.RightControl));bool zoomInput = click2;if( skyInput ) {dx = dx * thetaSpeed * 0.02f;//mset.SkyManager manager = mset.SkyManager.Get();//if(manager && manager.GlobalSky) { //manager.GlobalSky.transform.Rotate(new Vector3(0,dx,0));//}}else if( panInput ) {dx = dx * moveSpeed * 0.005f * targetDist; dy = dy * moveSpeed * 0.005f * targetDist; targetLookAt -= transform.up*dy + transform.right*dx;if( useMoveBounds ) { targetLookAt.x = Mathf.Clamp(targetLookAt.x,-moveBounds,moveBounds);targetLookAt.y = Mathf.Clamp(targetLookAt.y,-moveBounds,moveBounds); targetLookAt.z = Mathf.Clamp(targetLookAt.z,-moveBounds,moveBounds);}}else if( zoomInput ) {dy = dy * zoomSpeed * 0.005f * targetDist; targetDist += dy; targetDist = Mathf.Max(0.1f,targetDist); }else if( rotInput ) {dx = dx * thetaSpeed * 0.02f;dy = dy * phiSpeed * 0.02f;euler.x += dx; euler.y -= dy; euler.y = ClampAngle(euler.y, phiBoundMin, phiBoundMax); targetRot = Quaternion.Euler(euler.y, euler.x, 0);} targetDist -= Input.GetAxis("Mouse ScrollWheel") * zoomSpeed * 0.5f; targetDist = Mathf.Max(0.1f,targetDist);}}public void FixedUpdate() {distance = moveSmoothing*targetDist + (1-moveSmoothing)*distance;transform.rotation = Quaternion.Slerp( transform.rotation, targetRot, rotateSmoothing ); target.position = Vector3.Lerp(target.position, targetLookAt, moveSmoothing);distanceVec.z = distance; transform.position = target.position - transform.rotation * distanceVec;}static float ClampAngle(float angle, float min, float max) {if(angle < -360f) angle += 360f;if(angle > 360f)angle -= 360f;return Mathf.Clamp(angle, min, max);}}
阅读全文
0 0
- 基于Unity3D的相机功能的实现(八)—— 收藏篇
- 基于Unity3D的相机功能的实现(三)——第一人称相机(FPS)
- 基于Unity3D的相机功能的实现(四)——第三人称相机(TPS)
- 基于Unity3D的相机功能的实现(一)——VR相机
- 基于Unity3D的相机功能的实现(二)——AR相机
- 基于Unity3D的相机功能的实现(五)—— 相机跟随
- 基于Unity3D的相机功能的实现(七)—— 综合篇
- 基于opencv的相机之特效功能实现(八)
- 基于Unity3D的相机功能的实现(六)—— 上帝视角(王者荣耀视角)
- Unity3D基于陀螺仪实现VR相机功能
- Unity3D自学笔记——架构应用(八)人物移动与角色相机的跟随
- 基于opencv的相机之拼图功能实现(十)
- 基于Unity3D的相机震动效果的实现
- (八)相机对焦功能实现
- 基于GPUImage的功能相机
- 基于opencv的相机之调整功能实现(七)
- 基于opencv的相机之马赛克功能实现(九)
- 基于opencv的相机之加密解密功能实现(十三)
- (二)java框架篇笔记库(22)
- SDNU OJ 1171 合并果子 (附带1013)
- c#写入数据到excel中
- Spring @Scheduled 定时任务
- UnityShader初级篇——透明度混合
- 基于Unity3D的相机功能的实现(八)—— 收藏篇
- 【internal】undo内部机制
- LeetCode687. Longest Univalue Path
- 路由聚敛和路由回路
- C++ Lambda表达式用法
- MyCat的使用
- 结合retrofit和rxjava的使用
- NOIP比赛中如何加速c++的输入输出
- Okhttp3封装工具类