(重写、压缩和部分更正版本)
我尝试在3d中对三角形进行一些简单的旋转,以使其法线笔直地指向上,而不产生任何扭曲。我正在关注这篇文章calculate-rotation-matrix-to-align-vector,但由于某些原因,我的结果是不受欢迎的,我看不到代码中的错误或推理中的错误。我的Python代码如下所示:
# defining the triangle with three points in 3d space (xyz)
v1 = [1,1,1]
v2 = [2,2,2]
v3 = [2,1,3]
# calculating the normal and converting to unit-vector
n = np.cross( np.subtract(v2,v1), np.subtract(v3,v1) )
a = n / np.sqrt( n[0]**2 + n[1]**2 + n[2]**2 )
b = [0,1,0]
v = np.cross(a,b)
s = np.sqrt(v.dot(v))
c = np.dot(a,b)
Vx = np.array([
[ 0 , -v[2], v[1] ],
[ v[2], 0 , -v[0]],
[-v[1], v[0], 0 ]
])
Vx2 = Vx.dot(Vx)
I = np.identity(3)
iv = (1/(1+c))
# single rotation matrix
R = np.add(I, np.add(Vx, np.multiply(Vx2,iv)))
然后计算质心、旋转矩阵(如所述)以及分离矩阵(如此处所述)Rotating a Vector in 3D Space
cx = (v1[0]+v2[0]+v3[0]) / 3.0
cy = (v1[1]+v2[1]+v3[1]) / 3.0
cz = (v1[2]+v2[2]+v3[2]) / 3.0
v1t = [v1[0]-cx,v1[1]-cy,v1[2]-cz]
v2t = [v2[0]-cx,v2[1]-cy,v2[2]-cz]
v3t = [v3[0]-cx,v3[1]-cy,v3[2]-cz]
以及单个旋转矩阵:
rz = np.array([
[c,-s, 0],
[s, c, 0],
[0, 0, 1]
])
ry = np.array([
[ c, 0, s],
[ 0, 1, 0],
[-s, 0, c]
])
rx = np.array([
[1, 0, 0],
[0, c,-s],
[0, s, c]
])
rxyz = rx.dot(ry).dot(rz)
现在我使用R和rxyz应用旋转:
p1 = R.dot(v1t)
p2 = R.dot(v2t)
p3 = R.dot(v3t)
p4 = rxyz.dot(v1t)
p5 = rxyz.dot(v2t)
p6 = rxyz.dot(v3t)
现在的结果比第一种方法好,p1和p3的Y正确相同,但p2仍然错误。而且似乎仍然存在一种扭曲
P1-3(红色)
P4-6(蓝色)
浅灰色三角形是转换为0,0,0的原始三角形,红色和蓝色是旋转的三角形
目前没有回答
相关问题 更多 >
编程相关推荐