странные повороты в самодельном 3D движке - PullRequest
1 голос
/ 09 января 2020

Здравствуйте и извините, если мой вопрос повторяется, я собираю свой первый 3D-движок, используя python и pygame для графики. основное трехмерное преобразование:

def param(x,y,z):
vec_rx = rotate_x((x,y,z), angle_x)
vec_ry = rotate_y(vec_rx , angle_y)
vec = rotate_z(vec_ry , angle_z)
return ((zoom * vec[0])/(70-vec[2]) + win_width/2,( (zoom * vec[1])/(70-vec[2]) ) + win_height/2)

70 для расстояния от начала координат. вращение происходит путем умножения матриц:

def rotate_x(vec,angle):
    a = vec[0]
    b = vec[1]*math.cos(angle) - vec[2]*math.sin(angle)
    c = vec[1]*math.sin(angle) + vec[2]*math.cos(angle)
    return (a,b,c)
def rotate_y(vec,angle):
    a = vec[0]*math.cos(angle) + vec[2]*math.sin(angle)
    b = vec[1]
    c = -vec[0]*math.sin(angle) + vec[2]*math.cos(angle)
    return (a,b,c)
def rotate_z(vec,angle):
    a = vec[0]*math.cos(angle) - vec[1]*math.sin(angle)
    b = vec[0]*math.sin(angle) + vec[1]*math.cos(angle)
    c = vec[2]
    return (a,b,c)

углы - это 3 глобальных параметра, изменяющихся при вводе с клавиатуры / мыши. когда углы равны нулю, вращение идеально вокруг каждой оси, но когда не ноль, объект вращается не вокруг оси, а с некоторым странным смещением. это может быть блокировка карданного подвеса, хотя я не уверен.

вот пример 3d движка в моем проекте, сделанного в desmos: https://www.desmos.com/calculator/8by2wg0cek вы можете поиграть с углами и увидеть похожее Эффект.

Есть ли что-то, чего мне не хватает, чтобы совершить идеальные повороты вокруг оси?

Большое спасибо!

1 Ответ

1 голос
/ 10 января 2020

Отличная работа. Из того, что я вижу, объект вращается вокруг осей, смещения нет, но оси остаются на месте. Другими словами, объект вращается вокруг осей системы координат, а не собственных осей.

Боюсь, ваша математика немного упрощена. Это работает для фиксированных осей, но когда дело доходит до произвольных, это терпит неудачу. И когда вы начнете укладывать преобразования, это станет еще сложнее. Вам нужно будет узнать о кватернионах и т. Д. c. Я бы предложил вам использовать OpenGl вместо того, чтобы реализовывать все с нуля.

Но я не хочу вас пугать, это определенно выполнимо. Хорошей отправной точкой может быть этот пост: { ссылка }

...