Я пишу 3D-движок для AS3.0 ... И я столкнулся с досадной проблемой. В настоящее время 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 для изменения выбранной ручки - попробуйте ввести цифровые клавиши и верхнюю цифровую клавишу)