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

2023-09-20 16:38:25

问题描述

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

功能展示

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

技术细节

直接上代码

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;
    }
}

小结

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

更多推荐

【大数据实训】基于Hive的北京市天气系统分析报告(二)

博主介绍:✌全网粉丝6W+,csdn特邀作者、博客专家、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于大数据技术领域和毕业项目实战✌🍅文末获取项目联系🍅目录1.引言1.1项目背景11.2项目意义12.需求分析22.1数据清洗需求分析22.2数据存储需求分析22.3MapRe

机器人还可以支持呼入?

呼入机器人是指一种能够接听电话并进行自动语音交互的人工智能软件系统。与传统的人工客服不同,呼入机器人可以根据预设的逻辑和语音识别技术进行自动回复和处理来电者的问题或需求,无需人工干预。这种软件通常能够帮助办公室工作人员更加高效地完成日常工作。通过使用呼入机器人,工作人员可以节省大量时间,并且能够更好地专注于高级工作。呼

Redis 缓存雪崩、缓存穿透、缓存击穿

Redis是一种常用的内存缓存工具,但在某些情况下,它可能会遭受缓存雪崩、缓存穿透和缓存击穿等问题。下面是一些预防这些问题的建议:1、缓存雪崩缓存雪崩指的是在某个时间点上,大量的缓存数据同时失效或过期,导致大量请求落到后端数据库上,引起系统崩溃。预防措施如下:逐级设置过期时间,避免所有缓存同时失效。设置随机过期时间,避

Vue实现大文件分片上传、断点续传

前言实现大文件分片上传的断点续传以及上传进度条是一个在前端开发中常见且具有挑战性的问题。本篇博客将介绍如何使用Vue框架来实现这个功能,并给出代码示例。概述大文件分片上传指的是将一个大文件切割成多个小文件(或称为分片),然后依次上传这些小文件,最后在服务器端将这些小文件合并为原始的大文件。断点续传则是在上传过程中遇到意

如何识别和解决PPPoE宽带连接的硬件故障

各位的爬虫大佬们!当你们在使用PPPoE连接时,偶尔会遇到硬件故障导致的连接问题。今天,我将为你提供一些有用的指导,帮助你识别和解决PPPoE连接中可能出现的硬件故障。第一步是确定故障的源头。以下是一些常见的硬件故障情况和对应的解决方法:1、网线故障有时候,连接问题可能由于网线出现故障而引起。首先,检查网线是否插好连接

git常用命令 Git常用命令 git常用操作 git 操作

git常用命令Git常用命令git常用操作git操作示例仓库地址初始化本地仓库克隆仓库代码查看当前仓库的状态,包括已修改但未提交的文件添加提交文件提交更改查看提交历史记录查看分支列表切换分支合并一个指定的分支到当前分支拉取远程仓库最新代码推送到远程仓库推送到指定远程仓库示例仓库地址仓库地址:https://github

LVS+Keepalived 高可用集群

LVS+Keepalived高可用集群1、Keepalived工具介绍2、vrrp协议(虚拟路由冗余协议)2.1vrrrp是什么?2.2vrrp工作过程2.3Keeplived、VRRP及其工作原理2.4Keepalived体系主要模块3、搭建LVS+Keepalived高可用集群1、Keepalived工具介绍支持故

用 Github Codespaces 免费搭建本地开发测试环境

如何丝滑地白嫖一个本地开发环境?怎么新建一个代码空间?1:通过Github网页新建2:通过VSCode插件新建为代码创建相应的开发测试环境如何丝滑地白嫖一个本地开发环境?使用Codespaces为开发者解决这样的痛点:为项目设置和维护一个或一组开发工作站。在“第一次提交”发生之前浪费的时间。开发工作站之间的配置/工具/

基于模型驱动的深度学习高光谱图像融合研究_孙杨霖

可以借鉴一下她的国内外现状研究部分,写得挺好的目前的高光谱图像融合方法可以大致分为三类:传统数学方法(成分替代和多分辨率分析)、变分方法(贝叶斯、矩阵分析)以及基于深度学习(输入级、特征级和模型级融合)的方法。其中前两种方法也可以被统称为传统高光谱图像融合方法。成分替代法,把LRHSI投影到更高维的空间,分离空间信息和

第一章 SQL Server 数据库部署

个人简介:云计算网络运维专业人员,了解运维知识,掌握TCP/IP协议,每天分享网络运维知识与技能。座右铭:海不辞水,故能成其大;山不辞石,故能成其高。个人主页:小李会科技的主页目录一数据库介绍(1)使用数据库的必要性(2)数据库的基本概念1.数据2.数据库和数据库表3.数据库系统和数据库管理系统(3)数据库的发展史(4

React中的Hooks--useReducer()

首先,useReducer是React提供的一个钩子函数,用于管理组件内部的状态。它可以接收一个reducer函数和初始状态,并返回一个包含状态和更新状态的函数的数组。与之相反,Redux是一个独立的状态管理库,它可以在整个应用程序中实现数据共享。Redux使用一个全局的状态树(store)来存储应用程序的状态,并通过

热文推荐