【问题标题】:Trying to deform any mesh into a sphere. How to translate the vertex position to lie on a sphere?试图将任何网格变形为球体。如何将顶点位置转换为位于球体上?
【发布时间】:2019-04-22 18:01:46
【问题描述】:

我正在尝试使用 maya API 为 maya 编写变形器脚本,该 API 通过平移顶点将任何网格变形为球体。

我已经拥有的是一个变形器,它可以将网格的每个顶点以指定的数量沿其法线方向平移。这是使用以下等式完成的。

point += normals[itGeo.index()] * bulgeAmount * w * env;

其中,point 是网格上的顶点。 normals[itGeo.index()] 是一个向量数组,表示每个顶点的法线。 w 和 env 用于控制变形和包络的权重。

这段代码的基本作用是,它以指定的量沿法线方向平移顶点。虽然这适用于球体,因为球体的顶点法线将指向中心。它不适用于其他网格,因为法线不会指向网格的中心。


    float bulgeAmount = data.inputValue(aBulgeAmount).asFloat();
    float env = data.inputValue(envelope).asFloat();
    MPoint point;
    float w;
    for (; !itGeo.isDone(); itGeo.next())
    {
        w = weightValue(data, geomIndex, itGeo.index());

        point = itGeo.position();

        point += normals[itGeo.index()] * bulgeAmount * w * env;

        itGeo.setPosition(point);
    }

我最初认为改变翻译方向可以解决问题。例如,如果我们能找到从网格中心到每个顶点的方向上的向量,并沿着该方向平移指定的量,就可以解决它。像这样:

point += (Center - point) * bulgeAmount * w * env;

其中,Center 是网格的中心。但这并没有给出预期的结果。我还希望以这样一种方式设置变形器,即用户可以输入半径“r”值,还可以将数量属性从 0 更改为 1,以将网格从其原始状态变形为球形。如果她的愿望和网格介于球体和原始形状之间,那么他可以在两者之间选择一个值。

这是我在 stackOverflow 中的第一篇文章。如果格式不符合社区的期望,我深表歉意。对此的任何帮助将不胜感激。

谢谢。

【问题讨论】:

    标签: c++ visual-studio maya maya-api


    【解决方案1】:

    关于方向:

    我认为你的台词: 点 += (中心点) * bulgeAmount * w * env;

    是一个很好的起点。 但是不要使用 (Center - point),您应该使用它的反义词 (point-Center) 并在使用之前对其进行规范化。如果你不使用这个(点-中心)向量的标准化版本,每个顶点都会被转换到错误的位置。

    关于 0.0(原始)到 1.0(球体)之间的变化:

    如果Po是原来的位置
    如果 Pf 是最终位置
    如果 d 是点 Po 到中心 C 之间的原始距离: d=norm(中心点)= norm(C-Po)
    如果Direction是(Center - point)/d(如此归一化,如上所述)

    我们想要什么:
    在 r=0.0 时,您的顶点必须保持在其原始位置:Pf = Center + Direction * d

    在 r=1.0 时,您的顶点必须附着在半径为 R 的球体上:Pf = 中心 + 方向 * R

    如果我们概括:

    Pf = C + 方向 * ( r*R + (1-r)*d )

    当 d = norm(C-Po)
    方向 = (C-Po)/d
    R 你的球体半径
    和 [0.0; 之间的用户参数; 1.0]

    不确定我是否足够清楚,我不习惯在这里回答:) 最好的

    【讨论】:

    • 感谢您的回复。您告诉在答案的第一部分使用 (point-center) 而不是 (center-point) 。但是,您告诉使用 (center - point) 来获取方向。这只是一个错字吗?还是故意的?如果是,为什么我们必须使用 (center-point) 而不是 (point-center)?
    • 是的,你是对的,我这边的错字。方向是来自 (Point-Center) 的规范向量。这个向量必须从中心到点。快速检查这个方向是 Center + (Point-Center) = Point。
    • 另一种思考方式是,您正在获取从中心到点的向量,即 (point - center)。如果将其标准化,那将成为行进方向;归一化向量 * 半径是球体表面上的点。您可以通过在径向位置和原始位置之间调整(这将使所有点同时到达)或通过沿该向量钳制固定步长平移来转换您的点(这会使某些点比其他点更早停止)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-17
    • 1970-01-01
    • 2020-02-17
    • 1970-01-01
    相关资源
    最近更新 更多