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

文章目录

问题描述

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

功能展示

提示:这里可以添加技术名词解释

技术细节

直接上代码

csharp 复制代码
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;
    }
}

小结

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

相关推荐
kyle~1 小时前
ISP---RAW数据解析:从PixelFormat、Packed_Buffer到Bayer解码
数码相机·接口隔离原则
FLJwu2 小时前
镜头模组与画质量产实战 03:运动相机 ISP 图像调校、杂光鬼影抑制与来料验收标准|20 年源头工厂量产经验
经验分享·数码相机·产品运营·接口隔离原则·相机
高升说3 小时前
手眼 3D 相机选型:先定工作距离,再谈精度,最后定安装
人工智能·数码相机·3d
不吃凉粉5 小时前
Unity与AS通信
unity·游戏引擎
两水先木示17 小时前
【Unity】探索小地图迷雾散开Shader效果(基础版)
unity·游戏引擎
智简数文21 小时前
锂电池检测用工业相机哪家好?极片/隔膜/电芯参数选型对照
数码相机
WarrenMondeville1 天前
AI复刻街头霸王到 Unity
unity·游戏引擎
高升说1 天前
广角看得广,未必看得远:视场角与量程如何互相制约
深度学习·数码相机
FLJwu1 天前
镜头模组与画质量产实战 02:运动相机镜头组装工艺、胶水选型、温变跑焦与参数虚标|20 年源头工厂量产经验
经验分享·数码相机·产品运营·相机
玖玥拾1 天前
Lua 基础语法(六)xLua Lua 调用 C# 交互
开发语言·unity·c#·lua