当前位置: 首页 > news >正文

松江新城网站建设贵阳市 网站建设

松江新城网站建设,贵阳市 网站建设,网站开发判断是否为手机,深圳游戏公司基于上一篇一种基于体素的射线检测 使用射线处理第三人称摄像头穿模问题 基于体素的第三人称摄像机拉近简单处理 摄像机移动至碰撞点处 简单的从角色身上发射一条射线到摄像机#xff0c;中途遇到碰撞就把摄像机移动至该碰撞点 public void UpdateDistance(float defaultDist…基于上一篇一种基于体素的射线检测 使用射线处理第三人称摄像头穿模问题 基于体素的第三人称摄像机拉近简单处理 摄像机移动至碰撞点处 简单的从角色身上发射一条射线到摄像机中途遇到碰撞就把摄像机移动至该碰撞点 public void UpdateDistance(float defaultDistance){Vector3 from player.position;Vector3 to cameraRoot.position;Vector3 forward (to - from).normalized;Debug.DrawLine(from, to, Color.red);if (BlockPhysics.Raycast(BlockWorld.CurWorld, from, forward, (to - from).magnitude, out hitInfo)){distance cameraRoot.InverseTransformPoint(hitInfo.point).z;}else{distance 0;}curDistance Mathf.Lerp(curDistance, distance, speed * Time.fixedDeltaTime);curDistance Mathf.Clamp(curDistance, 0, defaultDistance);transform.localPosition Vector3.forward * curDistance;}可以明显看到摄像机一半在外面一半在墙里面体验感非常差 可以通过检测摄像机近裁剪面的4个顶点是否在方块或体素内 如果有一个顶点产生碰撞那么就把摄像机向前移动 float GetDistance(float distance){int i 0;int loop 666;virtualCamera.localPosition Vector3.forward * distance;var wrold BlockWorld.CurWorld;while (loop-- 0){UpdateNearClipPlane();for (i 0; i 4; i){if (wrold.HasBlockCollider(Vector3Int.RoundToInt(corners[i])) || wrold.HasVoxelCollider(corners[i])){break;}}if (i 4)break;distance 0.25f;virtualCamera.localPosition Vector3.forward * distance;}return distance;} 通过前移规避穿模问题 当然如果夹角非常小或者在一个狭窄的通道内并不推荐拉近摄像头。 因为拉近已经不能解决问题。这种情况下推荐摄像机观察中心直接固定在方块中心。 从方块中心出发就不用担心角色过于靠近墙壁导致的拉近修复无效 完整代码 using UnityEngine;public class CameraOffset : MonoBehaviour {public float speed 10;Transform cameraRoot;Transform player;float distance;float curDistance;RaycastHit hitInfo;Camera mainCamera;Transform virtualCamera;Vector3[] corners new Vector3[4];float width;float height;private void Start(){cameraRoot transform.parent;player GameObject.FindGameObjectWithTag(Player).transform;player player.transform.Find(cameraFollow);mainCamera Camera.main;virtualCamera new GameObject(virtualCamera).transform;virtualCamera.transform.SetParent(mainCamera.transform.parent);virtualCamera.localPosition Vector3.zero;virtualCamera.localRotation Quaternion.identity;virtualCamera.localScale Vector3.zero;float halfFOV (mainCamera.fieldOfView * 0.5f) * Mathf.Deg2Rad;float aspect mainCamera.aspect;height mainCamera.nearClipPlane * Mathf.Tan(halfFOV);width height * aspect;}private void OnDrawGizmos(){Gizmos.color Color.red;Gizmos.DrawWireSphere(hitInfo.point, 0.1f);}public void UpdateDistance(float defaultDistance){Vector3 from player.position;Vector3 to cameraRoot.position;Vector3 forward (to - from).normalized;Debug.DrawLine(from, to, Color.red);if (BlockPhysics.Raycast(BlockWorld.CurWorld, from, forward, (to - from).magnitude, out hitInfo)){distance GetDistance(cameraRoot.InverseTransformPoint(hitInfo.point).z);}else{distance 0;}curDistance Mathf.Lerp(curDistance, distance, speed * Time.fixedDeltaTime);curDistance Mathf.Clamp(curDistance, 0, defaultDistance);transform.localPosition Vector3.forward * curDistance;}float GetDistance(float distance){int i 0;int loop 666;virtualCamera.localPosition Vector3.forward * distance;var wrold BlockWorld.CurWorld;while (loop-- 0){UpdateNearClipPlane();for (i 0; i 4; i){if (wrold.HasBlockCollider(Vector3Int.RoundToInt(corners[i])) || wrold.HasVoxelCollider(corners[i])){break;}}if (i 4)break;distance 0.25f;virtualCamera.localPosition Vector3.forward * distance;}return distance;}void UpdateNearClipPlane(){corners[0] virtualCamera.position - (virtualCamera.right * width);corners[0] virtualCamera.up * height;corners[0] virtualCamera.forward * mainCamera.nearClipPlane;corners[1] virtualCamera.position (virtualCamera.right * width);corners[1] virtualCamera.up * height;corners[1] virtualCamera.forward * mainCamera.nearClipPlane;corners[2] virtualCamera.position - (virtualCamera.right * width);corners[2] - virtualCamera.up * height;corners[2] virtualCamera.forward * mainCamera.nearClipPlane;corners[3] virtualCamera.position (virtualCamera.right * width);corners[3] - virtualCamera.up * height;corners[3] virtualCamera.forward * mainCamera.nearClipPlane;} }
http://www.sadfv.cn/news/15128/

相关文章:

  • 青浦郑州阳网站建设访问wordpress时失败
  • 丹阳网站建设效果简单的手机网页制作
  • 山东网站建设维护网站建设开发综合实训小结
  • 网站鼠标特效建筑工地新型材料模板
  • 常州转化率网站建设公司怎么样肇庆seo霸屏
  • 天津网站建设优选企业网站策划书的内容
  • 重庆招聘网站有哪些济南建站服务商
  • 网站套餐到期什么意思网站模板 站长之家
  • 昆明做网站建设找谁网页设计图片之间空隙
  • 什么是wap网站广东省公共资源交易中心平台
  • 质监站网址修改wordpress登录背景图
  • ppt做的好的有哪些网站有哪些wordpress去掉.php
  • dede模板用图片多的网站不行网站建设的知识和技能
  • 90设计网站终身会员秋佐科技公司网站
  • 网站建设企业关键词商标购买网商标
  • 公司网络推广网站就选火13星仁德定制微信免费下载
  • 怎么给你新网站做seo长沙企业名录黄页
  • dede网站qq类文章源码网页版百度网盘
  • 没有网站做淘宝客衡水企业网站设计
  • 网站做推广应该如何来做呢哪里推广wordpress 手机 写文
  • wordpress 网站搬家宠物网站开发文档
  • 天津网站建设制作软件58同城 招聘 找工作
  • 自助建站平台哪家好WordPress代收插件
  • 自己建网站怎么建白云微网站建设
  • 有哪些网站可以做电子邀请函鹰潭网站开发
  • 制作网站的过程细节网站建设编写代码出错
  • 网上做医生哪个网站好企业网站脚本语言
  • 网站建设 技术协议wordpress迁站到阿里云
  • 网站建设和app制作如何建设网站使用
  • 织梦网站备案网站答辩ppt怎么做