为了实现贴图仿射变换,底层数学库提供了三角形任意变换方法,生成4*4的matrix供transform使用。
csx code
1234567890101234567890201234567890301234567890401234567890501234567890601234567890701234567890801234567890901234567890100123456789011012345678901201234567890130123456
- let o = karas.render(
- <canvas width="360" height="360">
- <$polygon
- ref="t"
- points={[
- [0.1, 0.2],
- [1, 0.05],
- [0.9, 0.8]
- ]}
- style={{position:'absolute',left:100,top:100,width:100,height:100,strokeWidth:0,fill:'#f00',transformOrigin:'0 0',}}
- />
- <$polygon
- ref="s"
- points={[
- [0.5, 0.1],
- [0.8, 0.2],
- [0.3, 0.5]
- ]}
- style={{position:'absolute',left:100,top:100,width:100,height:100,strokeWidth:0,fill:'rgba(0,0,255,0.5)',transformOrigin:'0 0',}}
- />
- </canvas>,
- '#example'
- );
- let o2 = karas.render(
- <svg width="360" height="360">
- <$polygon
- ref="t"
- points={[
- [0.1, 0.2],
- [1, 0.05],
- [0.9, 0.8]
- ]}
- style={{position:'absolute',left:100,top:100,width:100,height:100,strokeWidth:0,fill:'#f00',transformOrigin:'0 0',}}
- />
- <$polygon
- ref="s"
- points={[
- [0.5, 0.1],
- [0.8, 0.2],
- [0.3, 0.5]
- ]}
- style={{position:'absolute',left:100,top:100,width:100,height:100,strokeWidth:0,fill:'rgba(0,0,255,0.5)',transformOrigin:'0 0',}}
- />
- </svg>,
- '#example2'
- );
- let s = o.ref.s;
- let s2 = o2.ref.s;
- let t = o.ref.t;
- let t2 = o2.ref.t;
- let res = karas.math.tar.transform([50, 10, 80, 20, 30, 50], [10, 20, 100, 5, 90, 80]);
- let flag = true;
- setInterval(function() {
- if(flag) {
- s.updateStyle({
- transform: `matrix3d(${res.join(',')})`,
- });
- s2.updateStyle({
- transform: `matrix3d(${res.join(',')})`,
- });
- }
- else {
- s.updateStyle({
- transform: null,
- });
- s2.updateStyle({
- transform: null,
- });
- }
- o.refresh();
- o2.refresh();
- flag = !flag;
- }, 1000);
let o = karas.render(
<canvas width="360" height="360">
<$polygon
ref="t"
points={[
[0.1, 0.2],
[1, 0.05],
[0.9, 0.8]
]}
style={{position:'absolute',left:100,top:100,width:100,height:100,strokeWidth:0,fill:'#f00',transformOrigin:'0 0',}}
/>
<$polygon
ref="s"
points={[
[0.5, 0.1],
[0.8, 0.2],
[0.3, 0.5]
]}
style={{position:'absolute',left:100,top:100,width:100,height:100,strokeWidth:0,fill:'rgba(0,0,255,0.5)',transformOrigin:'0 0',}}
/>
</canvas>,
'#example'
);
let o2 = karas.render(
<svg width="360" height="360">
<$polygon
ref="t"
points={[
[0.1, 0.2],
[1, 0.05],
[0.9, 0.8]
]}
style={{position:'absolute',left:100,top:100,width:100,height:100,strokeWidth:0,fill:'#f00',transformOrigin:'0 0',}}
/>
<$polygon
ref="s"
points={[
[0.5, 0.1],
[0.8, 0.2],
[0.3, 0.5]
]}
style={{position:'absolute',left:100,top:100,width:100,height:100,strokeWidth:0,fill:'rgba(0,0,255,0.5)',transformOrigin:'0 0',}}
/>
</svg>,
'#example2'
);
let s = o.ref.s;
let s2 = o2.ref.s;
let t = o.ref.t;
let t2 = o2.ref.t;
let res = karas.math.tar.transform([50, 10, 80, 20, 30, 50], [10, 20, 100, 5, 90, 80]);
let flag = true;
setInterval(function() {
if(flag) {
s.updateStyle({
transform: `matrix3d(${res.join(',')})`,
});
s2.updateStyle({
transform: `matrix3d(${res.join(',')})`,
});
}
else {
s.updateStyle({
transform: null,
});
s2.updateStyle({
transform: null,
});
}
o.refresh();
o2.refresh();
flag = !flag;
}, 1000);