3D движок - как правильно разбить вершину - PullRequest
0 голосов
/ 20 ноября 2010

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

1 Ответ

1 голос
/ 21 ноября 2010

Я думаю, что если вы попробуете использовать drawTriangles, это решит вашу проблему.Вот некоторые сообщения, связанные с drawTriangles и z-sorting link

...