Unity学习日常问题记录七--尝试编写部分自己简单的碰撞规则一
来源:互联网 发布:伏尔加庄园 知乎 编辑:程序博客网 时间:2024/06/10 22:15
有了6中的问题,我们先建立一个脚本,如BallCollider.cs绑定在白球上
然后向脚本里添加void OnCollisionEnter(Collision collision)
1.添加如gameObject.GetComponent<Rigidbody> ().velocity = new Vector3 (1, 0, 1); 生效
2.当空的时候正常碰撞
这说明OnCollisionEnter看起来发生在Unity实际的碰撞之前又不覆盖其
无损的进出角相同的单点碰撞球体反弹,
y = x - 【2*(x•z/|z|)】z,x和y为inVelocity和outVelocity,z为球心到碰撞点方向单位矢量,忘记的可以查下点积的几何定义
然后,第一次尝试的代码如下
void OnCollisionEnter(Collision collision) {
if (collision.collider.tag == "TableSide") {
ContactPoint[] colliderPoints= collision.contacts;
if (colliderPoints.Length == 1) {
Vector3 inVelocity = ballSelfRigidbody.velocity;
Vector3 verticalAxis = (colliderPoints [0].point - gameObject.transform.position).normalized;
//y = x - 【2*(x•z/|z|)】z,x和y为inVelocity和outVelocity,z为球心到碰撞点方向单位矢量
Vector3 outVelocity = inVelocity - 2 * (inVelocity.x*verticalAxis.x + inVelocity.y*verticalAxis.y + inVelocity.z*verticalAxis.z) * verticalAxis;
ballSelfRigidbody.velocity = outVelocity;
} else {
Debug.Log ("colliderPoints.Length 不等于1.");
}
}
实际测试,有个时候碰撞正常,像弹力为1时候的样子,有时反弹角度不对,有时速度慢时贴边来回弹几次,贴边不动了或是消失垂直案边的速度,不反弹起来。
为了寻找问题,我们把以白球为原型,做了一白一红两个预设体TestBall和TestBall2,去掉刚体和碰撞体,只要个样子
脚本内容改成
void OnCollisionEnter(Collision collision) {
//gameObject.GetComponent<Rigidbody> ().velocity = new Vector3 (1, 0, 1);
if (collision.collider.tag == "TableSide") {
ContactPoint[] colliderPoints= collision.contacts;
Vector3 whiteBallPosition = Vector3.zero;
if (colliderPoints [0].thisCollider.name == "WhiteBall")
whiteBallPosition = colliderPoints [0].thisCollider.gameObject.transform.position;
if (colliderPoints.Length == 1) {
Vector3 inVelocity = ballSelfRigidbody.velocity;
Vector3 verticalAxis = (colliderPoints [0].point - gameObject.transform.position).normalized;
//y = x - 【2*(x•z/|z|)】z,x和y为inVelocity和outVelocity,z为球心到碰撞点方向单位矢量
Vector3 outVelocity = inVelocity - 2 * (inVelocity.x*verticalAxis.x + inVelocity.y*verticalAxis.y + inVelocity.z*verticalAxis.z) * verticalAxis;
ballSelfRigidbody.velocity = outVelocity;
Debug.Log ("colliderPoints [0].point = " + colliderPoints [0].point.ToString("f4") + "----gameObject.transform.position = " + gameObject.transform.position.ToString("f4") + "----whiteBallPosition = " + whiteBallPosition.ToString("f4") + "\n" +
"in = " + inVelocity.ToString("f4") + "---out = " + outVelocity.ToString("f4") + "----verticalAxis = " + verticalAxis.ToString("f4"));
Instantiate (testBall,colliderPoints [0].point,Quaternion.identity);
Instantiate (testBall2, gameObject.transform.position, Quaternion.identity);
} else {
Debug.Log ("colliderPoints.Length 不等于1.");
}
//collision.contacts
}
}
可以看出碰撞点的位置(图中白球)看起来都是正常,而用gameObject.transform.position得到的碰撞时的白球位置有时似乎有问题。而且从collosion中取得的白球位置和gameObject上取得白球位置是一样的,看来碰撞时白球位置不同步发生在给void OnCollisionEnter(Collision collision)的collision参数赋值之前。
- Unity学习日常问题记录七--尝试编写部分自己简单的碰撞规则一
- Unity学习日常问题记录六--球体碰撞的一些问题
- Unity学习日常问题记录一
- Unity学习日常问题记录三 -- Slider的使用
- Unity学习日常问题记录二-关于刚体的碰撞和物理材质(设定了材质不反弹的一种错误)
- 日常记录自己的学习进度,hhh
- Unity学习日常问题记录五--3dMax导入模型的一些问题
- Unity学习日常问题记录四 -- 改变进度条上的图标
- unity 编写代码日常(一)
- Unity学习日常问题记录九-关于Lookat与模型坐标系的相关的问题以及父子物体的刚体
- Unity学习日常问题记录八-反弹和静止条件值是可以设的,ParticleSystem的方向
- 学习日常的记录
- 日常学习的记录
- 编写自己的PMD规则
- Unity实现简单的碰撞检测
- Unity实现简单的碰撞检测
- Unity实现简单的碰撞检测
- Unity学习笔记 之 发射小球碰撞物体的代码记录
- 决策树
- MyCat:开源分布式数据库中间件
- 遗传算法求解TSP问题
- iOS 9开发小技巧
- 禁用Ubuntu 16.04 LTS客人会话(by 星空武哥)
- Unity学习日常问题记录七--尝试编写部分自己简单的碰撞规则一
- 32位:解决Unity5.3.XNo PC, Mac & Linux Standalone module loaded
- Linux C程序的链接和装入及Linux下动态链接的实现-IBM
- MySQL分布式集群之MyCAT(一)简介(修正)
- SQL----------------------语句
- ubuntu下的网络
- MySQL分布式集群之MyCAT(二)schema详解(修正)
- Fizz Buzz 问题
- 你所站的位置决定了你的话语权