我最近的任务是编写一个基于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中所示):
正如您所看到的,从旋转原点到旋转矢量的距离肯定会减少旋转矢量的次数。通过在每次旋转后打印出矢量的长度来支持这一点,如图所示(初始矢量设置为(50.0,0.0,0.0)的位置:
就像临时黑客一样,我试着找到矢量的长度,将其标准化,旋转它,再次标准化,然后按原始尺寸缩小,这似乎有效,但它看起来很脏破解得到像这样简单的工作。
我的问题是:导致矢量长度缓慢下降的原因是什么?
编辑:我应该更清楚一点。向量类仅支持原点周围的旋转。答案 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)