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

unity控制相机围绕物体旋转移动

记录一下控制相机围绕物体旋转与移动的脚本,相机操作思路分为两块,一部分为旋转,一部分为移动,旋转是根据当前center中心点的坐标,根据距离设置与默认的旋转进行位置移动,移动是根据相机的左右和前后进行计算,当获取到移动的值时把中心点进行移动,而不是移动相机,相机是根据中心点的坐标进行计算自己的坐标
这个中心点是一个空物体放在模型下方,不要把模型放进去
默认的角度设置需要提前说一下,例如当前我相机在场景的旋转为(39,135,0),
如果我想在运行的时候也是这个角度 就需要吧相机x轴填入到脚本的y轴上,需要取反为负数
相机的y轴放到脚本的x上,但是脚本的y需要自身的旋转减去180 设置就为(-45,-39,0)
这样做的理由就是把360的角度映射为正负1800
剩下的就是是否开启自旋转与是否可以低于地面
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

using QFramework;
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;public class Camera_模型相机 : MonoBehaviour
{// public Transform target; // 目标物体public GameObject center;//围绕点public float rotateSpeed = 5.0f; // 旋转速度public float scrollSpeed = 5.0f; // 滚轮速度public float minDistance = 20f; // 最小距离public float maxDistance = 150; // 最大距离public float initialDistance = 20.0f; // 初始距离public Vector2 initialAngles = new Vector2(0f, 30f); // 初始角度(水平,垂直)public float moveSpeed;//移动速度float move_X,move_Y;private float currentDistance;private float horizontalAngle;private float verticalAngle;public bool enableAutoRotate = false; // 是否启用自动旋转public float autoRotateSpeed = 10f; // 自动旋转速度bool bl_旋转控制;Vector3 initialPos;float time_自选择控制=5;public bool allowBelowGround = true; //是否允许低于地面public float groundHeight = 0f; // 地面高度(可自定义)void Start(){currentDistance = initialDistance;horizontalAngle = initialAngles.x;verticalAngle = initialAngles.y;initialPos = center.transform.position;UpdateCameraPosition();}void Update(){HandleMouseInput();HandleScrollInput();if (enableAutoRotate){if (!bl_旋转控制){time_自选择控制 += Time.deltaTime;if (time_自选择控制 >= 5) { bl_旋转控制 = true; time_自选择控制 = 0; }}AutoRotateCenter();}UpdateCameraPosition();}void AutoRotateCenter(){if (bl_旋转控制) horizontalAngle -= autoRotateSpeed * Time.deltaTime;}void HandleMouseInput(){if (Input.GetMouseButton(1)){bl_旋转控制 = false;time_自选择控制 = 0;// 获取鼠标移动量horizontalAngle += Input.GetAxis("Mouse X") * rotateSpeed;verticalAngle += Input.GetAxis("Mouse Y") * rotateSpeed;verticalAngle = Mathf.Clamp(verticalAngle, -89f, 89f); // 限制垂直角度}   // 新增右键平移逻辑// 鼠标左键移动if (Input.GetMouseButton(0)){bl_旋转控制 = false;time_自选择控制 = 0;move_X = moveSpeed * Input.GetAxis("Mouse X");move_Y= moveSpeed* Input.GetAxis("Mouse Y");Vector3 right = transform.right * move_X;Vector3 forward = transform.forward * move_Y;forward.y = 0; // 保持水平移动// print((right + forward));center.transform.Translate(-(right + forward), Space.World);}}void HandleScrollInput(){float scroll = Input.GetAxis("Mouse ScrollWheel");currentDistance -= scroll * scrollSpeed;currentDistance = Mathf.Clamp(currentDistance, minDistance, maxDistance);}public void ResetCamera(){// 重置到初始状态currentDistance = initialDistance;horizontalAngle = initialAngles.x;verticalAngle = initialAngles.y;center.Position(initialPos); bl_旋转控制 = false;}void UpdateCameraPosition(){// 计算旋转Quaternion yaw = Quaternion.AngleAxis(horizontalAngle, Vector3.up);Quaternion pitch = Quaternion.AngleAxis(verticalAngle, Vector3.right);Quaternion combinedRotation = yaw * pitch;// 计算相机位置Vector3 offset = combinedRotation * Vector3.forward * currentDistance;Vector3 targetPos = center.transform.position + offset;// 新增地面高度限制if (!allowBelowGround && targetPos.y < groundHeight){targetPos.y = groundHeight+0.2f; 重新计算距离保持原有水平距离//float horizontalDist = Mathf.Sqrt(//    Mathf.Pow(targetPos.x - center.transform.position.x, 2) +//    Mathf.Pow(targetPos.z - center.transform.position.z, 2)//);//currentDistance = horizontalDist / Mathf.Cos(Mathf.Asin(//    (groundHeight - center.transform.position.y) / currentDistance//));}transform.position = targetPos;// 确保相机看向目标transform.LookAt(center.transform.position);}
}

