2013-06-03 30 views
2

我最近接到了編寫一個基於Python的應用程序的任務,該應用程序生成STL文件(立體平版印刷文件格式 - 基本上是三角形列表)。我是python新手,我試圖避免使用過於複雜的庫。我遇到的問題是在我創建的矢量類中使用3D旋轉。在矢量類蟒蛇中的3D旋轉(緩慢減少的半徑)

我的旋轉功能如下所示:

def rotateY(self, amount): 
    '''Rotates a vertex on the Y axis around the origin by a given amount (in radians)'''  
    self.x = self.x * math.cos(amount) + self.z * math.sin(amount) 
    self.y = self.y 
    self.z = self.x * (-math.sin(amount)) + self.z * math.cos(amount) 

正如你可能已經猜到了,Vector類具有x,y和z分量。據我所知,我對3D轉換和數學非常熟悉,代碼看起來是正確的。爲了簡單起見,我寧願不必拉入其他矩陣庫。

的問題出現了,當我試圖做這樣的事情:

v = vector(50.0, 0.0, 0.0) 
rotationAmount = math.radians(10.0) 
for i in range(0, 36): 
    v.rotateY(rotationAmount) 
    #Draw something at (v.x, v.y, v.z), 
    #...or in my case, create a list of triangles to export to an STL file 

正如我繞Y軸旋轉,旋轉從原點到該點的距離緩慢下降。這裏有一個例子,在那裏我創建在每次旋轉後的矢量的位置的3D球體,和出口這一切爲STL(如在Maya中顯示): As seen in Maya

正如你可以看到,從距離被旋轉的矢量的原點肯定會減少該矢量旋轉的次數。這也由每次旋轉後打印出的矢量的長度備份,如圖所示(初始向量設置爲(50.0,0.0,0.0)的位置處:

Length decreases the more the vector is rotated

正如暫時的我試圖找到矢量的長度,對它進行標準化,旋轉,再次標準化,然後縮小原始大小,這似乎起了作用,但它看起來像一個非常骯髒的黑客,讓事情一樣簡單這工作

我的問題是:什麼導致載體的長度緩慢下降?

編輯:我應該更清楚一點。矢量類只支持原點周圍的旋轉。

+0

我知道潛在的浮點問題,但在做50次旋轉後損失幾乎一半的矢量長度似乎有點荒謬,所以我認爲這不是完全浮點相關。 –

回答

4

rotateY函數存在一個問題。您正在修改x,然後使用修改後的x來計算修改後的z。這會導致你的螺旋式厄運。解決這個問題的一個方法是將你的x存儲在一個臨時變量中,這樣你就可以從原始的x中計算出修改的z。這將保持你的規模。

def rotateY(self, amount): 
    '''Rotates a vertex on the Y axis around the origin by a given amount (in radians)''' 
    temp_x = self.x 
    self.x = self.x * math.cos(amount) + self.z * math.sin(amount) 
    self.z = temp_x * (-math.sin(amount)) + self.z * math.cos(amount) 
+0

果然,你是對的錢!好決定!我將它切換爲使用臨時變量,並且它像魅力一樣工作。非常感謝,並讚揚你! –