沿贝塞尔曲线方向移动物体?

Sen*_*nel 5 c++ math 3d

我有一个对象,我想跟随一个bezier曲线,现在有点迷失,如何使它基于时间而不是构成曲线的点来做到这一点.

.:: Current System ::.场景图中的每个对象都是由位置,旋转和比例矢量组成的.这些矢量用于形成它们相应的矩阵:比例,旋转和平移.然后将其按该顺序相乘以形成局部变换矩阵.然后将世界变换(通常是单位矩阵)与局部矩阵变换相乘.

class CObject
{
public:
 // Local transform functions
 Matrix4f GetLocalTransform() const;
 void SetPosition(const Vector3f& pos);
 void SetRotation(const Vector3f& rot);
 void SetScale(const Vector3f& scale);

    // Local transform
    Matrix4f m_local; 
    Vector3f m_localPostion;
    Vector3f m_localRotation; // rotation in degrees (xrot, yrot, zrot)
    Vector3f m_localScale;
}

Matrix4f CObject::GetLocalTransform()
{
    Matrix4f out(Matrix4f::IDENTITY);

    Matrix4f scale(), rotation(), translation();

    scale.SetScale(m_localScale);
    rotation.SetRotationDegrees(m_localRotation);
    translation.SetTranslation(m_localTranslation);

    out = scale * rotation * translation;
}
Run Code Online (Sandbox Code Playgroud)

我遇到的最大问题是

1)如何将物体定向为面向贝塞尔曲线的切线?

2)如何将该对象沿着曲线移动而不仅仅将对象位置设置为贝塞尔曲线上的点的位置?

下面是对功能的概述

void CNodeControllerPieceWise::AnimateNode(CObject* pSpatial, double deltaTime)
{
    // Get object latest pos.
    Vector3f posDelta = pSpatial->GetWorldTransform().GetTranslation();

    // Get postion on curve
    Vector3f pos = curve.GetPosition(m_t);

    // Get tangent of curve
    Vector3f tangent = curve.GetFirstDerivative(m_t);

}
Run Code Online (Sandbox Code Playgroud)

编辑:对不起它不是很清楚.多年来我一直在研究它,这让我的大脑变得糊里糊涂.

我希望物体附着在曲线上并面向曲线的方向.

至于运动,我想反对基于时间的曲线,这样它在整个曲线上创造平滑的运动.

And*_*rew 2

您应该有一条参数形式的曲线,并使用导数向量来评估对象的旋转(旋转角度 = 导数角度),如 @etarion 所说。

要以所需的速度在曲线上移动对象(我认为这是您想要的),每个模拟步骤您应该估计该点在该步骤中应移动的距离。

最简单的估计是dist = derivative.length()*TIMER_STEP。当您知道应该在当前步骤上遍历 dist 和t0 - 曲线的当前参数时,您可以简单地将 t0 增加一些小值epsilon,并检查遍历的距离是否仍然小于估计的距离。重复此操作,直到遍历距离(同时增加 t0) >= 估计值。这将是下一步的新当前参数 t0

编辑:

一开始没注意到你是在 3d 中。在 3D 空间中,即使您知道初始位置,也无法明确定义曲线上对象的位置。想象一下你的曲线是一条线——物体仍然可以绕着这条线旋转。该角度不是由曲线定义的。

我会做这样的事情。让我们将一个向量绑定到对象,以便在运动开始时(例如曲线参数 t = 0)对象向量方向与导数向量一致。那么在运动过程中,这个向量应该仍然与曲线上每个点的导数一致。所以你会知道这个对象向量,并且能够根据这个向量设置你的对象。但你仍然拥有一定程度的自由。

例如,您可以说对象不围绕该向量旋转。

知道对象矢量和围绕它的旋转角度,您可以恢复 3d 世界中的对象方向。

PS:这样的物体向量和围绕它的旋转角度称为四元数 - 因此您可以使用四元数数学(简单复制所需的公式)来计算物体旋转矩阵!这是公式http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToMatrix/index.htm