相关文章:

unity控制相机围绕物体旋转移动

记录一下控制相机围绕物体旋转与移动的脚本&#xff0c;相机操作思路分为两块&#xff0c;一部分为旋转&#xff0c;一部分为移动&#xff0c;旋转是根据当前center中心点的坐标&#xff0c;根据距离设置与默认的旋转进行位置移动&#xff0c;移动是根据相机的左右和前后进行计…...

线性代数:AI大模型的数学基石

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;10年以上C/C, C#, Java等多种编程语言开发经验&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开…...

【C/C++】从零开始掌握Kafka

文章目录 从零开始掌握Kafka一、Kafka 基础知识理解&#xff08;理论&#xff09;1. 核心组件与架构2. 重点概念解析 二、Kafka 面试重点知识梳理三、C 使用 Kafka 的实践&#xff08;librdkafka&#xff09;1. librdkafka 简介2. 安装 librdkafka 四、实战&#xff1a;高吞吐生…...

02_redis分布式锁原理

文章目录 一、redis如何实现分布式锁1. 使用 SETNX 命令2. 设置过期时间3. 释放锁4. 注意事项5. 示例代码 二、Java中分布式锁如何设置超时时间1. Redis分布式锁2. 基于Zookeeper的分布式锁3. 基于数据库的分布式锁注意事项 一、redis如何实现分布式锁 Redis 实现分布式锁是一…...

简单血条于小怪攻击模板

创建一个2d正方形&#xff08;9-Sliced&#xff09;命名为Player&#xff0c;在Player下面新建一个画布&#xff08;Canvas&#xff09;命名为PlayerHealthUI&#xff0c;在画布下面新建一个滑动条&#xff08;Slider&#xff09;命名为HealthBar 把PlayerHealthUI脚本挂载到Pl…...

Win11 系统登入时绑定微软邮箱导致用户名欠缺

Win11 系统登入时绑定微软邮箱导致用户名欠缺 解决思路 -> 解绑当前微软邮箱和用户名 -> 断网离线建立本地账户 -> 设置本地账户为Admin权限 -> 注销当前账户&#xff0c;登入新建的用户 -> 联网绑定微软邮箱 -> 删除旧的用户命令步骤 管理员权限打开…...

代码随想录算法训练营第四十六四十七天

卡码网题目: 110. 字符串接龙105. 有向图的完全联通106. 岛屿的周长107. 寻找存在的路径 其他: 今日总结 往期打卡 110. 字符串接龙 跳转: 110. 字符串接龙 学习: 代码随想录公开讲解 问题: 字典 strList 中从字符串 beginStr 和 endStr 的转换序列是一个按下述规格形成的序…...

华硕FL8000U加装16G+32G=48G内存条

华硕FL8000U加装16G32G48G内存条 一、华硕FL8000U加装内存条endl 一、华硕FL8000U加装内存条 相关视频链接: https://www.bilibili.com/video/BV1gw4dePED8/ endl...

前后端联调实战指南:Axios拦截器、CORS与JWT身份验证全解析

前言 在现代Web开发中&#xff0c;前后端分离架构已成为主流&#xff0c;而前后端联调则是开发过程中不可避免的关键环节。本文将深入探讨前后端联调中的三大核心技术&#xff1a;Axios拦截器的灵活运用、CORS跨域问题的全面解决方案以及JWT身份验证的安全实现。通过本文&…...

