我正在尝试使用maya API编写maya的变形脚本,该API通过转换顶点将任何网格变形为球体。
我已经拥有的变形器可以按指定的数量沿其法线方向平移网格的每个顶点。使用以下等式完成此操作。
point += normals[itGeo.index()] * bulgeAmount * w * env;
其中,点是网格上的顶点。 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;
其中,“中心”是网格的中心。但这并不能达到预期的效果。我还希望设置变形器,以便用户可以输入半径“ r”值,还可以将数量属性从0更改为1,以将网格从其原始状态变形为球形。这样,如果她的愿望和网眼介于球体和原始形状之间,他就可以在两者之间选择一个值。
这是我在stackOverflow中的第一篇文章。如果格式不符合社群的期望,我深表歉意。任何帮助,将不胜感激。
谢谢。
答案 0 :(得分:1)
关于方向:
我认为您的电话: 点+ =(中心-点)* bulgeAmount * w * env;
是一个很好的起点。 但是,除了使用(Center-point)之外,还应该使用其相反的(point-Center)并对其进行规范化。如果您不使用此(点中心)向量的规范化版本,则每个顶点都会平移到错误的位置。
关于您在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]
不确定我是否足够清楚,我也不习惯在这里回答:) 最好