Как выровнять ось с полигоном нормально? - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь точно вращать оси одних и тех же объектов для их дальнейшего преобразования в экземпляры.Для этого я использую первые полигональные нормали и перемещаю ось к центру объекта.Тем не менее, это работает только на простых объектах и ​​почти всегда результат отличается.Если я использую стандартные инструменты Cinema 4D ( Центр оси / Выравнивание / Нормальный ), то оси поворачиваются, как и должно быть.Помогите пожалуйста понять где я был не прав.

import c4d
from c4d import utils, Vector

def Normal(obj):
    polygon       = obj.GetPolygon(0)
    points        = obj.GetAllPoints()
    nbPolys       = obj.GetPolygonCount()

    normal = (points[polygon.a] - points[polygon.c]).Cross(points[polygon.b] - points[polygon.d])
    normal.Normalize()
    return normal

def MoveAxis(obj):
    mg            = obj.GetMg()
    points        = obj.GetAllPoints()
    p_count       = obj.GetPointCount()

    if obj.GetUp() is None: n = obj.GetMg().off
    else: n = Vector(0)
    print obj.GetName(), 'Has Size :   ', obj.GetRad()

    obj.SetRelRot(utils.VectorToHPB(Normal(obj)))
    obj.SetRelPos(obj.GetMp()+n)
    new_mg        = obj.GetMg()

    for point in xrange(p_count):
        obj.SetPoint(point,~new_mg*mg*points[point])
    obj.Message(c4d.MSG_UPDATE)

def main():
    objlist = doc.GetActiveObjects(True)
    doc.StartUndo()

    for obj in objlist:
        doc.AddUndo(c4d.UNDOTYPE_CHANGE, obj)
        MoveAxis(obj)

    doc.EndUndo()
    c4d.EventAdd()
if __name__=='__main__':
    main()
...