【发布时间】:2013-07-21 20:55:49
【问题描述】:
我试图在我的画布上做一个透视网格,我已经从另一个网站更改了功能,结果如下:
function keystoneAndDisplayImage(ctx, img, x, y, pixelHeight, scalingFactor) {
var h = img.height,
w = img.width,
numSlices = Math.abs(pixelHeight),
sliceHeight = h / numSlices,
polarity = (pixelHeight > 0) ? 1 : -1,
heightScale = Math.abs(pixelHeight) / h,
widthScale = (1 - scalingFactor) / numSlices;
for(var n = 0; n < numSlices; n++) {
var sy = sliceHeight * n,
sx = 0,
sHeight = sliceHeight,
sWidth = w;
var dy = y + (sliceHeight * n * heightScale * polarity),
dx = x + ((w * widthScale * n) / 2),
dHeight = sliceHeight * heightScale,
dWidth = w * (1 - (widthScale * n));
ctx.drawImage(img, sx, sy, sWidth, sHeight,
dx, dy, dWidth, dHeight);
}
}
它创建了几乎很好的透视网格,但它没有缩放高度,所以每个正方形都有相同的高度。 Here's a working jsFiddle 以及它的外观,就在画布下方。我想不出任何数学公式来扭曲与“透视距离”(顶部)成比例的高度。 我希望你明白。抱歉语言错误。
任何帮助将不胜感激
问候【问题讨论】:
-
我想要的画布中唯一的 3D 东西就是那个网格。如果没有严肃的 3D 数学,有没有办法做到这一点?我只需要添加一些东西来改变每行水平线之间的距离(类似的东西)。
-
有什么想法吗?我什么也没找到。
-
使用图片作为背景有什么问题?
-
我正在学习,我想知道如何做诸如全透视网格之类的事情。
标签: javascript html math canvas