首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Catmull-Rom中添加α

在Catmull-Rom中添加α
EN

Stack Overflow用户
提问于 2018-06-13 07:27:19
回答 1查看 0关注 0票数 0

我正试图从一个统一点列表中生成一个Catmull-Rom曲线.由于我不想存储点之间的曲线,我选择使用一个解决方案,可以计算一个位置在Catmull-Rom曲线上的时间。

我想要实现alpha的原因是,我能够在向心、弦和均匀Catmull-Rom曲线之间进行转换。

代码语言:txt
复制
private Vector3 GetCatmullRomPosition(float t, Vector3 p0, Vector3 p1,
                                      Vector3 p2, Vector3 p3, float alpha)
{
    Vector3 a = 2f * p1;
    Vector3 b = p2 - p0;
    Vector3 c = 2f * p0 - 5f * p1 + 4f * p2 - p3;
    Vector3 d = -p0 + 3f * p1 - 3f * p2 + p3;
    return 0.5f * (a + (b * t) + (c * t * t) + (d * t * t * t));
}
EN

回答 1

Stack Overflow用户

发布于 2018-06-13 16:31:23

在我最初的问题中发布的代码是计算均匀Catmull-Rom样条中点的一种很好的方法,但是它不考虑alpha因素。因此,它不能用于弦,或向心,(或之间的任何东西)Catmull-Rom样条。下面的代码确实考虑到alpha,因此支持弦和向心Catmull-Rom样条。

不需要再多说,这里是移植到C#for United的代码。

代码语言:txt
复制
private Vector3 GetCatmullRomPosition(float t, Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3, float alpha = 0.5f)
{
    float dt0 = GetTime(p0, p1, alpha);
    float dt1 = GetTime(p1, p2, alpha);
    float dt2 = GetTime(p2, p3, alpha);

    Vector3 t1 = ((p1 - p0) / dt0) - ((p2 - p0) / (dt0 + dt1)) + ((p2 - p1) / dt1);
    Vector3 t2 = ((p2 - p1) / dt1) - ((p3 - p1) / (dt1 + dt2)) + ((p3 - p2) / dt2);

    t1 *= dt1;
    t2 *= dt1;

    Vector3 c0 = p1;
    Vector3 c1 = t1;
    Vector3 c2 = (3 * p2) - (3 * p1) - (2 * t1) - t2;
    Vector3 c3 = (2 * p1) - (2 * p2) + t1 + t2;
    Vector3 pos = CalculatePosition(t, c0, c1, c2, c3);

    return pos;
}

private float GetTime(Vector3 p0, Vector3 p1, float alpha)
{
    return Mathf.Pow((p1 - p0).sqrMagnitude, 0.5f * alpha);
}

private Vector3 CalculatePosition(float t, Vector3 c0, Vector3 c1, Vector3 c2, Vector3 c3)
{
    float t2 = t * t;
    float t3 = t2 * t;
    return c0 + c1 * t + c2 * t2 + c3 * t3;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100008671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档