Выровняйте лицо к плоскости с NumPy - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть грань из 4 вершин XYZ.

Я хочу выровнять ее по оси Z, чтобы она была параллельна ей.

Если я вычислю нормали, то смогу вычислить угол между ними, но это только угол.Мне нужно вращение X и Y вращение.

Я использую numpy на Python 3.

Спасибо.

1 Ответ

0 голосов
/ 01 декабря 2018

Чтобы повернуть единичный вектор, скажем, к 1-ой оси, вы можете использовать QR decomp, например, так:

normal = np.random.random(3)
normal /= np.sqrt(normal@normal)
some_base = np.identity(3)
some_base[:, 0] = normal
Q, R = np.linalg.qr(some_base)
Q.T@normal
# array([-1.00000000e+00, -2.77555756e-17,  1.11022302e-16])

Как вы можете видеть, вам, возможно, придется перевернуть один или два столбца Q:

if (Q.T@normal)[0] < 0:
    if np.linalg.det(Q) < 0:
        rot = (Q * [-1, 1, 1]).T
    else:
        rot = (Q * [-1, -1, 1]).T
else:
    if np.linalg.det(Q) < 0:
        rot = (Q * [1, -1, 1]).T
    else:
        rot = Q.T
...