gpt4 book ai didi

matrix - python : Transformation Matrix

转载 作者:行者123 更新时间:2023-12-04 04:09:30 26 4
gpt4 key购买 nike

这是共同计算平移和旋转的正确方法,还是有更好的方法?目前我的代码先翻译然后旋转,这会造成问题吗?

代码

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

输出
root@ubuntu:~$ python rotate.py 
[-0.707106781186547, 12.0, 15.606601717798213]

最佳答案

好吧,你的矩阵函数很好,我让它工作了,但对于输出,我使用了这个:

#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 中旋转。
希望这有助于欢呼芽。

关于matrix - python : Transformation Matrix,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14926798/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com