Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 29, 2020 21:52:26

Guljaca
От:
Зарегистрирован: 2011-07-11
Сообщения: 93
Репутация: +  0  -
Профиль   Отправить e-mail  

Вращение точки с помощью матрицы поворота

Уже пробовал и через углы Эйлера и через матрицу поворота. Код работает только при повороте по одной оси. При повороте по трем осям изображение не деформируется, но ось поворота явно не совпадает с осью изображения. Вопрос в том, что я упускаю?
Особенно это заметно, если менять порядок поворотов вокруг осей: ось вращения начинает совпадать с осью фигуры, но при этом перескакивает на ощутимый угол.
Прикрепляю файл с рабочим кодом.

 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)



Прикреплённый файлы:
attachment Canvas 3D Clear.py (9,1 KБ)

Офлайн

#2 Сен. 8, 2020 21:22:13

romankrv
От:
Зарегистрирован: 2008-05-23
Сообщения: 513
Репутация: +  0  -
Профиль   Отправить e-mail  

Вращение точки с помощью матрицы поворота

Проверь еще раз правильность формул в коде с теорией. Бывает что просто опечатка незамеченная.
вот статья, может поможет https://api-2d3d-cad.com/euler_angles_quaternions/

Офлайн

#3 Окт. 4, 2020 16:49:53

Guljaca
От:
Зарегистрирован: 2011-07-11
Сообщения: 93
Репутация: +  0  -
Профиль   Отправить e-mail  

Вращение точки с помощью матрицы поворота

Сработало, только когда я стал сохранять позицию точек и сбрасывать углы после каждого цикла. По идее никакой разницы и быть не должно.
Т.е я сначала указывал координаты точки, после чего в каждом цикле пересчитывал углы поворота.
(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)

Прикреплённый файлы:
attachment Canvas 3D Clear 2.py (12,1 KБ)

Офлайн

#4 Окт. 4, 2020 18:59:18

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Вращение точки с помощью матрицы поворота

 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)

вот здесь я не понял смысла происходящего. Первые два вычисления просто бессмысленны



Офлайн

#5 Окт. 19, 2020 20:04:26

Guljaca
От:
Зарегистрирован: 2011-07-11
Сообщения: 93
Репутация: +  0  -
Профиль   Отправить e-mail  

Вращение точки с помощью матрицы поворота

FishHook
Поочередный поворот, соответственно, по осям X, Y, Z. Бессмысленно, если каждый раз вращение происходит по одной оси.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version