что считать начальной точкой линии? стартовую точку или точку ближе к 0,0,0 координат? в любом случае это наипростейший скрипт, который вам наверно даже Алиса накалякает) на максскрипте не пишу, но вот вам первый же ответ
fn setPivotToFirstKnot obj = ( if classOf obj == splineShape do ( local numSplines = numSplines obj if numSplines > 0 do ( local firstSpline = 1 local firstKnot = 1 local firstPos = getKnotPoint obj firstSpline firstKnot obj.pivot = firstPos ) ))for obj in selection do setPivotToFirstKnot obj
for obj in selection do (p1 = getKnotPoint obj 1 1; obj.pivot = p1)
Вроде работает
работает!!! вот что значит опыт, одной нейронки мало)))
Надо знать как у нее попросить ))
это верно. но чтобы знать, надо хоть немножко уже разбираться) Ну и я вкинул видимо не в ту нейронку, на про тарифе она была умнее)) но все равно в одну строчку ни одна нейронка никогда не напишет) Лучший по портянкам наверно дипсик)
( local sel = selection as array if sel.count > 0 then ( for obj in sel where (canConvertTo obj SplineShape) do ( -- 1. Convert to Spline if necessary if classOf obj != SplineShape and classOf obj != Line do (convertToSplineShape obj) -- 2. Get position and tangent at start (0.0) local p1 = interpCurve3D obj 1 0.0 local vX = normalize (tangentCurve3D obj 1 0.0) -- 3. Build orientation vectors local vUp = [0,0,1] if (abs (dot vX vUp)) > 0.99 do vUp = [0,1,0] local vY = normalize (cross vUp vX) local vZ = normalize (cross vX vY) -- 4. Store current visual state local oldObjTM = obj.objecttransform local targetRotTM = matrix3 vX vY vZ p1 -- 5. Apply transformation to the pivot obj.transform = targetRotTM -- 6. Offset the geometry back to original world position local invRot = inverse targetRotTM.rotation obj.objectoffsetpos = (oldObjTM.translation - p1) * invRot obj.objectoffsetrot = oldObjTM.rotation * invRot ) format "Done: Processed % objects.\n" sel.count ) else (messageBox "Select at least one Spline object."))
Вот так получилось с поворотом , вроде тоже работает
( local sel = selection as array if sel.count > 0 then ( for obj in sel where (canConvertTo obj SplineShape) do ( -- 1. Convert to Spline if necessary if classOf obj != SplineShape and classOf obj != Line do (convertToSplineShape obj) -- 2. Get position and tangent at start (0.0) local p1 = interpCurve3D obj 1 0.0 local vX = normalize (tangentCurve3D obj 1 0.0) -- 3. Build orientation vectors local vUp = [0,0,1] if (abs (dot vX vUp)) > 0.99 do vUp = [0,1,0] local vY = normalize (cross vUp vX) local vZ = normalize (cross vX vY) -- 4. Store current visual state local oldObjTM = obj.objecttransform local targetRotTM = matrix3 vX vY vZ p1 -- 5. Apply transformation to the pivot obj.transform = targetRotTM -- 6. Offset the geometry back to original world position local invRot = inverse targetRotTM.rotation obj.objectoffsetpos = (oldObjTM.translation - p1) * invRot obj.objectoffsetrot = oldObjTM.rotation * invRot ) format "Done: Processed % objects.\n" sel.count ) else (messageBox "Select at least one Spline object."))
Вот так получилось с поворотом , вроде тоже работает
видите как кардинально можно все изменить, узнав всего одно свойство. однако в данном коде много мусора.
local sel = selection as array, if sel.count, classOf obj, конвертацию можно убрать вообще из цикла либо вынести отдельно (если оставили то if not isKindOf obj SplineShape do) и незачем конвертировать еще и Line. зачем использовать interpCurve3D, когда мы и так знаем где у нас первая точка (getKnotPoint obj 1 1)? позиционирование можно сделать более универсально и элегантно.