2013-02-22 3 views
4

행렬에 대한 지식이 거의 없기 때문에 매트릭스 배열에서 읽을 수있는 형식으로 변환 할 수있는 도우미 메서드를 찾고있었습니다. 판독 포맷3D 형식을 읽을 수있는 형식으로 변환

는 말은 : 매트릭스 형식

{ 
    translate : 
    { 
     x : 0, 
     y : 0, 
     z : 0 
    }, 

    rotation : 
    { 
     x : 0, 
     y : 90, 
     z : 0 
    }, 

    skew : 
    { 
     x : 0, 
     y : 0 
    }, 

    scale : 
    { 
     x : 0, 
     y : 0, 
     z : 0 
    } 
} 

는 말 : matrix3d(0.00000000000000006123233995736766, 0, -1, 0, 0, 1, 0, 0, 1, 0, 0.00000000000000006123233995736766, 0, 0, 0, 0, 1).

그런 방법으로 Google을 통해 찾고 있었지만 찾을 수없는 것 같습니다.

그런 방법이 있습니까, 또는 어떻게 사용 가능한 축마다 각 변형 유형을 디핑/계산할 수 있습니까?

업데이트 : 내 친구가 http://web.iitd.ac.in/~hegde/cad/lecture/L6_3dtrans.pdf을 (를) 발견 했으므로 적어도 뭔가 검색하려고합니다.

+0

이 기사는 matrix3D https://developer.mozilla.org/en-US/docs/CSS/transform-function에 대한 매우 유용한 설명입니다.이 지식을 사용하여 변환을 작성하는 데는 많은 노력이 필요하지만 수단. 기울이기, 회전 등이 수행되는 순서는 중요합니다. 즉, 뒤틀기가 뒤 따르는 회전이 기울기 뒤의 회전과 반드시 ​​같지는 않습니다. 따라서 읽을 수있는 행렬의 버전을 만들어야합니다. 어떤 변환이 수행 될 것으로 예상되는지에 대한 몇 가지 명시적인 가정 – wheresrhys

+0

흠,하지만 기울임과 회전에 적용됩니까? 그렇다면, 방법은 스큐 및 회전의 순서를 선택하기위한 파라미터를 수용 할 수있는 방식으로 구성 될 수있다. – jolt

+0

그럴 수도 있습니다, 그냥 무언가를 고려할 것입니다 – wheresrhys

답변

1

매트릭스를 원래의 변환으로 분해하는 것은 쉽지 않습니다. 나는 scale*rotate*translate 매트릭스를 분해 할 수 있었다.

function extract(m) { // supports only scale*rotate*translate matrix 
    var radians = Math.PI/180 

    var sX = Math.sqrt(m[0]*m[0] + m[1]*m[1] + m[2]*m[2]), 
     sY = Math.sqrt(m[4]*m[4] + m[5]*m[5] + m[6]*m[6]), 
     sZ = Math.sqrt(m[8]*m[8] + m[9]*m[9] + m[10]*m[10]) 

    var rX = Math.atan2(-m[9]/sZ, m[10]/sZ)/radians, 
     rY = Math.asin(m[8]/sZ)/radians, 
     rZ = Math.atan2(-m[4]/sY, m[0]/sX)/radians 

    if (m[4] === 1 || m[4] === -1) { 
     rX = 0 
     rY = m[4] * -Math.PI/2 
     rZ = m[4] * Math.atan2(m[6]/sY, m[5]/sY)/radians 
    } 

    var tX = m[12]/sX, 
     tY = m[13]/sX, 
     tZ = m[14]/sX 

    return { 
     translate: [tX, tY, tZ], 
     rotate: [rX, rY, rZ], 
     scale: [sX, sY, sZ] 
    } 
} 

그러나 다른 변환 순서에서는 실패합니다.

+0

어떻게 기울기를 돌려 줄 수 있습니까? – thednp

+0

이 코드는 정의되지 않은 변수로 '라디안'을 갖습니다. 공식은 무엇입니까? – thednp

+0

'radians' 변수가 추가되었습니다. https://github.com/michaelvillar/dynamics.js/blob/master/src/dynamics.coffee#L766-L920도 살펴볼 수 있습니다. 더 진보 된 분해 방법을 가지고 있습니다 –

관련 문제