带碰撞检测的摄像机

unity中摄像机跟随主角,摄像机穿墙,射线碰撞检测,摄像机穿墙跟随 这个问题,摄像机拍摄主角,当主角被墙遮蔽了视野,那么就用正上方的点和当前相机所在位置的店为起始点和终点,从二者之间再找出三个关键点进行射线检测,能看到主角的店即可作为摄像机的transform.position [csharp] view plaincopyprint? Vector3[] posArray;          Vector3 beginPos = play 阅读详情

原文地址:http://blog.sina.com.cn/s/blog_4a2183a601018fmd.html


类似网游那样如果摄像机和目标之间有其他物体存在,就移动摄像机到障碍物前面





// CamController
// 带碰撞第三人称摄像机
//Edit by Shadou
//编写 傻逗
//
//create at 2011-8-4
//last change 2011-10-9
//
//Any bugs and suggestions please e-mail to 51149526@qq.com or visit my blog
//
//
 
@script AddComponentMenu ("SDTK/Camera/Thrid person Cam")
var target : Transform; //目标物体
var mask: LayerMask;//layer层           //只检测在mask 包含的层里的碰撞体是否会遮挡视线
 
var targetHeight = 2.0; //实际聚焦点位置处于目标坐标上方的高度值          //不宜过高,否则会影响视线检测的位置
var distance = 5.0;// 摄像机距离实际聚焦点的距离
 
var maxDistance = 20; //摄像机距离实际聚焦点的最大距离
var minDistance = 2.5; //摄像机距离实际聚焦点的最小距离
 
var xSpeed = 250.0; //横向移动速度(eulerAngles.y)
var ySpeed = 120.0; //纵向移动速度(eulerAngles.x)
 
var yMinLimit = -20; //摄像机仰角(eulerAngles.x)最小值
var yMaxLimit = 80; //摄像机仰角(eulerAngles.x)最大值
 
var zoomRate = 20; //推拉摄像机的速度
 
var rotationDampening = 2.0; //摄像机移动阻尼              //数值越小摄像机停止的速度越慢, 数值越高停止的速度越快
 
private var x = 0.0; //水平旋转角度
private var y = 0.0; //仰角旋转角度
 
private var xDampMove: float=0;//水平旋转阻尼速度
private var yDampMove: float=0;//仰角旋转阻尼速度
 
private var targetDistance: float=0;
 
 
function Awake () {
    var angles = transform.eulerAngles;
    x = angles.y;
    y = angles.x;
 
       // Make the rigid body not change rotation
       //防止刚体影响物体旋转
       if (rigidbody)
              rigidbody.freezeRotation = true;
             
       targetDistance=distance;
}
 
//摄像机位移应该在所有其他物体计算之后处理            //LateUpdate 晚于 Update
//防止摄像机移动后有其他物体移动道遮挡的位置, 或者与目标物体位移不同步
function LateUpdate () {
   if(!target)
      return;
      
       // If either mouse buttons are down, let them govern camera position
       //鼠标点击移动摄像机
       if(Input.GetMouseButton(2) || Input.GetMouseButton(1)){
              xDampMove=Input.GetAxis("Mouse X") * xSpeed;
              yDampMove=Input.GetAxis("Mouse Y") * ySpeed;
       }
      
       // move cam using arrow keys
       //使用键盘移动摄像机
       //~xDampMove-=(xDampMove<xSpeed/2f)?(Input.GetAxis("Horizontal")*xSpeed*0.25f):0;
       //~ yDampMove-=(xDampMove<xSpeed/2f)?(Input.GetAxis("Vertical")*ySpeed*0.25f):0;
      
       //clamp speed
       //限制移动速度最大值
       xDampMove=Mathf.Clamp(xDampMove,-xSpeed,xSpeed);
       yDampMove=Mathf.Clamp(yDampMove,-ySpeed,ySpeed);
      
       //apply
       //施加摄像机移动
       x+=xDampMove*Time.deltaTime;
       y-=yDampMove*Time.deltaTime;
      
       //distance change
       //更改摄像机与目标之间的距离
       if(Input.GetKey("q"))
              distance-=zoomRate*0.25f*Time.deltaTime;
      
       if(Input.GetKey("e"))
              distance+=zoomRate*0.25f*Time.deltaTime;
      
       distance -= (Input.GetAxis("Mouse ScrollWheel") * Time.deltaTime) * zoomRate * Mathf.Abs(distance);
       distance = Mathf.Clamp(distance, minDistance, maxDistance);
   
       //缩放施加阻尼
       targetDistance=Mathf.Lerp(targetDistance,distance,2*Time.deltaTime);
      
       //限制仰角
       y = ClampAngle(y, yMinLimit, yMaxLimit);
   
       //calcu
       //计算摄像机的角度和方向
       var rotation : Quaternion = Quaternion.Euler(y, x, 0);
       var position : Vector3= rotation * Vector3.forward * -targetDistance + target.position+Vector3(0,targetHeight,0);
   
       //slowDown
       //对摄像机的移动施加阻尼
       xDampMove=Mathf.Lerp(xDampMove,0,rotationDampening*Time.deltaTime);
       yDampMove=Mathf.Lerp(yDampMove,0,rotationDampening*Time.deltaTime);
 
      
       //checkLineOfSign and Collision
       //检测是否有碰撞体遮挡视线
       //如果有则移动摄像机的位置到障碍物前面
       position=SignUpdate(target.position+Vector3.up*targetHeight,position,0.3f, distance,0.6f,mask);
      
       //change distance if want
       //更改摄像机位置的同时更改距离    如果需要
       //开启时摄像机离开障碍物遮挡后不会突然跳跃
       //
       targetDistance=Vector3.Distance(position,target.position+Vector3.up*targetHeight);
       //
      
      
       //Apply
       //施加摄像机位移和旋转
       transform.rotation=rotation;
       transform.position=position;
      
}
 
//限制角度
static function ClampAngle (angle : float, min : float, max : float) {
   if (angle < -360)
      angle += 360;
   if (angle > 360)
      angle -= 360;
   return Mathf.Clamp (angle, min, max);
}
 
//检测是否有碰撞体遮挡在 targetPoint 和 selfPosition 之间
//targetPoint                         目标位置
//selfPosition                 自身位置
//checkRadios                      球星检测区域半径
//maxDis                             最大检测距离
//stepDis                              检测倒碰撞后向前偏移的位置,  建议大于检测半径*2
//s_mask                             碰撞检测遮罩
function SignUpdate(targetPoint: Vector3, selfPosition: Vector3, checkRadios: float, maxDis: float, stepDis: float, s_mask: LayerMask): Vector3{
       var ray: Ray=new Ray(targetPoint,selfPosition-targetPoint);
       var hit: RaycastHit;
      
       if(Physics.SphereCast(ray,checkRadios,hit,maxDis,s_mask)){
             
              return ray.GetPoint(hit.distance-stepDis);
       }
      
       //无碰撞返回原始位置
       return selfPosition;
}
Threejs开发指南(第五篇 碰撞检测与场景巡游) 本文以PointerLockControls类为基础,结合八叉树碰撞检测算法,融入重力感应机制,开发了GPLControls类,能够应用于一般性的第一人称巡游场合(比如室外校园巡游、室内建筑巡游等)。 阅读详情

相关推荐

【零基础入门unity游戏开发——unity通用篇19】GameObject的常见操作(基于unity6开发介绍)

GameObject的常见操作(基于unity6开发介绍)

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1557