java高级 -Junit单元测试

Junit单元测试就是针对最小的功能&#xff1a;方法&#xff0c;编写测试代码对其进行正确性测试。用main方法进行测试的弊端是一个方法测试失败可能会影响别的方法的测试&#xff0c;也无法得到测试报告&#xff0c;需要我们自己观察数据是否正确。 此时&#xff0c;我们就需要…...

在 UVM验证环境中,验证 Out-of-Order或 Interleaving机制

在 UVM验证环境中,验证 Out-of-Order或 Interleaving机制 摘要:在 UVM (Universal Verification Methodology) 验证环境中,验证 Out-of-Order (乱序) 或 Interleaving (交错) 机制是验证复杂 SoC (System on Chip) 设计的重要任务,尤其是在验证高速接口(如 PCIe、AXI)、缓…...

V9数据库替换授权

文章目录 环境文档用途详细信息 环境 系统平台&#xff1a;Linux x86-64 Red Hat Enterprise Linux 7 版本&#xff1a;9.0 文档用途 1、本文档用于指导V9数据库替换授权。 2、V9数据库授权文件为license.dat。 详细信息 1、上传新的授权文件到服务器并修改授权文件属主为…...

勇闯Chromium—— Chromium的多进程架构

问题 构建一个永不崩溃或挂起的渲染引擎几乎是不可能的,构建一个绝对安全的渲染引擎也几乎是不可能的。 从某种程度上来说,2006 年左右的网络浏览器状态与过去单用户、协作式多任务操作系统的状况类似。正如在这样的操作系统中,一个行为不端的应用程序可能导致整个系统崩溃…...

Go语言中常量的命名规则详解

1. 常量的基本命名规则 1.1. 命名格式 1. 使用const关键字声明&#xff1b; 2. 命名格式&#xff1a;const 常量名 [类型] 值&#xff1b; 3. 类型可以省略&#xff0c;由编译器推断&#xff1b; 1.2. 命名风格 大小写规则&#xff1a; 1. 首字母大写&#xff1a;导出常…...

软件质量保证与测试实验

课程  软件质量保证与测试 目的&#xff1a;练习软件测试中白盒测试方法 内容&#xff1a; 测试如下程序段&#xff1a; #include <stdio.h>int main() {int i 1, n1 0, n2 0;float sum 0.0;float average;float score[100];printf("请输入分…...

历年华东师范大学保研上机真题

2025华东师范大学保研上机真题 2024华东师范大学保研上机真题 2023华东师范大学保研上机真题 在线测评链接&#xff1a;https://pgcode.cn/school?classification1 简单一位数代数式计算 题目描述 给一个小学生都会算的1位数与1位数运算的代数式&#xff0c;请你求出这个表…...

【C++】什么是静态库?什么是动态库?

静态库与动态库详解 静态库和动态库是软件开发中两种不同的代码共享和重用机制&#xff0c;它们在链接方式、内存使用和部署方式上有显著区别。 一、静态库(Static Library) 基本概念 静态库是在编译期间被完整复制到最终可执行文件中的预编译代码集合。 主要特点 链接时…...

项目阅读:Instruction Defense

总目录 大模型安全相关研究&#xff1a;https://blog.csdn.net/WhiffeYF/article/details/142132328 https://learnprompting.org/docs/prompt_hacking/defensive_measures/instruction https://www.doubao.com/chat/6945469301219586 速览 指令防御&#xff08;Instructio…...

springboot中拦截器配置使用

文章目录 前置拦截器代码拦截器注册疑问 前置 你使用 javaspringboot 常用在&#xff1a; 身份验证与授权&#xff0c;使用拦截器检查用户的身份验证状态和权限级别&#xff0c;确保只有经过验证且有适当权限的用户能够访问特定资源日志记录与审计性能分析与监控&#xff0…...

用 Python 构建自动驾驶的实时通信系统:让车辆“交流”起来!

