Изучение игры, программируя (часть 2) [закрытая] (математика)

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

enter image description here

Если вы хотите увидеть линии, на которых круги движутся взад-вперед, добавьте следующий код непосредственно перед строкой 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)

15
задан Community 23 May 2017 в 12:23
поделиться

5 ответов

Хорошо, быстрый курс в Матричном/Векторном вычислении:

матрица А является набором чисел, заказанных в прямоугольной сетке как:

[ 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 это помогает немного.

24
ответ дан 1 December 2019 в 01:00
поделиться

Fredrik - короткий ответ - то, что, да, необходимо изучить Матрицы и Векторы, поскольку они - математические основы для 3D работы.

, В то время как Линейная алгебра является определенно не математикой уровня докторской степени, потребуется немного работы. Для начала работы проверьте эта книга о Amazon: похоже, что это точно, что Вы ищете. Я не прочитал эту конкретную книгу (тот, который я использовал в аспирантуре, немного устарело), но это особенно хорошо оценивается.

Еще одна вещь: существуют различные 3D механизмы моделирования, которые делают эту работу для Вас на рынке. Самый известный из них возможно Исходный Механизм от Клапана. Можно использовать этот Механизм (созданный для HalfLife2 & CounterStrike) для создания некоторых довольно сложных игр при работе выше уровень 3D моделирования. На самом деле, одна из самых популярных игр в сети Steam, модификация Garry запустилась с кого-то просто играющего с прохладными вещами, которые можно сделать с Паровым двигателем. Вот ссылка на сайт, который предоставляет учебные руководства для создания Ваших собственных миров с помощью Исходного Механизма в случае, если Вам интересно.

9
ответ дан 1 December 2019 в 01:00
поделиться

Определенно необходимо изучить линейную алгебру. MIT выпустил целый класс на YouTube, бесплатно. Можно запустить от здесь . Дело не в этом трудный, верьте мне! Весело проведите время ;)

4
ответ дан 1 December 2019 в 01:00
поделиться

' Математика для Приложений Компьютерной графики ' является вводным учебником уровня и берет класс соответствующий подход ко всей основной математике, что Вы должны познакомиться с для 3D программирования (матрицы и векторы главным образом)

И примечание относительно кватернионов: они очень полезны для определенных приложений. SLERP (Сферическая Линейная интерполяция) может быть очень удобным для создания гладких/привлекательных перемещений камеры (среди прочего). SLERP является болью (дорогой), чтобы сделать с матрицами, но дешевый и легкий с Кватернионами. Учитесь использовать и любить их - даже если Вы не полностью понимаете их.

2
ответ дан 1 December 2019 в 01:00
поделиться

Для векторов а именно, вводный текст или курс о линейной алгебре должны смочь получить Вас до скорости справедливо быстро.

1
ответ дан 1 December 2019 в 01:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: