-1

活塞具有draw_2d函数,它可以接受函数的结果,该函数image返回由纹理制成的图像。有一个 'transformation' 参数image,大多数示例只是从texture.transform. 在内部,它是一个列表列表,如下所示:

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

调用示例如下:

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

我试图找出这些价值观的定义,但失败了。文档只是说“转型”而没有进一步澄清。这些数字在数组中意味着什么?

4

2 回答 2

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)
于 2020-10-06T20:02:47.633 回答
1

它是变换矩阵形式的线性变换,用于变换您正在绘制的图像的 (x,y) 坐标。如果需要,您可以手动指定它,但典型用法是使用方法 on执行所需的转换;实际上是一个实现trait 的结构。context.transformcontext.transformTransformed

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)]]
}
于 2020-10-07T16:44:50.857 回答