从4个角度创建网格透视
我试图从其4个角生成网格点。由于这个角落可以自由放置,它会看起来像网格有一个透视。从4个角度创建网格透视
我已经写在处理中,其中角部按顺时针顺序将下面的代码(起始于左上角)
PVector[][] setGrid(PVector[] corners, int cols, int rows) {
PVector[][] grid = new PVector[rows][cols];
for(int y = 0; y < rows; y++) {
float fY = (float)y/(rows - 1);
PVector p1 = PVector.lerp(corners[0], corners[3], fY);
PVector p2 = PVector.lerp(corners[1], corners[2], fY);
for(int x = 0; x < cols; x++) {
grid[y][x] = PVector.lerp(p1, p2, (float)x/(cols-1));
}
}
return grid;
}
这产生具有内插点的网格,但它不对应于透视网格。所有的在线点都是等距的,而在透视图中,最接近点应该比最远点更分离。
我希望得到一些方向,如果可能的话,在Java /加工
编辑
为了澄清我的答案。我定义了4个随机角点,我想获得所有创建perspective deformed grid的点。请注意,因为透视图dX1!= dX2以及dY1!= dY2。我写的代码不会产生这种效果(我知道这一点,但我不知道该如何去做)因为点是插值的,导致dX1 = dX2 = ... = dXi和dY1 = dY2 = ... = dYi
我已阅读有关视角变换,但我不需要变换图像,我只需要得到grid points coordinates。
在您的示例图像中,透视效果是通过保持沿不同长度边缘的线数不变来实现的。这就是你的实现,所以我真的没有看到这个问题。
这里是呼唤你的setGrid()草图:
PVector[] corners;
void setup(){
size(150,100);
corners = new PVector[4];
corners[0] = new PVector(35,20);
corners[1] = new PVector(15,height-30);
corners[2] = new PVector(width-10,height-10);
corners[3] = new PVector(width-30,10);
noLoop();
}
void draw(){
background(255);
PVector[][] results = setGrid(corners, 9, 9);
for(PVector[] pvs : results){
for(PVector pv : pvs){
ellipse(pv.x,pv.y,5,5);
}
}
}
PVector[][] setGrid(PVector[] corners, int cols, int rows) {
PVector[][] grid = new PVector[rows][cols];
for(int y = 0; y < rows; y++) {
float fY = (float)y/(rows - 1);
PVector p1 = PVector.lerp(corners[0], corners[3], fY);
PVector p2 = PVector.lerp(corners[1], corners[2], fY);
for(int x = 0; x < cols; x++) {
grid[y][x] = PVector.lerp(p1, p2, (float)x/(cols-1));
}
}
return grid;
}
...,结果看起来非常像你的目标图像。如果您看到不同的东西,也许您正在创建边缘长度非常相似的网格?
如果要投影的角度对规则的梯形 - 就像一个人行道后退到距离 - 再考虑这种方法代替:
我共享的方法的结果并不是我真正需要的。同一列或行中的点之间的距离是等距的,而点应该距离观看者越近,而“越远”越小。我不确定在2D场景中是否有某种模拟此3D效果的算法 – markusand
有一种算法 - 就像我在上面链接的math.stackexchange答案中一样 - 但是您必须提供伪3D信息。在那里看到自我回答。 – JeremyDouglass
我真的不知道是什么你问。你可以请发表[mcve]而不是断开连接的功能吗?你可以发表你想要做的模拟吗?哪一行代码的行为与您的预期不同? –
我试图解释我自己一点点更好,并添加了我想要实现的所需结果的绘图 – markusand