LoginSignup
8
8

More than 5 years have passed since last update.

3.3. ペインタアルゴリズム

Posted at

3Dの基本的な知識を理解したくて、『3次元CGの基礎と応用[新訂版]( http://goo.gl/GKoQ4y )』という書籍を購入しました。薄くて読みやすそうな本なのですがサンプルソースがないので、勉強がてらサンプルを作りながら読み進めようと思います。誰でもすぐに追試ができるよう、HTML + Javascriptでサンプルを作っていきます。

完全なサンプルはこちら
https://github.com/nakaken0629/3dstudy

3.3. ペインタアルゴリズム

ペインタアルゴリズムは、遠くのものから順番にポリゴンを書いていくというシンプルなアルゴリズムです。手前のポリゴンが奥のポリゴンを上書きするので、結果隠れてしまうということです。
このサンプルでは、ペインタアルゴリズムを無効にする(チェックを外す)と、手前にあるようなポリゴンより先に、その後面にあるように見えるポリゴンが消えてしまっています。

session3_3.gif

サンプルソース

session3_3.htmlより
var main = function() {
    /* p -> polygon(多角形) */
    var p = new Array(POLYGON_COUNT);
    for (var i = 0; i < POLYGON_COUNT; i++) {
        p[i] = makeTriangle();
    }

    var draw = function() {
        cls();
        p2 = sort(p);
        loop: for (var j = 0; j < POLYGON_COUNT; j++) {
            fillTriangle(p2[j]);
            /* 180km/hで近づく */
            for(var i = 0; i < p2[j].v.length; i++) {
                p2[j].v[i].z -= 3000;
            }
            for(var i = 0; i < p[j].v.length; i++) {
                if (p2[j].v[i].z > 600) {
                    continue loop;
                }
            }
            /* 全ての頂点が前方クリッピングの外に出たら、新しいポリゴンを作成 */
            p[j] = makeTriangle();
        }
    };
    var proc = setInterval(draw, 20);

/* ポリゴンを距離順にソートする */
var sort = function(list) {
    if (!document.forms[0].enabled.checked) {
        return list;
    }
    list.sort(
        function(p0, p1) {
            z0 = (p0.v[0].z + p0.v[1].z + p0.v[2].z) / 3.0;
            z1 = (p1.v[0].z + p1.v[1].z + p1.v[2].z) / 3.0;
            if (z0 < z1) return 1;
            if (z0 > z1) return -1;
            return 0;
        }
    );
    return list;
};
8
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8