源码分析学习记录(7)——插值技术

本文探讨了3D建模中用于平滑曲线的插值技术,包括Hermite、Catmull-Rom、Bezier和B-Spline曲线。通过分析各种插值方法的特性,如Hermite利用端点位置和切矢量,Catmull-Rom通过相邻点构造切线,Bezier曲线的线性插值,以及B-Spline作为Bezier曲线的延伸,提供更灵活的曲线控制。
摘要由CSDN通过智能技术生成

2021SC@SDUSC

Dust3D模型网格建立的基础是插值。

插值技术,就是已知一些离散点,插值出一些新的点,使得所有点形成一条平滑曲线。这一概念在我们使用Photoshop的钢笔工具以及Maya中曲线工具时可以得到深切的体会。常用的曲线插值算法有Hermite、Catmull—Rom、Bezier、B—Spline等,其中Dust3D使用到的有Hermite曲线以及Catmull—Rom曲线。

Hermite

对于三次多项式曲线,常用四个几何条件进行描述。

  • 两端点的位置 P0= P(0) 和 P1= P(1)
  • 两端点的切矢量 P’0= P’(0) 和 P’1= P’(1)

[0,1]区间上的三次Hermite基函数为:

其中

void HermiteCurveInterpolation::update()
{
   
    std::vector<std::pair<size_t, QVector2D>> keyNodes;
    for (size_t nodeIndex = 0; nodeIndex < m_nodes.size(); ++nodeIndex) {
   
        auto findPerpendicularDirections = m_perpendicularDirectionsPerNode.find(nodeIndex);
        if (findPerpendicularDirections == m_perpendicularDirectionsPerNode.end())
            continue;
        QVector2D perpendicularDirection;
        for (const auto &it: findPerpendicularDirections->second)
            perpendicularDirection += it;
        perpendicularDirection.normalize();
        QVector3D direction3 = QVector3D(perpendicularDirection.x(), perpendicularDirection.y(), 0.0);
        QVector3D tangent3 = QVector3D::crossProduct(direction3, QVector3D(0, 0, 1.0));
        keyNodes.push_back({
   nodeIndex, QVector2D(tangent3.x(), tangent3.y())});
    }
    
    m_updatedPositions = m_nodes;
    for (size_t keyIndex = 1; keyIndex < keyNodes.size(); ++keyIndex) {
   
        const auto &firstKey = keyNodes[keyIndex - 1];
        const auto &secondKey = keyNodes[keyIndex];
        double distance = 0;
        for (size_t nodeIndex = firstKey.first + 1; nodeIndex 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值