Unity3D,"knocked away" 类型的光源对象?
Unity3D, "knocked away" type light object?
在Unity场景中,想象一下
一个大的滑动物体(可能是 "shipping container" 或 "sofa" 由于某种原因滑动)
途中有数根2m高的轻型木棍轻轻插在地上
在现实生活中,棍子会站在那里(首先,这在 PhysX 中实际上很难实现),当大物体击中它们时,
大对象完全不受影响
木棍会被轻而易举地打飞,大概反弹一两次然后落在某处
我发现这在 Unity 中很难做到。
通常你会说:"give the large object a mass of a few thousand, and the sticks a mass of only 1 or 2 kg"。
但是我发现这真的行不通 - 棍子确实会使大的滑动物体旋转。
如果您将大对象的 angular 阻力设置得较高,那么这不是您想要的,因为它的其他行为。
首先,我让木棍具有运动性(因此它们会站起来而不会倒下),然后当大物体敲打它时..
protected void OnCollisionEnter(Collision collisionInfo) {
rb.isKinematic = false;
}
也许唯一的方法是
事实上,让木棍在物理上完全不受大物体的影响
当他们触碰(触发)时,实际上只是独立地随机拥有棍子"fly off"。 (让木棍只与地面碰撞,风景。)
如何在 Unity/PhysX 环境中做到这一点?
(将我的评论转换为答案)
在现实生活中,小物件会影响大物件,但只是轻微的(所以可能木棍太多了?)。或者问题出在棍子插入地面的方式上?我用立方体(1000 公斤)和一些圆柱体(1 公斤)创建了测试场景。所有物体都只是自由地站在地面上。这是立方体撞击圆柱体时的样子:
我确实取得了巨大的成功 "Booming" 手动铅笔对象。因为它可能对某人有所帮助,所以方法如下。
通常您会在相应层上的对象下方有一个单独的触发器:
public class BoomableTrigger : MonoBehaviour {
public Boomable tell;
protected void OnTriggerEnter(Collider other) {
tell.Triggered(other.GetComponent<Rigidbody>().velocity);
}
}
然后,要真正"throw"当你的车撞到它时,它会以一种幽默的方式向前移动..
public class Boomable : MonoBehaviour {
Rigidbody rb;
// obvious setup not shown ..
public void Triggered(Vector3 vehicleVelocity) {
// (very likely tell your networking this happened ...)
DoBoom(vehicleVelocity);
}
public void DoBoom(Vector3 vehicleVelocity) {
// assume we are being hit by a large vehicle
rb.isKinematic = false;
// make it spring forwards humorously
rb.velocity = vehicleVelocity * Random.Range(1f,3f);
// and make it "snap-fall, forwards" ...
Vector3 worldLeftwards =
Vector3.Cross(vehicleVelocity, Vector3.up).normalized;
rb.angularVelocity =
worldLeftwards * -1f * Random.Range(5f,50f);
}
这给了它一个真正的 Buster Keaton 突然坠落,一旦车辆撞击它,它 "flies away" 从车辆上掉下来。
实验表明,为了获得很好的喜剧效果,以及将其向前抛出(第一个子句),您确实需要制作它 "fall forward",这需要一些矢量化。
目前还不完全清楚为什么它不能像@obywan 的回答那样在 PhysX 中自然工作,可能是运动学翻转。但如果你必须那样做,这会很好地工作。
在Unity场景中,想象一下
一个大的滑动物体(可能是 "shipping container" 或 "sofa" 由于某种原因滑动)
途中有数根2m高的轻型木棍轻轻插在地上
在现实生活中,棍子会站在那里(首先,这在 PhysX 中实际上很难实现),当大物体击中它们时,
大对象完全不受影响
木棍会被轻而易举地打飞,大概反弹一两次然后落在某处
我发现这在 Unity 中很难做到。
通常你会说:"give the large object a mass of a few thousand, and the sticks a mass of only 1 or 2 kg"。
但是我发现这真的行不通 - 棍子确实会使大的滑动物体旋转。
如果您将大对象的 angular 阻力设置得较高,那么这不是您想要的,因为它的其他行为。
首先,我让木棍具有运动性(因此它们会站起来而不会倒下),然后当大物体敲打它时..
protected void OnCollisionEnter(Collision collisionInfo) {
rb.isKinematic = false;
}
也许唯一的方法是
事实上,让木棍在物理上完全不受大物体的影响
当他们触碰(触发)时,实际上只是独立地随机拥有棍子"fly off"。 (让木棍只与地面碰撞,风景。)
如何在 Unity/PhysX 环境中做到这一点?
(将我的评论转换为答案)
在现实生活中,小物件会影响大物件,但只是轻微的(所以可能木棍太多了?)。或者问题出在棍子插入地面的方式上?我用立方体(1000 公斤)和一些圆柱体(1 公斤)创建了测试场景。所有物体都只是自由地站在地面上。这是立方体撞击圆柱体时的样子:
我确实取得了巨大的成功 "Booming" 手动铅笔对象。因为它可能对某人有所帮助,所以方法如下。
通常您会在相应层上的对象下方有一个单独的触发器:
public class BoomableTrigger : MonoBehaviour {
public Boomable tell;
protected void OnTriggerEnter(Collider other) {
tell.Triggered(other.GetComponent<Rigidbody>().velocity);
}
}
然后,要真正"throw"当你的车撞到它时,它会以一种幽默的方式向前移动..
public class Boomable : MonoBehaviour {
Rigidbody rb;
// obvious setup not shown ..
public void Triggered(Vector3 vehicleVelocity) {
// (very likely tell your networking this happened ...)
DoBoom(vehicleVelocity);
}
public void DoBoom(Vector3 vehicleVelocity) {
// assume we are being hit by a large vehicle
rb.isKinematic = false;
// make it spring forwards humorously
rb.velocity = vehicleVelocity * Random.Range(1f,3f);
// and make it "snap-fall, forwards" ...
Vector3 worldLeftwards =
Vector3.Cross(vehicleVelocity, Vector3.up).normalized;
rb.angularVelocity =
worldLeftwards * -1f * Random.Range(5f,50f);
}
这给了它一个真正的 Buster Keaton 突然坠落,一旦车辆撞击它,它 "flies away" 从车辆上掉下来。
实验表明,为了获得很好的喜剧效果,以及将其向前抛出(第一个子句),您确实需要制作它 "fall forward",这需要一些矢量化。
目前还不完全清楚为什么它不能像@obywan 的回答那样在 PhysX 中自然工作,可能是运动学翻转。但如果你必须那样做,这会很好地工作。