вращение функции 2d круга - PullRequest
1 голос
/ 09 июля 2019

я пытаюсь добавить вращение в мою функцию.

Я понятия не имею, как я могу повернуть его в своей функции

void draw_filled_circle(const RenderListPtr& render_list, const Vec2& position, float radius, CircleType type, Color color, float rotate){
    float pi;
    if (type == FULL) pi = D3DX_PI;         // Full circle
    if (type == HALF) pi = D3DX_PI / 2;     // 1/2 circle
    if (type == QUARTER) pi = D3DX_PI / 4;  // 1/4 circle

    const int segments = 32;
    float angle = rotate * D3DX_PI / 180;
    Vertex v[segments + 1];

    for (int i = 0; i <= segments; i++){
        float theta = 2.f * pi * static_cast<float>(i) / static_cast<float>(segments);
        v[i] = Vertex{
            position.x + radius * std::cos(theta),
            position.y + radius * std::sin(theta),
            color
        };
    }
    add_vertices(render_list, v, D3DPT_TRIANGLEFAN);
}

1 Ответ

1 голос
/ 09 июля 2019

Как правило, вы ничего не вращаете, напрямую изменяя вершины.Вместо этого вы используете матрицу (матрица проекции модель-представление) для преобразования данных.Три комбинированные матрицы сводятся к:

  • Матрица модели: это матрица, которая используется для позиционирования и ориентации геометрии в мировом пространстве.Если вам нужно только вращение, то установите эту матрицу в качестве матрицы вращения.
  • Матрица просмотра: это обратная матрица местоположения вашей камеры.
  • Матрица проекции: сглаживает расположения трехмерных вершин в двухмерных координатах на экране.

Обычно вы объединяете все 3 матрицы в одну матрицу MVP, которую используете для выполнения всех 3 преобразований в одной операции.Этот документ объясняет некоторые основы: https://docs.microsoft.com/en-us/windows/win32/dxtecharts/the-direct3d-transformation-pipeline

D3DXMATRIX proj_mat; //< set with projection you need
D3DXMATRIX view_mat; //< invert the matrix for the camera position & orientation
D3DXMATRIX model_mat; //< set the rotation here
D3DXMATRIX MVP;
MVP = model_mat * view_mat * proj_mat; //< combine into a single MVP to set on your shader

Если вы REALLY хотите повернуть данные вершин в буфере, то вы можете установить model_mat в качестве некоторой матрицы вращения, а затем умножьте каждую вершину на model_mat.Проблема заключается в том, что обновление происходит очень медленно (вам необходимо перестраивать весь буфер в каждом кадре, а графический процессор имеет схему для преобразования вершин через матрицу)

...