【C#】【Unity】第三人称摄像机跟随人物移动时碰撞到墙壁等,摄像机不穿越墙壁

  目前大部分第三人称游戏的摄像机在遇到墙壁等狭隘空间的时候,都选择让摄像机不穿越到墙壁里面,而是让摄像机保持在墙壁表面。 分析情况:(红色方框为摄像机 黑色方框为墙壁)   当前情形摄像机还没达到墙壁摄像机仍保持正常效果。   当人物进一步靠近墙壁的时候,摄像机穿过墙壁。(造成后果,摄像机视角中墙壁被透明化)   当人物靠近,摄像机不会穿越墙壁而处于墙壁表面上的位置(...

Terrell21的博客 4332

【Unity3D开发小游戏】Unity3D零基础一步一步教你制作跑酷类游戏

【Unity3D实战】零基础一步一步教你制作跑酷类游戏(填坑完整版) - Unity3D知识库

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 4万+

从零开始做一款Unity3D游戏<二>——移动,相机控制与碰撞

Rigidbody组件能为附加到的对象添加真实的物理模拟。Collider 组件之间可以相互交互,并且 Collider 组可以作为对象与 Rigidbo组件进行交互。如果一个对象使用了 Rigidbody 组件但没有启用 isKinematic 属性,那么得的就是运动学效果,因为物理系统会忽略这个对象。如果一个对象使用了 Rigidbody 组件并且施加了力和扭矩,那么得到的将是非运动学效果。碰撞体基于交瓦行为发送通知。在本章,你创建了自己的第一款游戏,并积累了一定的经验。

m0_58367586的博客 2593

unity摄像机带碰撞检测

unity摄像机带碰撞检测 摄像机碰到带碰撞物体自动拉近

Camera Collision Script Unity游戏中常见的几种Camera控制脚本

Camera Collision Script Unity游戏中常见的几种Camera控制脚本

Unity3D 自制摄像机不穿墙/不穿物体(射线cast方法)

墙和物体都要加上collider(碰撞体),一般注意以下几点: 墙加mesh collider,在Convex上打勾 物体加box collider 加刚体(rigidbody)的物体不要选Is Kenimatic 基础最简单的Raycast方法 void Update() { RaycastHit hitInfo; Vector3 fwd = Camera.m...

⚡ 1万+

闲鱼客户端三重动态签名机制解析:x-sign、x-mini-wua与x-umt

在移动客户端安全通信中,设备级动态签名已成为主流App防范自动化攻击的核心手段。其原理是将设备指纹、运行时行为与可信硬件标识深度融合,生成不可复用、不可跨端、不可静态伪造的请求凭证。这类机制超越传统Token或Session鉴权,具备强上下文绑定性与实时熵值校验能力,广泛应用于电商、社交及开放平台等高风险接口场景。技术价值体现在有效识别模拟器、无头浏览器与集群化爬虫,同时保障多端一致性与合规数据对接。本文聚焦闲鱼客户端实际落地的x-sign(带设备上下文的混合签名)、x-mini-wua(小程序行为水印)与

weixin_35732273的博客 495

unity摄像机带碰撞检测 摄像机碰到带碰撞物体自动拉近

using UnityEngine; using System.Collections; public class CameraController : MonoBehaviour { public Transform target ; //目标物体 public LayerMask mask;//layer层 //只检测在mask 包含的层里的碰撞体是否会遮挡视线 ...

BackkomCoder的博客 5628

EM4095低频RFID曼彻斯特解码实战:从原理图到MCU代码实现

本文详细介绍了EM4095低频RFID读卡器的设计与实现,从芯片工作原理、天线设计到曼彻斯特解码算法。重点讲解了基于STM32的MCU代码实现,包括定时器捕获、数字滤波和错误处理,为开发125kHz RFID系统提供实用指南。

oil88的博客 713

GD32F450以太网(2-2): PHY芯片IP101GR介绍

IP101是台湾省九阳电子公司生产制造的,符合IEEE 802.3/802.3u标准单端口快速以太网收发器100Mbps和10Mbps操作,它支持自动MDI/MDIX功能,简化网络安装和减少系统维护成本。支持Auto MDI/MDIX已内置4个49.9欧的精密电阻支持中断功能支持 MII/RMII 接口超低功耗

Zhichao_Zhang的博客 1万+

OSG碰撞检测

OSG碰撞检测

mmqqyyqqyyq的博客 2205

从理论到板级:FOC电机驱动硬件电路全链路设计解析

本文从硬件工程师视角,深度解析FOC电机驱动从理论到板级实现的全链路设计。重点剖析了电源保护、核心采样电路、三相逆变桥与驱动电路等关键硬件模块的设计要点与实战经验,强调硬件是FOC算法可靠运行的基石,并提供了PCB布局布线的核心原则,帮助开发者构建高性能、高可靠性的电机驱动硬件平台。

weixin_29240711的博客 332

【原创】碰撞检测

导读:   【原创】碰撞检测   OSG碰撞检测   碰撞检测涉及到虚拟仿真的各个方面,这里我主要介绍两方面的应用:   一 判断摄像机是否与前面的物体相撞   基本原理如下图:   首先确定摄像机的旧位置和新位置(此处的新位置是假设前方没有障碍物所行进到的新位置),然后利用两点创建一条线段,然后判断这条线段与模型是否有交点,如果存在交点,则取交点作为新位置(或者取交点稍前面的一点作为新

zhangyb54007的专栏 1225

ADRC自抗扰控制:工程抗扰“黑科技”,附C代码实战!

自抗扰控制(ADRC)是一种革新性的强鲁棒控制策略,通过主动估计和补偿系统扰动,无需精确数学模型即可实现优异控制性能。本文详细解析ADRC三大核心组件:跟踪微分器(TD)实现指令柔化,扩张状态观测器(ESO)实时估计总扰动,非线性状态反馈(NLSEF)完成动态补偿。针对二阶系统,文章提供完整的参数设计方法和C语言实现框架,包括关键函数fhan和fal的代码实现。ADRC将复杂对象"线性化"为积分器串联系统,显著提升抗扰能力,特别适用于电机控制、飞行器姿态等存在模型不确定性和强干扰的场景。

技术工作者 1730

【三维重建】基于多视角图像的三维重建

基于多视角图像的三维重建》

m0_64446860的博客 8758

摄像机 碰撞检测

(转载)碰撞检测 http://bbs.vrchina.net/viewthread.php?tid=5196&amp;extra=page%3D1 OSG碰撞检测 碰撞检测涉及到虚拟仿真的各个方面,这里我主要介绍两方面的应用: 一 判断摄像机是否与前面的物体相撞 基本原理如下图: 首先确定摄像机的旧位置和新位置(此处的新位置是假设前方没有障碍物所行进到的新位置),然后利用两点创建一条...

weixin_33883178的博客 418

iPhone用户必看:TrollStore巨魔商店在线安装保姆级教程(iOS 14-16.6.1适用)

本文为iOS 14至16.6.1系统的iPhone用户提供了一份详细的TrollStore(巨魔商店)在线安装教程。文章从核心原理、安装前准备讲起,逐步详解了通过Safari浏览器获取安装器、信任企业证书、部署TrollStore及关键后置配置的全过程,并附带了常见问题排错指南,帮助用户安全、高效地实现无需越狱安装第三方应用。

h0i1j2k3l的博客 1974

Ogre中的碰撞检测

基于射线查询的方式,实现摄像机和地形的碰撞检测,防止摄像机穿透地面,这也是ogre demo中Terrian例子中的方法。   首先定义 RaySceneQuery* raySceneQuery = 0; 在CreateScene时候,创建场景查询

在那西天取经的路上。。。 717

华为OD机试真题 新系统【网络数据包收发处理】

华为OD机试 新系统真题【网络数据包收发处理】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【网络数据包收发处理】多语言题解。

qq_45776114的博客 443

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Unity API Camera摄像机的使用

Camera.main 返回主摄像机的Camera组件 第一个启用的标签为“MainCamera”的摄像机(只读)。 场景中的主要摄像机。如果场景中没有这样的摄像机,则返回null。此属性在内部使用FindGameObjectsWithTag,并且不缓存结果,建议缓存相机的返回值。 Camera.main等同于GameObject.Find("MainCamera").GetCompone...

cuijiahao的专栏 2799

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

上一篇: C++那些细节--inline关键字
下一篇: 《Effective C++》读书笔记(四)
puppet_master
puppet_master 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄12年 2695粉丝 161原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值