活塞中纹理的变换

问题描述

活塞具有draw_2d函数,它可以接受函数image的结果,该函数返回由纹理制成的图像。 image一个“ transformation”参数,大多数示例仅从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],1.0]]
    graph_2d
);

我试图找到那些值正在定义的内容,但是失败了。文档只说了“转变”而没有进一步说明。这些数字在数组内部意味着什么?

解决方法

这可能是从(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)
,

它是linear transformation形式的transformation matrix,用于转换要绘制的图像的(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,y)],[tx(m,x2,y2),y2)],y2)]]
}