0

我正在为 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 更改选定的句柄 - 尝试使用小键盘和顶部数字键)

4

1 回答 1

1

我认为如果您尝试使用 drawTriangles 代替它会解决您的问题。这是一些与drawTriangles和z-sorting链接相关的帖子

于 2010-11-21T17:20:19.227 回答