如何通过改变物体的速度来产生定向阻力?
How to create directional drag by changing velocity of an object?
我正在尝试为我的游戏创建定向阻力,您可以在其中驾驶盘旋宇宙飞船(例如星球大战中的飞梭赛车)。已经统一的阻力对于悬停的船只、汽车等没有任何意义,因为它们通常从前面看是流线型的,而不是从侧面看。我不擅长物理学,但据我所知,你走得越快,阻力就会越大。我写了这个脚本,但它不起作用,一旦施加力,物体就会自行加速。
public Vector3 dragFactor;
private Rigidbody _rb;
void Start() {
_rb = GetComponent<Rigidbody>();
}
void FixedUpdate () {
Vector3 vel = _rb.velocity;
if(vel.x>0)
vel.x -= vel.x * dragFactor.x;
else
vel.x += vel.x * dragFactor.x;
if (vel.y > 0)
vel.y -= vel.y * dragFactor.y;
else
vel.y += vel.y * dragFactor.y;
if (vel.z > 0)
vel.z -= vel.z * dragFactor.z;
else
vel.z += vel.z * dragFactor.z;
_rb.velocity = vel;
}
你知道我做错了什么或者可以改变什么吗?
阻力与表面积有关。虽然我不能给你一个编码的答案,因为我自己正在寻找一个,至少对于 angular 拖动。所以看起来你做对了。我会说手动应用拖动也会受到对象默认拖动的影响。所以如果你有 .1 你在游戏中看到的是
vel.x * rb.drag * dragFactor.x
这不是你想要的。所以你需要使 rb 运动并手动移动它,这样自然力就不会作用于它。
此外,您还需要乘以一些归一化变量,即 time.fixedDeltaTime
_vel.x -= vel.x * dragFactor.x * Time.fixedDeltaTime
我找到了这段动态修改拖动的代码
具体
void CalculateDrag ()
{
// increase the drag based on speed, since a constant drag doesn't seem "Real" (tm) enough
float extraDrag = rigidbody.velocity.magnitude * dragIncreaseFactor;
// Air brakes work by directly modifying drag. This part is actually pretty realistic!
rigidbody.drag = (AirBrakes ? (originalDrag + extraDrag) * airBrakesEffect : originalDrag + extraDrag);
// Forward speed affects angular drag - at high forward speed, it's much harder for the plane to spin
rigidbody.angularDrag = originalAngularDrag * ForwardSpeed;
}
以上代码将帮助您以更高的速度修改阻力。
** 编辑,删除了对 isKinematic 的引用。除非你用速度修改位置,并应用重力,否则 isKinematic 是无用的。我希望我们可以使用 isKinematic 来防止应用默认拖动,最好只是确保刚体上的拖动为 0,并且您的脚本在固定更新中设置自定义拖动。
我正在尝试为我的游戏创建定向阻力,您可以在其中驾驶盘旋宇宙飞船(例如星球大战中的飞梭赛车)。已经统一的阻力对于悬停的船只、汽车等没有任何意义,因为它们通常从前面看是流线型的,而不是从侧面看。我不擅长物理学,但据我所知,你走得越快,阻力就会越大。我写了这个脚本,但它不起作用,一旦施加力,物体就会自行加速。
public Vector3 dragFactor;
private Rigidbody _rb;
void Start() {
_rb = GetComponent<Rigidbody>();
}
void FixedUpdate () {
Vector3 vel = _rb.velocity;
if(vel.x>0)
vel.x -= vel.x * dragFactor.x;
else
vel.x += vel.x * dragFactor.x;
if (vel.y > 0)
vel.y -= vel.y * dragFactor.y;
else
vel.y += vel.y * dragFactor.y;
if (vel.z > 0)
vel.z -= vel.z * dragFactor.z;
else
vel.z += vel.z * dragFactor.z;
_rb.velocity = vel;
}
你知道我做错了什么或者可以改变什么吗?
阻力与表面积有关。虽然我不能给你一个编码的答案,因为我自己正在寻找一个,至少对于 angular 拖动。所以看起来你做对了。我会说手动应用拖动也会受到对象默认拖动的影响。所以如果你有 .1 你在游戏中看到的是
vel.x * rb.drag * dragFactor.x
这不是你想要的。所以你需要使 rb 运动并手动移动它,这样自然力就不会作用于它。
此外,您还需要乘以一些归一化变量,即 time.fixedDeltaTime
_vel.x -= vel.x * dragFactor.x * Time.fixedDeltaTime
我找到了这段动态修改拖动的代码
具体
void CalculateDrag ()
{
// increase the drag based on speed, since a constant drag doesn't seem "Real" (tm) enough
float extraDrag = rigidbody.velocity.magnitude * dragIncreaseFactor;
// Air brakes work by directly modifying drag. This part is actually pretty realistic!
rigidbody.drag = (AirBrakes ? (originalDrag + extraDrag) * airBrakesEffect : originalDrag + extraDrag);
// Forward speed affects angular drag - at high forward speed, it's much harder for the plane to spin
rigidbody.angularDrag = originalAngularDrag * ForwardSpeed;
}
以上代码将帮助您以更高的速度修改阻力。
** 编辑,删除了对 isKinematic 的引用。除非你用速度修改位置,并应用重力,否则 isKinematic 是无用的。我希望我们可以使用 isKinematic 来防止应用默认拖动,最好只是确保刚体上的拖动为 0,并且您的脚本在固定更新中设置自定义拖动。