2013-02-17 208 views
2

這是共同計算翻譯和旋轉的正確方法,還是有更好的方法?目前我的代碼翻譯,然後旋轉,可能會造成問題?Python:轉換矩陣

代碼

from math import cos, sin, radians 

def trig(angle): 
    r = radians(angle) 
    return cos(r), sin(r) 

def matrix(rotation=(0,0,0), translation=(0,0,0)): 
    xC, xS = trig(rotation[0]) 
    yC, yS = trig(rotation[1]) 
    zC, zS = trig(rotation[2]) 
    dX = translation[0] 
    dY = translation[1] 
    dZ = translation[2] 
    return [[yC*xC, -zC*xS+zS*yS*xC, zS*xS+zC*yS*xC, dX], 
    [yC*xS, zC*xC+zS*yS*xS, -zS*xC+zC*yS*xS, dY], 
    [-yS, zS*yC, zC*yC, dZ], 
    [0, 0, 0, 1]] 

def transform(point=(0,0,0), vector=(0,0,0)): 
    p = [0,0,0] 
    for r in range(3): 
    p[r] += vector[r][3] 
    for c in range(3): 
     p[r] += point[c] * vector[r][c] 
    return p 

if __name__ == '__main__': 
    point = (7, 12, 8) 
    rotation = (0, -45, 0) 
    translation = (0, 0, 5) 
    matrix = matrix(rotation, translation) 
    print (transform(point, matrix)) 

輸出

[email protected]:~$ python rotate.py 
[-0.707106781186547, 12.0, 15.606601717798213] 

回答

-2

,而不是matrizes你可以使用四元數作爲替代嘛。它非常受歡迎,因爲萬向節鎖定問題不是真正的問題,並且與matrizes相比,您可以節省更少的內存。儘管如此,取決於你想做什麼,它可能在操作上更重。

除此之外,我會說這是一個好方法和一個正確的。有很多方法可以做到這一點,我認爲有很多正確的答案...

記住你的轉換過程的順序是非常重要的,改變順序可能會產生不同的結果。

0

以及你的矩陣功能是好的我懂了工作,但對輸出我用這個:

#def transform(point, vector): 
# p = [0,0,0] 
# for r in range(0,3): 
# p[r] += vector[r][3] 
# print p 
# for c in range(3): 
#  p[r] += point[c] * vector[r][c] 
# return p 

def transform(point, TransformArray): 
    p = np.array([0,0,0,1]) 
    for i in range (0,len(point)-1): 
     p[i] = point[i] 
    p=np.dot(TransformArray,np.transpose(p)) 
    for i in range (0,len(point)-1): 
     point[i]=p[i] 
    return point 

其背後的理論,如果不是進行手動更改讓矩陣排序出來。在這裏你可以找到的文獻,以便更好地理解我所做的:http://www.inf.ed.ac.uk/teaching/courses/cg/lectures/cg3_2013.pdf

是的,你執行你的矩陣功能的方式定義你執行你的變換順序的方式。有3個主要轉變:縮放,翻譯和旋轉。更多關於我發送的鏈接。

雖然矩陣功能工作,似乎你有錯換,現在我現在就可以跟着你的任何矩陣指數的,所以我重寫了它本身的X和Z旋轉:

def matrix(rotation, translation): 
    xC, xS = trig(rotation[0]) 
    yC, yS = trig(rotation[1]) 
    zC, zS = trig(rotation[2]) 
    dX = translation[0] 
    dY = translation[1] 
    dZ = translation[2] 
    Translate_matrix = np.array([[1, 0, 0, dX], 
           [0, 1, 0, dY], 
           [0, 0, 1, dZ], 
           [0, 0, 0, 1]]) 
    Rotate_X_matrix = np.array([[1, 0, 0, 0], 
           [0, xC, -xS, 0], 
           [0, xS, xC, 0], 
           [0, 0, 0, 1]]) 
    Rotate_Y_matrix = np.array([[yC, 0, yS, 0], 
           [0, 1, 0, 0], 
           [-yS, 0, yC, 0], 
           [0, 0, 0, 1]]) 
    Rotate_Z_matrix = np.array([[zC, -zS, 0, 0], 
           [zS, zC, 0, 0], 
           [0, 0, 1, 0], 
           [0, 0, 0, 1]]) 
    return np.dot(Rotate_Z_matrix,np.dot(Rotate_Y_matrix,np.dot(Rotate_X_matrix,Translate_matrix))) 

正如你所看到的序列在我的迴歸轉換將改變輸出:因爲最後是翻譯,它將首先翻譯點,然後旋轉X,然後旋轉Y和最後在Z. 希望這可以幫助歡呼芽。