Форум сайта python.su
Уже пробовал и через углы Эйлера и через матрицу поворота. Код работает только при повороте по одной оси. При повороте по трем осям изображение не деформируется, но ось поворота явно не совпадает с осью изображения. Вопрос в том, что я упускаю?
Особенно это заметно, если менять порядок поворотов вокруг осей: ось вращения начинает совпадать с осью фигуры, но при этом перескакивает на ощутимый угол.
Прикрепляю файл с рабочим кодом.
def rotate_object(xs, xe, ys, ye, zs, ze, ax, ay, az, rot_axis ): axcos = math.cos(math.radians(ax)) axsin = math.sin(math.radians(ax)) aycos = math.cos(math.radians(ay)) aysin = math.sin(math.radians(ay)) azcos = math.cos(math.radians(az)) azsin = math.sin(math.radians(az)) def rotY(xs, xe, ys, ye, zs, ze): xs1 = xs*aycos + ys*0 + zs*aysin ys1 = xs*0 + ys*1 + zs*0 zs1 = -xs*aysin + ys*0 + zs*aycos xs = xs1; ys = ys1; zs = zs1 xe1 = xe*aycos + ye*0 + ze*aysin ye1 = xe*0 + ye*1 + ze*0 ze1 = -xe*aysin + ye*0 + ze*aycos xe = xe1; ye = ye1; ze = ze1 return (xs, xe, ys, ye, zs, ze) def rotX(xs, xe, ys, ye, zs, ze): xs1 = xs*1 + ys*0 + zs*0 ys1 = xs*0 + ys*axcos - zs*axsin zs1 = xs*0 + ys*axsin + zs*axcos xs = xs1; ys = ys1; zs = zs1 xe1 = xe*1 + ye*0 + ze*0 ye1 = xe*0 + ye*axcos - ze*axsin ze1 = xe*0 + ye*axsin + ze*axcos xe = xe1; ye = ye1; ze = ze1 return (xs, xe, ys, ye, zs, ze) def rotZ(xs, xe, ys, ye, zs, ze): xs1 = xs*azcos - ys*azsin + zs*0 ys1 = xs*azsin + ys*azcos + zs*0 zs1 = xs*0 + ys*0 + zs*1 xs = xs1; ys = ys1; zs = zs1 xe1 = xe*azcos - ye*azsin + ze*0 ye1 = xe*azsin + ye*azcos + ze*0 ze1 = xe*0 + ye*0 + ze*1 xe = xe1; ye = ye1; ze = ze1 return (xs, xe, ys, ye, zs, ze) xs, xe, ys, ye, zs, ze = rotX(xs, xe, ys, ye, zs, ze) xs, xe, ys, ye, zs, ze = rotY(xs, xe, ys, ye, zs, ze) xs, xe, ys, ye, zs, ze = rotZ(xs, xe, ys, ye, zs, ze) return (xs, xe, ys, ye, zs, ze)
Прикреплённый файлы: Canvas 3D Clear.py (9,1 KБ)
Офлайн
Проверь еще раз правильность формул в коде с теорией. Бывает что просто опечатка незамеченная.
вот статья, может поможет https://api-2d3d-cad.com/euler_angles_quaternions/
Офлайн
Сработало, только когда я стал сохранять позицию точек и сбрасывать углы после каждого цикла. По идее никакой разницы и быть не должно.
Т.е я сначала указывал координаты точки, после чего в каждом цикле пересчитывал углы поворота.
(0, 0, 0) повернуть на (10, 0, 0) градусов, затем (0, 0, 0) повернуть на (10, 10, 0) градусов
Теперь
(0, 0, 50) повернуть на (10, 0, 0) градусов, затем (0, 10, 40) повернуть еще на (0, 10, 0) градусов.
Вроде как получается в данном случае, что каждый раз производится вращение вокруг одной оси, что и раньше работало. А необходимости вращать вокруг нескольких отсутствует.
В общем прога работает, но не работает сама теория, в которой вращение можно производить сразу по нескольким осям.
Скрипт прилагаю, но там нужно будет докинуть пару изображений заглушек на 512х512 пикселей, формата .png, с указанными в скрипте названиями.
def rotate_object(x, y, z, ax, ay, az): axcos = math.cos(math.radians(ax)) axsin = math.sin(math.radians(ax)) aycos = math.cos(math.radians(ay)) aysin = math.sin(math.radians(ay)) azcos = math.cos(math.radians(az)) azsin = math.sin(math.radians(az)) def rotX(x, y, z): # OX Поворачиваю ось xr = x*1 + y*0 + z*0 yr = x*0 + y*axcos + z*axsin zr = x*0 + y*(-axsin) + z*axcos return (xr, yr, zr) def rotY(x, y, z): # OY Поворачиваю ось xr = x*aycos + y*0 + z*(-aysin) yr = x*0 + y*1 + z*0 zr = x*aysin + y*0 + z*aycos return (xr, yr, zr) def rotZ(x, y, z): # OZ Поворачиваю ось xr = x*azcos + y*azsin + z*0 yr = x*(-azsin) + y*azcos + z*0 zr = x*0 + y*0 + z*1 return (xr, yr, zr) x, y, z = rotX(x, y, z); x, y, z = rotY(x, y, z); x, y, z = rotZ(x, y, z) return (x, y, z)
Отредактировано Guljaca (Окт. 4, 2020 16:50:36)
Прикреплённый файлы: Canvas 3D Clear 2.py (12,1 KБ)
Офлайн
x, y, z = rotX(x, y, z); x, y, z = rotY(x, y, z); x, y, z = rotZ(x, y, z) return (x, y, z)
Офлайн
FishHookПоочередный поворот, соответственно, по осям X, Y, Z. Бессмысленно, если каждый раз вращение происходит по одной оси.
Офлайн