三角形旋转,结果不理想

2024-10-01 07:38:28 发布

您现在位置:Python中文网/ 问答频道 /正文

(重写、压缩和部分更正版本)

我尝试在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(红色)

  1. [-0.20673470096224283,1.1102230246251565e-16,-1.2299659828522118]
  2. [-0.5865305980755144,-3.885780586188048e-16,0.4599319657042385]
  3. [0.7932652990377571,1.1102230246251565e-16,0.770034017147788]

P4-6(蓝色)

  1. [-1.1482080390363765,0.30059830961195716,-0.383163817323908083]
  2. [0.3040075530555323,-0.6336677067539932,-0.2481938771563051]
  3. [0.8442004859808443,0.3330693971420361,0.6313576944802128]

rotation result

浅灰色三角形是转换为0,0,0的原始三角形,红色和蓝色是旋转的三角形


Tags: 错误np矩阵czv3arraydotv2