javascript – HTML5透视网格
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – HTML5透视网格,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3582字,纯文字阅读大概需要6分钟。
内容图文
![javascript – HTML5透视网格](/upload/InfoBanner/zyjiaocheng/758/47f82463af964388b3c628389287fb9b.jpg)
我试图在我的画布上做一个透视网格,并且我已经使用以下结果从另一个网站更改了该功能:
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方法之外,遗憾的是没有正确的方法.但幸运的是,它并没有那么复杂.
下面将生成一个可以通过X轴旋转的网格(如图所示),因此我们只需要关注该轴.
要了解发生了什么:我们在笛卡尔坐标空间中定义网格.用于说我们将点定义为矢量而不是绝对坐标的花哨字.也就是说,一个网格单元可以从0,0到1,1而不是例如10,20到45,45只是为了取一些数字.
在投影阶段,我们将这些笛卡尔坐标投影到我们的屏幕坐标中.
结果将是这样的:
好吧,让我们深入研究 – 首先我们设置一些投影所需的变量等:
fov = 512, /// Field of view kind of the lense, smaller values = spheric
viewDist = 22, /// view distance, higher values = further away
w = ez.width / 2, /// center of screen
h = ez.height / 2,
angle = -27, /// grid angle
i, p1, p2, /// counter and two points (corners)
grid = 10; /// grid size in Cartesian
要调整网格,我们不调整循环(见下文),但改变fov和viewDist以及修改网格以增加或减少单元格数.
让我们说你想要一个更极端的视图 – 通过将fov设置为128并将viewDist设置为5,您将使用相同的网格和角度获得此结果:
执行所有数学运算的“魔术”功能如下:
function rotateX(x, y) {
var rd, ca, sa, ry, rz, f;
rd = angle * Math.PI / 180; /// convert angle into radians
ca = Math.cos(rd);
sa = Math.sin(rd);
ry = y * ca; /// convert y value as we are rotating
rz = y * sa; /// only around x. Z will also change
/// Project the new coords into screen coords
f = fov / (viewDist + rz);
x = x * f + w;
y = ry * f + h;
return [x, y];
}
就是这样.值得一提的是,它是新Y和Z的组合,使得线条在顶部变小(在这个角度).
现在我们可以像这样在笛卡尔空间中创建一个网格,并将这些点直接旋转到屏幕坐标空间:
/// create vertical lines
for(i = -grid; i <= grid; i++) {
p1 = rotateX(i, -grid);
p2 = rotateX(i, grid);
ez.strokeLine(p1[0], p1[1], p2[0], p2[1]); //from easyCanvasJS, see demo
}
/// create horizontal lines
for(i = -grid; i <= grid; i++) {
p1 = rotateX(-grid, i);
p2 = rotateX(grid, i);
ez.strokeLine(p1[0], p1[1], p2[0], p2[1]);
}
另请注意,位置0,0是屏幕的中心.这就是为什么我们使用负值来左侧或上方.您可以看到两条中心线是直线.
这就是它的全部内容.要为单元格着色,只需选择笛卡尔坐标,然后通过调用rotateX()进行转换,您就可以获得角点所需的坐标.
例如,选择一个随机单元格编号(在X轴和Y轴上介于-10和10之间):
c1 = rotateX(cx, cy); /// upper left corner
c2 = rotateX(cx + 1, cy); /// upper right corner
c3 = rotateX(cx + 1, cy + 1); /// bottom right corner
c4 = rotateX(cx, cy + 1); /// bottom left corner
/// draw a polygon between the points
ctx.beginPath();
ctx.moveTo(c1[0], c1[1]);
ctx.lineTo(c2[0], c2[1]);
ctx.lineTo(c3[0], c3[1]);
ctx.lineTo(c4[0], c4[1]);
ctx.closePath();
/// fill the polygon
ctx.fillStyle = 'rgb(200,0,0)';
ctx.fill();
An animated version可以帮助看看发生了什么.
内容总结
以上是互联网集市为您收集整理的javascript – HTML5透视网格全部内容,希望文章能够帮你解决javascript – HTML5透视网格所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。