C++ 尝试将任何网格变形为球体。如何将顶点位置平移到球体上?

C++ 尝试将任何网格变形为球体。如何将顶点位置平移到球体上?,c++,visual-studio,maya,maya-api,C++,Visual Studio,Maya,Maya Api,我正在尝试使用maya API为maya编写变形器脚本,该API通过平移网格的顶点将网格变形为球体 我已经有了一个变形器,它可以按照指定的量在网格法线方向上平移网格的每个顶点。这是使用下面的方程式完成的 point += normals[itGeo.index()] * bulgeAmount * w * env; 其中,点是网格上的顶点。法线[itGeo.index()]是表示每个顶点法线的向量数组。w和env用于控制变形和封套的权重 这段代码的基本功能是,按照指定的量沿法线方向平移顶点。而

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

我已经有了一个变形器,它可以按照指定的量在网格法线方向上平移网格的每个顶点。这是使用下面的方程式完成的

point += normals[itGeo.index()] * bulgeAmount * w * env;
其中,点是网格上的顶点。法线[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;
其中,“中心”是网格的中心。但这并没有达到预期的效果。我还希望变形器的设置方式能够确保用户可以输入半径“r”值,还可以将“数量”属性从0更改为1,以将网格从原始状态变形为球形。这样他就可以选择一个值,如果她想要的话,网格是介于球体和原始形状之间的

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

谢谢。

关于方向:

我想你的台词是: 点+=(中心点)*凸出量*w*env

这是一个很好的起点。 但是你不应该使用(中心点),而是应该使用它的对立面(点中心),并在使用之前对其进行规格化。如果不使用此(点中心)向量的规范化版本,则每个顶点都将转换到错误的位置

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

如果Po是原始位置
如果Pf是最终位置
如果d是点Po和中心C之间的原始距离: d=标准(中心点)=标准(C-Po)
如果方向是(中心点)/d(如此规范化,如上所述)

我们想要的:
r=0.0时,顶点必须保持在其原始位置:Pf=中心+方向*d

在r=1.0时,顶点必须与半径为r:Pf=中心+方向*r的球体相连

如果我们概括一下:

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

d=标准(C-Po)
方向=(C-Po)/d
R球体的半径
r是介于[0.0;1.0]之间的用户参数

我不太清楚,我也不习惯在这里回答:)
非常感谢您的回复。在答案的第一部分,你告诉我使用(点-中心)而不是(中心点)。但是,你告诉我们使用(中心点)来获得方向。这只是打字错误吗?还是故意的?如果是,为什么我们必须使用(中心点)而不是(中心点)?是的,你是对的,我这边的打字错误。方向是(点中心)的赋范向量。这个向量必须从中心到点。快速检查这个方向是,中心+(点中心)=点。另一种方法是,你得到了从中心到点的向量,也就是(点-中心)。如果你把它标准化,那就成了旅行的方向;归一化向量*半径是球体表面上的点。您可以通过在径向位置和原始位置之间平移来变换点(这将使所有点同时到达),或者通过沿该向量夹紧固定步长平移(这将使某些点比其他点更早停止)来变换点