因此,我正在p2项目la this example code中进行2D缩放和平移。我正在节点中的实例模式下工作,因此此平移/缩放的版本如下:
p.push();
p.translate(p.width/2, p.height/2);
p.scale(zoom);
p.translate(pan.x/zoom, pan.y/zoom);
// ... some code ...
p.pop();
我以前没有使用过这种方法,而是只是平移画布而不翻译它,但是现在添加它是为了使变焦也能正常工作。我有一个比瓷砖大的基于图块的地图,我从未平移(0,0)开始绘制,画布尺寸为(700,500),地图为(1300,1300)。因此,当我第一次翻译时,我将(0,0)变成(350,250)。如果我将平移设置为开始时的(-350,-250)进行补偿,并且至少将“相机”放置在地图上,那么我用来限制用户平移功能的值确实很奇怪。 >
// in setup()
p.B_CENTER = p5.Vector.mult(dim.view, 0.5);
p.B_PANNING = p5.Vector.mult(p.B_CENTER, -1);
p.B_MAXDIFF = p5.Vector.sub(dim.map, dim.view).add(p.B_CENTER).mult(0.5);
// in mouseDragged()
p.B_PANNING.add(p.createVector(p.mouseX - p.pmouseX, p.mouseY - p.pmouseY));
p.B_PANNING.x = p.round(p.constrain(p.B_PANNING.x, -p.B_MAXDIFF.x, -p.B_CENTER.x/2));
p.B_PANNING.y = p.round(p.constrain(p.B_PANNING.y, -p.B_MAXDIFF.y, -p.B_CENTER.y/2));
我的问题是,即使我拥有的所有图块和点都正确定位了自己,但所得的相对位置与画布尺寸没有明显的关系。在添加此翻译代码之前,我可以轻松检查相对位置是否在画布的边界内,因为平移到画布左上角的点将显示相对位置(0,0)。我的最大和最小约束平移值非常奇怪,因为我不是平移到地图的中心,而是平移到画布的中心:
// effective max panning values
minX = -440 // furthest right, -maxdiff.x
maxX = -175 // furthest left, -center.x
minY = -580 // furthest bottom, -maxdiff.y
maxY = -125 // furthest top, -center.y
// checking for visibility
function __isVisible(pos, bounds) {
if (pos.x < 0 || pos.y < 0) {
return false;
}
if (pos.x >= bounds.x || pos.y >= bounds.y) {
return false;
}
return true;
}
在下面的图像中,您可以看到它对相对位置的作用(对不起的调试颜色很抱歉)。地图上的每个点都显示其ID,然后显示相对于地图大小的固定位置,然后显示其平移后的相对位置。但是大多数相对位置并不反映它们实际相对于画布的位置。例如,当画布的宽度为700px时,点#7的相对x值与右边相距太远,无法真正位于378px。
所以,我的问题:
对不起,如果这令人困惑,我一直在绞尽脑汁去解决它,还没办法解决。