我正在为 AS3.0 编写一个 3D 引擎……我遇到了一个烦人的问题。AS3.0 目前只支持仿射位图转换(3D 太难管理,这就是我编写引擎的原因)——这意味着我无法实现大顶点的真实透视。
我可以做一个循环并根据其 Z 位置渲染位图的每个像素......但这比大多数计算机可以做的要多 1000 倍,因为透视是非线性的......
所以 - 解决方案是 - 将顶点自动拆分(因此程序员/建模者不必这样做)成更小的三角形。
不幸的是,这……波涛汹涌……?仿射变换不够精确,或者可能不够精确,但它们不适合其他三角形......要演示的图像:
(死图)
正如您在红色部分看到的那样,它们非常不稳定,在前中列最明显。
那么 - 我做错了什么?这在 Sandy、away3D、Alternativa 中是如何完成的?
编辑1:我用于转换为三角形的代码如下所示:
public static function transformTriangle(bd:BitmapData, pts:Vector.<Point>, gfx:Graphics):void {
var matrix:Matrix = new Matrix();
matrix.tx = pts[0].x;
matrix.ty = pts[0].y;
matrix.a = (pts[1].x - pts[0].x) / bd.width;
matrix.b = (pts[1].y - pts[0].y) / bd.height;
matrix.c = (pts[2].x - pts[0].x) / bd.width;
matrix.d = (pts[2].y - pts[0].y) / bd.height;
gfx.beginBitmapFill(bd, matrix, false, true);
gfx.moveTo(pts[0].x, pts[0].y);
gfx.lineTo(pts[0].x, pts[0].y);
gfx.lineTo(pts[1].x, pts[1].y);
gfx.lineTo(pts[2].x, pts[2].y);
gfx.lineTo(pts[0].x, pts[0].y);
gfx.endFill();
}
编辑2:这是变压器的一个小演示:
点击这里(死链接)
(箭头控制蓝点,1-3 更改选定的句柄 - 尝试使用小键盘和顶部数字键)