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)
![](https://i-blog.csdnimg.cn/blog_migrate/1f26aa313ab1622cc825467f667ae0e2.png)
[0,1]区间上的三次Hermite基函数为:
其中
![](https://i-blog.csdnimg.cn/blog_migrate/59f0bdbcaf07f80a1ac2bbed72714380.png)
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