python中的3D旋转(半径逐渐减小)

时间:2013-06-03 19:38:03

标签: python stl 3d

我最近的任务是编写一个基于Python的应用程序,该应用程序生成一个STL文件(立体光刻文件格式 - 基本上是三角形列表)。我是python的新手,我试图避免使用过于复杂的库。我遇到的问题是在我创建的矢量类中进行3D旋转。

我在vector类中的旋转函数如下所示:

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)

您可能已经猜到,矢量类有一个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

就像临时黑客一样,我试着找到矢量的长度,将其标准化,旋转它,再次标准化,然后按原始尺寸缩小,这似乎有效,但它看起来很脏破解得到像这样简单的工作。

我的问题是:导致矢量长度缓慢下降的原因是什么?

编辑:我应该更清楚一点。向量类仅支持原点周围的旋转。

1 个答案:

答案 0 :(得分:4)

rotateY功能存在问题。您正在修改x,然后使用修改后的x来计算修改后的z。这导致你的螺旋式厄运。解决此问题的一种方法是将x存储在临时变量中,以便您可以从原始z计算修改后的x。这将保持你的规模。

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)