gpt4 book ai didi

c# - Unity3D 防止对象沿特定轴移动

转载 作者:行者123 更新时间:2023-12-05 05:37:23 27 4
gpt4 key购买 nike

我正在 Unity3D 中进行航行模拟。我有基本的顺风风帆物理学,通过帆角和方向 Helm 控制实现,但现在我想防止“余地”,即船的横向运动。在真实的船中, Dagger 板或龙骨对侧向运动提供了很大的阻力,这导致即使有侧风,船也比侧向更向前行驶。

我目前有一个 GameManager 对象,它调用船上的一个方法以在每个 FixedUpdate 中应用风物理。没有一种简单的方法可以将给定坐标系中船上的所有力相加,因为根据帆在船上的位置,每个帆的力都会有一些偏移。所以我想要做的是存储飞船之前的速度,并在每个 FixedUpdate 中计算速度与前一帧相比变化了多少,然后应用相反的加速度以防止有余地。像这样:

Rigidbody rigidBody = this.ship.GetComponent<Rigidbody>();
// Get velocity in local coordinate frame
Vector3 localVelocity = rigidBody.transform.InverseTransformDirection(rigidBody.velocity);
float leewayDV = (localVelocity - this.previousVelocity).x;
this.previousVelocity = localVelocity;

Vector3 leewayCorrection = -1.0f * leewayDV * rigidBody.transform.right;
leewayCorrection = rigidBody.transform.TransformDirection(leewayCorrection);
rigidBody.AddForce(leewayCorrection, ForceMode.Acceleration);

(最终,余地校正不会是 100%,但我在调试时使用 100%)。

调试代码显示我正在应用加速来尝试阻止此运动,但它没有按预期工作。我不知道这种方法是否存在根本性错误,或者我的实现中存在错误,或者我是否可以通过一种完全不同的方式来实现这一目标。

最佳答案

好的,所以我没有发布问题的答案(限制一个轴上的运动),但我确实有解决“回旋余地”问题的答案。我意识到我太复杂了,我只需要插入 Drag Equation .我将它添加到 LateUpdate,它似乎做了我想做的事:通过调整不同的参数,我基本上可以限制给定风速下船舶的余地量。这似乎是最现实的方法,所以我很高兴将其作为解决方案。

void LateUpdate() {
Rigidbody rigidBody = this.ship.GetComponent<Rigidbody>();
// Get velocity in ship's coordinate frame
Vector3 localVelocity = rigidBody.transform.InverseTransformDirection(rigidBody.velocity);
float dragForce = calculateSidewaysDrag(localVelocity.x);
// Only worried about "x" drag here, e.g. leeway, because the engine handles regular drag just fine.
Vector3 dragVector = new Vector3(-dragForce, 0, 0);
// Transform the drag vector back to global coordinate frame
dragVector = rigidBody.transform.TransformDirection(dragVector);
rigidBody.AddForce(dragVector);
}

关于c# - Unity3D 防止对象沿特定轴移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73130445/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com