用 Python 构建自动驾驶的实时通信系统:让车辆“交流”起来! 自动驾驶技术正加速变革全球交通体系,它不仅是机器学习与计算机视觉的胜利,更是一场 高效通信架构的革命。自动驾驶汽车需要实时交换信息,比如: 传感器数据(雷达、激光雷达、摄像头)V2V(车与车通信)V2X(…...

在机器学习中,L2正则化为什么能够缓过拟合?为何正则化等机制能够使一个“过度拟合训练集”的模型展现出更优的泛化性能?正则化

在现代机器学习的发展历程中&#xff0c;过拟合&#xff08;Overfitting&#xff09;始终是亟需克服的重要挑战。其表现如同在训练数据上构建过度复杂的映射函数&#xff0c;虽能实现近乎完美的拟合&#xff0c;但其泛化能力却显著受限&#xff0c;导致模型在测试集或实际应用中…...

day36 python神经网络训练

目录 一、数据准备与预处理 二、数据集划分与归一化 三、构建神经网络模型 四、定义损失函数和优化器 五、训练模型 六、评估模型 在机器学习和深度学习的实践中&#xff0c;信贷风险评估是一个非常重要的应用场景。通过构建神经网络模型&#xff0c;我们可以对客户的信用…...

k8s部署ELK补充篇:kubernetes-event-exporter收集Kubernetes集群中的事件

k8s部署ELK补充篇&#xff1a;kubernetes-event-exporter收集Kubernetes集群中的事件 文章目录 k8s部署ELK补充篇&#xff1a;kubernetes-event-exporter收集Kubernetes集群中的事件一、kubernetes-event-exporter简介二、kubernetes-event-exporter实战部署1. 创建Namespace&a…...

【Excel VBA 】窗体控件分类

一、Excel 窗体控件分类 Excel 中的窗体控件分为两大类型&#xff0c;适用于不同的开发需求&#xff1a; 类型所在选项卡特点表单控件开发工具 → 插入 → 表单控件简单易用&#xff0c;直接绑定宏&#xff0c;兼容性好&#xff0c;适合基础自动化操作。ActiveX 控件开发工具…...

C++性能相关的部分内容

C性能相关的部分内容 与底层硬件紧密结合 大端存储和小端存储&#xff08;硬件概念&#xff09; C在不同硬件上运行的结果可能不同 比如&#xff1a;输入01234567&#xff0c;对于大端存储的硬件会先在较大地址上先进行存储&#xff0c;而对于小端存储的硬件会先在较小地址上…...

Spring Boot 项目中常用的 ORM 框架 (JPA/Hibernate) 在性能方面有哪些需要注意的点?

在 Spring Boot 项目中使用 JPA (Java Persistence API) / Hibernate (作为 JPA 的默认实现) 时&#xff0c;性能是一个非常关键的考量点。虽然 ORM 极大地简化了数据库交互&#xff0c;但如果不注意&#xff0c;很容易引入性能瓶颈。以下是一些关键的性能注意事项&#xff1a;…...

基于大模型的大肠癌全流程预测与诊疗方案研究报告

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 二、大模型技术概述 2.1 大模型原理与架构 2.2 大模型在医疗领域的应用现状 三、术前风险预测与准备 3.1 术前风险预测指标 3.2 大模型预测方法与结果 3.3 基于预测结果的术前准备方案 四、术中风险预测与应…...

解决DeepSeek部署难题:提升效率与稳定性的关键策略

DeepSeek 部署中常见问题及对应解决方案 随着大模型技术的快速发展&#xff0c;DeepSeek 作为国内领先的大语言模型之一&#xff0c;广泛应用于自然语言处理、智能客服、内容生成等多个领域。 然而&#xff0c;在实际部署过程中&#xff0c;许多开发者和企业会遇到一系列挑战&a…...

AI进行提问、改写、生图、联网搜索资料,嘎嘎方便!

极客侧边栏-AI板块 目前插件内已接入DeepSeek-R1满血版、Qwen3满血版 、豆包/智谱最新发布的推理模型以及各种顶尖AI大模型&#xff0c;并且目前全都可以免费不限次数使用&#xff0c;秒回不卡顿&#xff0c;联网效果超好&#xff01; 相比于市面上很多AI产品&#xff0c;极客…...

GStreamer开发笔记(四):ubuntu搭建GStreamer基础开发环境以及基础Demo

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://blog.csdn.net/qq21497936/article/details/147714800 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、O…...