python中的三维旋转(缓慢减小半径)

python中的三维旋转(缓慢减小半径),python,stl,3d,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)''' se

我最近的任务是编写一个基于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)
正如您可能已经猜到的,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中所示):

如您所见,从原点到旋转向量的距离肯定会随着向量旋转次数的增加而减小。如图所示,每次旋转后打印出向量的长度也可以对此进行备份(初始向量设置为(50.0,0.0,0.0)的位置):

就像s的临时破解一样,我试着找到向量的长度,对它进行规格化,旋转,再次规格化,然后缩小到原来的大小,这似乎奏效了,但这似乎是一个非常肮脏的破解,让像这样简单的东西起作用

我的问题是:是什么导致向量的长度缓慢减小


编辑:我应该更清楚一点。vector类只支持围绕原点旋转。

你的
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)

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)

我知道潜在的浮点问题,但在做了50次旋转后丢失了几乎一半的向量长度似乎有点荒谬,所以我认为这并不完全与浮点有关。我知道潜在的浮点问题,但在做了50次旋转后丢失了几乎一半的向量长度似乎有点荒谬,所以我认为我sn不完全与浮点相关。没错,你在钱上是对的!打得好!我把它换成了一个临时变量,它就像一个符咒一样工作。非常感谢,你也很荣幸!没错,你在钱上是对的!打得好!我把它换成了一个临时变量,它就像一个符咒一样工作。非常感谢,非常感谢谢谢你!