- Рейтинг
- 7
Здравствуйте! Есть два одинаковых объекта, повернутых относительно друг друга. К ним применен resetXform(пример в файле temp1.zip) Как совместить произвольно повернутый объект с оригиналом?
Нашел в нете способ, немного подредактировал (алгоритм, примерно такой - применяем для повернутого объекта что-то вроде Normal Align, затем поворачиваем его на нужный угол в плоскости полигона):
но способ не точный получился, чем дальше от совмещаемых треугольников, тем больше разброс (1.jpg) Собственно визуально, кажется простая задача. Надо просто выставить объект по трем точкам. Как это сделать?) Подскажите, пожалуйста!
Нашел в нете способ, немного подредактировал (алгоритм, примерно такой - применяем для повернутого объекта что-то вроде Normal Align, затем поворачиваем его на нужный угол в плоскости полигона):
Код:
(
fn angle2Vec v1 v2 = acos (dot (normalize v1) (normalize v2))
fn RotatePivotOnly obj index=
(
rot = (matrixFromNormal (getFaceNormal obj index)*obj.transform ) as quat
rotValInv=inverse rot
animate off in coordsys local obj.rotation*=RotValInv
obj.objectoffsetrot*=RotValInv
obj.objectoffsetpos*=RotValInv
)
f = 1
mainObj = $MainObj
tempObj = $TempObj
faceNormM = getFaceNormal mainObj f
faceNormT = getFaceNormal tempObj f
faceCentM = meshop.getFaceCenter mainObj f
faceCentT = meshop.getFaceCenter tempObj f
tempObj.pivot = faceCentT
ResetXForm tempObj
convertToMesh tempObj
mainObj.pivot = faceCentM
ResetXForm mainObj
convertToMesh mainObj
RotatePivotOnly tempObj f
RotatePivotOnly mainObj f
tempObj.transform = matrixFromNormal faceNormM
tempObj.pos = faceCentM
vecVertT = getVert tempObj ((meshop.getVertsUsingFace tempObj f) as array)[1]
vecVertM = getVert mainObj ((meshop.getVertsUsingFace mainObj f) as array)[1]
faceNormM = getFaceNormal mainObj f
faceNormT = getFaceNormal tempObj f
faceCentM = meshop.getFaceCenter mainObj f
faceCentT = meshop.getFaceCenter tempObj f
theCrossV = cross (normalize (vecVertT - faceCentT)) faceNormT -- nujno dlya korrektirovki napravleniya vrasheniya
ug = angle2Vec (vecVertT - faceCentT) (vecVertM - faceCentM)
ugKorYZ = if (dot theCrossV faceNormT) >= 0 then ug else -ug
tempObj.transform = rotateZmatrix ugKorYZ*tempObj.transform
)
Вложения
-
650 КБ Просмотров: 345
-
41,8 КБ Просмотров: 383