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

Unity丨移动相机朝向目标并确定目标在摄像机可视范围内丨摄像机注释模型丨摄像机移动丨不同尺寸模型优化丨

文章目录

    • 问题描述
    • 功能展示
    • 技术细节
    • 小结

问题描述

本文提供的功能是摄像机朝向目标移动,并确定整个目标出现在摄像机视角内,针对不同尺寸的模型优化。

功能展示

提示:这里可以添加技术名词解释
在这里插入图片描述

技术细节

直接上代码

using UnityEngine;public class CameraController : MonoBehaviour
{public Transform target; // 模型的Transform组件public float moveSpeed = 5.0f; // 摄像机移动速度public float rotationSpeed = 2.0f; // 摄像机旋转速度public float minDistance = 2.0f; // 摄像机与模型的最小距离public float maxDistanceMultiplier = 1.0f; // 最大距离的倍数private Vector3 targetOffset; // 目标相对于中心的偏移private void Start(){if (target == null){Debug.LogWarning("目标模型为空,请在Inspector中指定目标模型的Transform组件。");return;}// 初始化目标偏移targetOffset = target.position - transform.position;}private void Update(){if (target == null)return;// 计算摄像机指向目标的方向Vector3 targetDirection = target.position - transform.position;targetDirection.y = 0; // 如果只关注水平方向,可以将y轴置为0// 计算摄像机应该旋转的角度Quaternion targetRotation = Quaternion.LookRotation(targetDirection);// 平滑地旋转摄像机朝向目标transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, rotationSpeed * Time.deltaTime);// 计算摄像机与目标的距离float distance = Vector3.Distance(transform.position, target.position);// 根据模型的大小自动调整最小距离float modelSize = CalculateModelSize();float minDistance = modelSize * 0.5f;// 计算最大距离float maxDistance = modelSize * maxDistanceMultiplier;// 限制距离在最小和最大范围内distance = Mathf.Clamp(distance, minDistance, maxDistance);// 移动摄像机向前transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);// 计算目标的期望位置Vector3 desiredPosition = target.position - targetOffset - targetDirection.normalized * distance;// 平滑移动摄像机到期望位置transform.position = Vector3.Lerp(transform.position, desiredPosition, Time.deltaTime * moveSpeed);}// 计算模型的大小private float CalculateModelSize(){// 这里可以根据模型的具体情况来计算大小// 例如,可以获取模型的包围盒尺寸// 也可以根据模型中的特定标记来计算大小// 这里只是一个示例,需要根据实际情况进行调整Bounds bounds = new Bounds(target.position, Vector3.one);Renderer[] renderers = target.GetComponentsInChildren<Renderer>();foreach (Renderer renderer in renderers){bounds.Encapsulate(renderer.bounds);}// 返回模型的大小(包围盒的对角线长度)return bounds.size.magnitude;}
}

小结

后期可扩展功能:类似点击目标完成视角移动等。

http://www.lryc.cn/news/171680.html

相关文章:

  • 排序算法:归并排序(递归和非递归)
  • 数据可视化
  • Go并发可视化解释 – select语句
  • http的网站进行访问时候自动跳转至https
  • realloc
  • Windows AD域使用Linux Samba
  • Scrapy+Selenium自动化获取个人CSDN文章质量分
  • 【Android Framework系列】第15章 Fragment+ViewPager与Viewpager2相关原理
  • typeof的作用
  • 性能测试 —— Tomcat监控与调优:status页监控
  • Ubuntu 安装 CUDA 与 CUDNN GPU加速引擎
  • pdf文件太大如何处理?教你pdf压缩简单方法
  • Nacos使用教程(二)——nacos注册中心(1)
  • 蓝桥杯2023年第十四届省赛真题-买瓜--C语言题解
  • R语言进行孟德尔随机化+meta分析(1)---meta分析基础
  • 网络安全第一次作业
  • idea设置gradle
  • 基于Elasticsearch的多文档检索 比如 商品(goods)、案例(cases)
  • 9月18日,每日信息差
  • 基于FPGA实现FPDLINK III
  • [补题记录] Atcoder Beginner Contest 309(E)
  • 【HarmonyOS】解决API6 WebView跳转外部浏览器问题、本地模拟器启动黑屏
  • 给出三个整数,判断大小
  • 优化软件系统,解决死锁问题,提升稳定性与性能 redis排队下单
  • MyBatisPlus 底层用 json 存储,Java 仍然使用 对象操作
  • 发送验证码倒计时 防刷新重置!!!
  • OpenCV项目开发实战--forEach的并行像素访问与其它方法的性能比较
  • cv::Mat 的常见操作方法
  • JVM——11.JVM小结
  • 月木学途开发 2.前台用户模块