c++ - 沿贝塞尔曲线的方向移动对象?

标签 c++ math 3d

我有一个对象,我想用它来遵循贝塞尔曲线,但现在有点迷茫,不知道如何让它根据时间而不是构成曲线的点来做到这一点。

.::当前系统::. 我的场景图中的每个对象都是由位置、旋转和缩放 vector 构成的。这些 vector 用于形成它们相应的矩阵:缩放、旋转和平移。然后按顺序相乘以形成局部变换矩阵。 然后将世界变换(通常是单位矩阵)与局部矩阵变换相乘。

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;
}

我的大问题是

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);

}

编辑: 抱歉,它不是很清楚。多年来我一直致力于此,它让我的大脑变得糊涂。

我想让物体附着在曲线上并面向曲线的方向。

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

最佳答案

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

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

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

编辑:

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

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

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

了解对象 vector 和围绕它旋转的角度,您可以恢复 3d 世界中的对象方向。

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

关于c++ - 沿贝塞尔曲线的方向移动对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4702418/

相关文章:

opengl - 如何获得fbx网格的正确位置?

ios - OpenGL ES 2.0缩放

c++ - 显式默认函数不能声明为 constexpr,因为隐式声明不是 constexpr

c++ - 可以将 C++ 单元测试集成到 Xcode 的 XCTest 中吗?

c# - 旋转方 block 的 6 个面

algorithm - 均匀分布列表中的所有项目

python - 从绘图 3d 图中抓取相机位置

c++ - 决定在 CMakeLists.txt 中写入什么——主要是在子文件夹中

c++ - 如何在 C++ 项目中制作宏解析器

algorithm - 给定一个数字 N 和一个数组 A。检查 N 是否可以表示为一个或多个数组元素的乘积