UE4碰撞规则详解
UE4的碰撞设置在官方的文档的 物理模拟模块(链接:点击打开链接)。但是操作起来感觉坑还是比较多,所以这里总结一下,以防平时经常会漏掉或忽略某些条件。如果想看关于碰撞响应触发,可以参考链接( UE4蓝图碰撞检测解析) 如果想进一步深入UE物理引擎相关内容,请参考博客 (UE4物理模块分析)
现在开始讲解并总结一下UE4里面的碰撞规则:
1.只有拥有Collision属性的实体才可以碰撞
每个实体Actor,包括static Mesh,sphere,capsule等带碰撞的组件,在detail细节面板都有一个collision属性的栏。这个里面的参数是控制这些实体间进行碰撞的必要条件。
(注:在UE4里面,所有可以直接放在UE4场景世界里的对象都是一个Actor,这个类型在C++中是类AActor。其本身包含了非常多的属性,如坐标,碰撞等必要的特性。继承于Actor的有Pawn,Character,StaticMeshActor,CameraActor等等,所以在游戏世界存在的实体都属于Actor,不过Actor本身可能还包含组件等更多其他的元素)
2.不同实体的碰撞通过碰撞通道来区分
在UE4世界里面所有带碰撞的Actor被分为很多类别,比如WorldDynamic,Worldstatic,Pawn,character等,这些类型被称为一个个collision channel(碰撞对象通道)。一般来说,系统帮你设置了一些基本的collision channel。比如一个设置为静止的立方体归属于Worldstatic,而一个设置为可以动的球体归属于WorldDynamic。UE4做的非常的灵活的是,这个通道的类型,你可以任意的设置与添加,这样,你就可以根据你的情况自由的设置恰当的通道。更自由的是,你可以随时改变这个实体对象所属于的通道类型。
3.每一个实体必定有其自身属于的通道类型
每一个带有碰撞的Actor都有一个自己属于的通道类型,这个类型就在下图的Object Type里面。
4.每个实体可以通过碰撞预设来设置是否对其他通道类型实体产生碰撞
每一个带有碰撞的Actor都有一个Collision Presets(我们称他为碰撞预设),这个预设里面记录了他与系统设置里面所有通道类型之间的碰撞关系。参考下图,我们可以看到,这个实体本身的通道类型是WorldStatic,碰撞预设为BlockAll,意思就是与所有的实体都会产生碰撞。我们可以看到在下面有一个列表叫Collision Response,下面所有的对号都打在了Block里面,这就表示这个实体本身与所有打钩的对象都会产生碰撞。(你会看到还有一个trace response,之后再介绍)除了Block,还有Overlap和Ignore,分别是重叠和忽略。
5.碰撞时相互的,所以两个相互碰撞的实体设置都要满足碰撞条件
那是不是下图的这个实体就会和所有实体都会产生碰撞?不是的!我们知道力的作用是相互的,那这里的这个预设也是一个道理,另一个物体想与该实体碰撞,必须在这个物体所属的类型里面的Block打上对号才可以。这样二者就会相互碰撞了。
6.重叠事件也很重要,可以作为场景触发器事件
设置为Ignore和Overlap就不会产生任何碰撞,但是overlap会产生overlap事件(蓝图以及代码中可以判断实体之间是否有重叠,下面有简单解释)
7.trace response的理解
除了碰撞的通道,还有trace通道。trace也是一种碰撞检测的方法,向一个方向位置发射一个射线,对射线击中的对象进行判断,进而采取进一步措施。
所以trace response就是设置实体本身发射的trace会不会被其他对象响应。
8.正确设置staticMesh的碰撞盒类型(这是导致很多奇怪问题的重要bug)
每个staticMesh的碰撞盒必须正确对应他的StaticMeshSettings下的CollisionComplexity属性(双击静态网格物体文件即可进入编辑器)。这里简单介绍一下,每个静态网格实体都可以在编辑器里面添加碰撞盒,可以给物体设置简单的碰撞盒(球型,盒型,10个面的碰撞盒等),也可以设置复杂的碰撞盒。如果你给该静态物体设置简单的碰撞盒,StaticMeshSettings下的CollisionComplexity属性就应该设置为UseSimpleCollisionAsComplexity。如果设置了复杂的碰撞盒(AutoConvexCollision),这个属性就该为UseComplexityCollisionAsSimple(设置为Default也可以)。如果设置反了,就很容易出现无法正确模拟物理碰撞的情况。
9.最后,我们看一下图中的Collision Enabled类型。
正常4.8之前的版本有下面三个类型选项,文档基本说的比较通俗,不过有两点要注意
No Collision(无碰撞) - 不同该对象发生碰撞,无论是踪迹碰撞还是物理碰撞。 |
No Physics Collision(无物理碰撞) - 该刚体仅用于射线投射、扫射及重叠。 |
Collision Enabled(启用碰撞) - 该刚体用于物理模拟和碰撞查询。 |
a.这个选项类似一个总开关,如果这个地方选择了No Collision,那么不管前面怎么设置通道,也不会产生任何碰撞事件
b.这个里面No Physics Collision表示不进行物理模拟,就是说在这个实体移动时不会产生任何碰撞,但是各种重叠的事件还是会触发的。当这个实体静止的时候,与Collision Enabled的效果是完全一样的,可以碰撞也可以触发各种事件。
4.9之后变为下面的四个类型,如果你在官方文档找不到,切换成英文再查一下就能看到了。(中文文档总是更新的比较慢)
No Collision | No collision is enabled for this body. | |
Query Only | This body is used only for collision queries (raycasts, sweeps, and overlaps). | |
Physics Only | This body is used only for physics collision. | |
Collision Enabled | This body interacts with all collision (Query and Physics). |
其实4.9之后把原来的No Physics Collision分成了Query Only 和 Physics Only,也就是说Query Only可以进行各种trace,sweep,Overlap事件的触发,但是不会进行物理模拟,简单的讲就是运动时不会产生任何碰撞。但是静止时是由碰撞的。
Physics Only表示只能进行物理碰撞与运动模拟,但是不会触发任何事件。
注意:如果这里设置为No Collision,那么即使在Actor对象开启了simulatePhysics(开启物理模拟)也不会有效,也就不会受到重力而下落
其他注意内容:对于每个StaticMesh类型的Actor(即存在于场景中的实体),他的的detail面板下StaticMesh栏下有一个BlockingVolum,功能是创建一个物理体积。所谓物理体积就是一个游戏不可见的但是真实存在的实体,可以用于触发事件等。BlockingVolum就是一个带碰撞盒的体积,点击这个按钮,就是给这个实体创建一个单独的碰撞盒体积。按住Alt+C可以隐藏或者显示碰撞盒。这个体积可以用于场景中用画刷刷出来没有碰撞盒的静态物体,但是也需要碰撞的物体。
原文链接(转载请标明):http://blog.csdn.net/u012999985/article/details/51290096
UE4碰撞规则详解的更多相关文章
- Nginx 常用全局变量 及Rewrite规则详解
每次都很容易忘记Nginx的变量,下面列出来了一些常用 $remote_addr //获取客户端ip $binary_remote_addr //客户端ip(二进制) $remote_port //客 ...
- 53个Oracle语句优化规则详解(转)
Oracle sql 性能优化调整 1. 选用适合的ORACLE优化器 ORACLE的优化器共有3种:a. RULE (基于规则) b. COST (基于成本) c. CHOOSE ...
- ESLint 规则详解(二)
接上篇 ESLint 规则详解(一) 前端界大神 Nicholas C. Zakas 在 2013 年开发的 ESLint,极大地方便了大家对 Javascript 代码进行代码规范检查.这个工具包含 ...
- QuantLib 金融计算——基本组件之天数计算规则详解
目录 天数计算规则详解 定义 30 / 360 法 30/360 US 30/360 Bond Basis 30E/360 30E/360 ISDA Actual 法 Actual/Actual IC ...
- Apache Rewrite 规则详解
在开篇之前: 我想说这篇文章其实是我刚刚接触Rewrite的时候学习的文档,应属转载,但是在这里我不想写明原地址,原因是文章中大多数给出的配置命令经实验都是错误的.需要原文的可以在谷歌上搜索一下&qu ...
- css样式继承规则详解
css样式继承规则详解 一.总结 一句话总结:继承而发生样式冲突时,最近祖先获胜(最近原则). 1.继承中哪些样式不会被继承? 多数边框类属性,比如象Padding(补白),Margin(边界),背景 ...
- eslint规则详解
{ // 环境定义了预定义的全局变量. "env": { //环境定义了预定义的全局变量.更多在官网查看 "browser":true, "node& ...
- Nginx之location 匹配规则详解
有些童鞋的误区 1. location 的匹配顺序是“先匹配正则,再匹配普通”. 矫正: location 的匹配顺序其实是“先匹配普通,再匹配正则”.我这么说,大家一定会反驳我,因为按“先匹配普通, ...
- jQuery.validator 验证规则详解
前言:jQuery.validator是一款非常不错的表单验证插件,验证方式非常简单方便,它还对HTML5做了兼容处理,了解了验证规则,就基本掌握了它的使用,下面就让我一一道来 jQuery.vali ...
随机推荐
- javascript执行上下文和变量对象
执行上下文(execution context): 执行上下文就是当前 JavaScript 代码被解析和执行时所在环境的抽象概念. js语言是一段一段的顺序执行,这个“段”其实就是我们说的这个执行上 ...
- 政务私有云盘系统建设的工具 – Mobox私有云盘
序言 这几年,智慧政务已经成为了政府行业IT建设发展的重要进程.传统办公方式信息传递速度慢.共享程度低.查询利用难,早已成为政府机关获取和利用信息的严重制约因素.建立文档分享共用机制,加强数据整合,避 ...
- 原生js封装ajax代码
方法一:(类似jQuery的封装方法) 1.ajax函数封装: /* *author: Ivan *date: 2014.06.01 *参数说明: *opts: {'可选参数'} **method: ...
- 【codeforces 505C】Mr.Kitayuta,the Treasure Hunter
[题目链接]:http://codeforces.com/problemset/problem/505/C [题意] 一开始你跳一步长度为d; 之后你每步能跳d-1,d,d+1这3种步数; 然后在路上 ...
- 转:步步LINUX C--进程间通信(二)信号
源地址:http://blog.csdn.net/jmy5945hh/article/details/7529651 linux间进程通信的方法在前一篇文章中已有详细介绍.http://blog.cs ...
- C++ Primer 阅读小结
一.变量和基本类型 类型是C++程序设计的基础. 每种类型都定义了其存储空间要求和可以在该类型的所有对象上执行的操作.C++提供了一组基本内置类型,如int.char等.这些类型与它们在机器硬件上的标 ...
- spring MVC4 配置详解(个人记录)
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- YUM配置文件
创建容器,位置在/etc/yum.repos.d,扩展名必须是.repo #cd /etc/yum.repos.d #vim yum.repo 新建一个仓库文件,名字可以随便定义,在 ...
- Django项目:CRM(客户关系管理系统)--54--45PerfectCRM实现账号快速重置密码
# gbacc_ajax_urls.py # ————————42PerfectCRM实现AJAX全局账号注册———————— from django.conf.urls import url fro ...
- Node.js Error: Cannot find module express的解决办法(转载)
1.全局安装express框架,cmd打开命令行,输入如下命令: npm install -g express express 4.x版本中将命令工具分出来,安装一个命令工具,执行命令: npm in ...