Питонская черепаха не является демоном скорости, когда дело доходит до анимации. Хитрость в том, чтобы добиться какой-то скорости, - это потратить время, чтобы понять, как это работает, и попросить его сделать как можно меньше. Ниже приведена моя реализация анимированного GIF-изображения «каждый из белых кругов действительно движется»:
from math import pi, cos
from itertools import cycle
from turtle import Screen, Turtle
CIRCLES = 8
DIAMETER = 300
RADIUS = DIAMETER / 2
CURSOR_SIZE = 20
screen = Screen()
screen.tracer(False)
turtle = Turtle(visible=False)
turtle.dot(DIAMETER + CURSOR_SIZE)
turtles = []
for n in range(CIRCLES):
angle = n * pi / CIRCLES
circle = Turtle('circle')
circle.radians()
circle.color('red')
circle.penup()
circle.setheading(angle) # this stays fixed
# stash a couple of our values with the turtle
circle.angle = angle # this will change
circle.sign = 1 if cos(angle) > 0 else -1
turtles.append(circle)
circles = cycle(turtles)
while True: # really should use timer event but we're going for maximum speed!
circle = next(circles)
cosine = cos(circle.angle)
circle.forward(cosine * RADIUS - circle.sign * circle.distance(0, 0))
# update the values we stashed with the turtle
circle.sign = 1 if cosine > 0 else -1
circle.angle -= 0.1
screen.update()
screen.tracer(True)
screen.mainloop()
Если вы хотите увидеть линии, на которых круги движутся взад-вперед, добавьте следующий код непосредственно перед строкой turtles = []
:
turtle.radians()
turtle.color('white')
for n in range(CIRCLES):
turtle.setheading(n * pi / CIRCLES)
turtle.forward(RADIUS)
turtle.backward(DIAMETER)
turtle.forward(RADIUS)
Хорошо, быстрый курс в Матричном/Векторном вычислении:
матрица А является набором чисел, заказанных в прямоугольной сетке как:
[ 0, 1, 2 ]
[ 2, 3, 5 ]
[ 2, 1, 3 ]
[ 0, 0, 1 ]
вышеупомянутая матрица имеет 4 строки и 3 столбца, и как таковой матрица 4 x 3. Вектор является матрицей с 1 строкой (вектор - строка) или 1 столбец (вектор - столбец). Нормальные числа называют скалярами для контрастирования с матрицами.
также распространено использовать прописные буквы для матриц и строчные буквы для скаляров.
Мы можем сделать основное вычисление с матрицами, но существуют некоторые условия.
Дополнение
Матрицы могут быть добавлены, если у них есть те же размеры. Так 2x2 матрица может быть добавлена к 2x2 матрица, но не к 3x5 матрица.
[ 1, 2 ] + [ 2, 5 ] = [ 3, 7 ]
[ 2, 4 ] [ 0, 3 ] [ 2, 7 ]
Вы видите, что дополнением каждое число в каждой ячейке добавляется к числу на том же положении в другой матрице.
Умножение матриц
Матрицы могут быть умножены, но это немного более сложно. Для умножения, матрицируют с матрицей B, необходимо умножить числа в каждой строке если матрица с каждым столбцом в матрице B. Это означает, что при умножении матрицы a x b с матрицей c x d b и c должен быть равным, и получающаяся матрица составляет a x d:
[1,2,3] x [4,6] = [1x4+2x2+3x2, 1x6+2x1+3x3 ] = [4+4+6, 6+2+9 ] = [14, 20]
[1,4,5] [2,1] [1x4+4x2+5x2, 1x6+4x1+5x3 ] [4+8+10, 6+4+15 ] [22, 25]
[2,3]
, Как Вы видите с матрицами, A x B отличается от B x A.
Матричное скалярное умножение
можно умножить матрицу со скаляром. В этом случае каждая ячейка умножается с тем числом:
3 x [1,2] = [ 3, 6]
[4,7] [12,21]
Инвертирование матрицы Матричное подразделение не возможно, но можно создать инверсию матрицы, таким образом, что x A-inv является матрицей со всем нулем за исключением той основной диагонали:
[ 1, 0, 0 ]
[ 0, 1, 0 ]
[ 0, 0, 1 ]
Инвертирование матрицы может только быть сделано с квадратными матрицами, и это - сложное задание, которое не делает neccesary, имеют результат.
Запускаются с матрицы A:
[ 1, 2, 3 ]
A = [ 1, 3, 4 ]
[ 2, 5, 1 ]
Мы добавляем 3 дополнительных столбца и заполняем их единичной матрицей:
[ 1, 2, 3, 1, 0, 0 ]
[ 1, 3, 4, 0, 1, 0 ]
[ 2, 5, 1, 0, 0, 1 ]
Теперь мы запускаем с первого столбца. Мы должны вычесть первую строку друг от друга, располагают в ряд таким образом, что первый столбец содержит, только обнуляет за исключением первой строки. Чтобы сделать это, мы вычитаем первую строку однажды из второго и дважды из третьего:
[ 1, 2, 3, 1, 0, 0 ]
[ 0, 1, 1,-1, 1, 0 ]
[ 0, 1,-5,-2, 0, 1 ]
Теперь мы повторяем это со вторым столбцом (дважды от первой строки и однажды от третьего)
[ 1, 0, 1, 3,-2, 0 ]
[ 0, 1, 1,-1, 1, 0 ]
[ 0, 0,-6,-1,-1, 1 ]
Для третьего столбца, у нас есть небольшая проблема. Число центра-6 а не 1. Но мы можем решить это путем умножения всей строки с-1/6:
[ 1, 0, 1, 3, -2, 0 ]
[ 0, 1, 1, -1, 1, 0 ]
[ 0, 0, 1, 1/6, 1/6, -1/6 ]
И теперь мы можем вычесть третью строку сначала и второе:
[ 1, 0, 0, 17/6,-13/6, 1/6 ]
[ 0, 1, 0, -7/6, 5/6, 1/6 ]
[ 0, 0, 1, 1/6, 1/6, -1/6 ]
хорошо теперь у нас есть инверсия A:
[ 17/6,-13/6, 1/6 ]
[ -7/6, 5/6, 1/6 ]
[ 1/6, 1/6, -1/6 ]
Мы можем записать это как:
[ 17,-13, 1 ]
1/6 * [ -7, 5, 1 ]
[ 1, 1, -1 ]
[ 1, 2, 3 ] [ 17,-13, 1 ] [ 6, 0, 0 ] [ 1, 0, 0 ]
A = [ 1, 3, 4 ] x [ -7, 5, 1 ] x 1/6 = 1/6 x [ 0, 6, 0 ] = [ 0, 1, 0 ]
[ 2, 5, 1 ] [ 1, 1, -1 ] [ 0, 0, 6 ] [ 0, 0, 1 ]
Hope это помогает немного.
Fredrik - короткий ответ - то, что, да, необходимо изучить Матрицы и Векторы, поскольку они - математические основы для 3D работы.
, В то время как Линейная алгебра является определенно не математикой уровня докторской степени, потребуется немного работы. Для начала работы проверьте эта книга о Amazon: похоже, что это точно, что Вы ищете. Я не прочитал эту конкретную книгу (тот, который я использовал в аспирантуре, немного устарело), но это особенно хорошо оценивается.
Еще одна вещь: существуют различные 3D механизмы моделирования, которые делают эту работу для Вас на рынке. Самый известный из них возможно Исходный Механизм от Клапана. Можно использовать этот Механизм (созданный для HalfLife2 & CounterStrike) для создания некоторых довольно сложных игр при работе выше уровень 3D моделирования. На самом деле, одна из самых популярных игр в сети Steam, модификация Garry запустилась с кого-то просто играющего с прохладными вещами, которые можно сделать с Паровым двигателем. Вот ссылка на сайт, который предоставляет учебные руководства для создания Ваших собственных миров с помощью Исходного Механизма в случае, если Вам интересно.
Определенно необходимо изучить линейную алгебру. MIT выпустил целый класс на YouTube, бесплатно. Можно запустить от здесь . Дело не в этом трудный, верьте мне! Весело проведите время ;)
' Математика для Приложений Компьютерной графики ' является вводным учебником уровня и берет класс соответствующий подход ко всей основной математике, что Вы должны познакомиться с для 3D программирования (матрицы и векторы главным образом)
И примечание относительно кватернионов: они очень полезны для определенных приложений. SLERP (Сферическая Линейная интерполяция) может быть очень удобным для создания гладких/привлекательных перемещений камеры (среди прочего). SLERP является болью (дорогой), чтобы сделать с матрицами, но дешевый и легкий с Кватернионами. Учитесь использовать и любить их - даже если Вы не полностью понимаете их.
Для векторов а именно, вводный текст или курс о линейной алгебре должны смочь получить Вас до скорости справедливо быстро.