преобразование текстуры в поршне

#opengl #rust #rust-piston

#opengl #Ржавчина #ржавчина-поршень

Вопрос:

У Piston есть draw_2d функция, и она может принимать результаты от функции image , которая возвращает изображение, созданное из текстуры. Для этого есть параметр ‘transformation’ image , из которого просто берется большинство примеров texture.transform . Внутренне это список списков, например:

 [[0.0025, 0.0, -1.0], [0.0, -0.0033333333333333335, 1.0]]
  

Примером вызова является:

 window.draw_2d(
    amp;e,
    |context, graph_2d, _device| {
    pw::image(
    amp;texture,
    context.transform, // [[0.001, 0.0, 0.0], [0.0, -0.0033333333333333335, 1.0]]
    graph_2d
);
  

Я пытался найти, что определяют эти значения, но не удалось. Документы просто говорят «преобразование» без дальнейших разъяснений. Что означают эти числа внутри массива?

Комментарии:

1. en.wikipedia.org/wiki/Transformation_matrix

Ответ №1:

Вероятно, это линейное преобразование из координаты (x, y) в координату текстуры (u, v). Происходит что-то вроде этого псевдокода.

 with tansform [[a, b, c], [d, e, f]]
For every (x,y) being drawn
    u = a*x   b*y   c
    v = d*x   e*y   f
    color = texture(u,v)
    draw color at (x,y)
  

Комментарии:

1. Отрицательные u или v? С координатами текстуры вне диапазона можно справиться с помощью повторения, зеркального отображения, зажима. Обычно это настраивается на глобальном уровне или для каждой текстуры.

Ответ №2:

Это линейное преобразование в виде матрицы преобразования, которая используется для преобразования координат (x, y) изображения, которое вы рисуете. Вы могли бы указать это вручную, если хотите, но типичным использованием является использование методов context.transform для выполнения желаемых преобразований; context.transform на самом деле это структура, которая реализует Transformed признак.

image Функция передает преобразование вниз через несколько вложенных вызовов, но в конечном итоге оно используется triangulation::rect_tri_list_xy для создания вершин треугольника для рисования:

 /// Creates triangle list vertices from rectangle.
#[inline(always)]
pub fn rect_tri_list_xy(m: Matrix2d, rect: Rectangle) -> [[f32; 2]; 6] {
    let (x, y, w, h) = (rect[0], rect[1], rect[2], rect[3]);
    let (x2, y2) = (x   w, y   h);
    [[tx(m, x, y), ty(m, x, y)],
     [tx(m, x2, y), ty(m, x2, y)],
     [tx(m, x, y2), ty(m, x, y2)],
     [tx(m, x2, y), ty(m, x2, y)],
     [tx(m, x2, y2), ty(m, x2, y2)],
     [tx(m, x, y2), ty(m, x, y2)]]
}
  

Комментарии:

1. Если это матрица преобразования, почему она 3×2 вместо 3×3?

2. @GeorgeShuklin Матрицы преобразования не обязательно должны быть квадратными, и это 2×3 (количество строк указано первым). Это означает, что он отображает из R3 (3D координаты x, y, z) в R2 (2D координаты x, y). Это описано даже во вводном абзаце на связанной странице Википедии.