( ! ) Warning: Parameter 1 to multibyte_patch::wplink_js() expected to be a reference, value given in /virtual/kurosquare/public_html/lego.kuroneko-square.net/articles/wp-includes/class-wp-hook.php on line 298
Call Stack
#TimeMemoryFunctionLocation
10.0000361736{main}( ).../index.php:0
20.0001362024require( '/virtual/kurosquare/public_html/lego.kuroneko-square.net/articles/wp-blog-header.php' ).../index.php:17
30.0001362376require_once( '/virtual/kurosquare/public_html/lego.kuroneko-square.net/articles/wp-load.php' ).../wp-blog-header.php:13
40.0001362792require_once( '/virtual/kurosquare/public_html/lego.kuroneko-square.net/articles/wp-config.php' ).../wp-load.php:37
50.0002364160require_once( '/virtual/kurosquare/public_html/lego.kuroneko-square.net/articles/wp-settings.php' ).../wp-config.php:89
60.11526408304do_action( ).../wp-settings.php:449
70.11526408680WP_Hook->do_action( ).../plugin.php:453
80.11526408680WP_Hook->apply_filters( ).../class-wp-hook.php:323
90.13106781144call_user_func_array:{/virtual/kurosquare/public_html/lego.kuroneko-square.net/articles/wp-includes/class-wp-hook.php:298} ( ).../class-wp-hook.php:298
100.13106781536hc_googlo_ajax_libraries( ).../class-wp-hook.php:298
110.13106781536register_script( ).../regist_ajax_libs.php:194
120.13106781944WP_Scripts->__construct( ).../regist_ajax_libs.php:84
130.13106781944WP_Scripts->init( ).../class.wp-scripts.php:144
140.13116782344do_action_ref_array( ).../class.wp-scripts.php:162
150.13116782344WP_Hook->do_action( ).../plugin.php:515
160.13116782344WP_Hook->apply_filters( ).../class-wp-hook.php:323
170.13116783448call_user_func_array:{/virtual/kurosquare/public_html/lego.kuroneko-square.net/articles/wp-includes/class-wp-hook.php:298} ( ).../class-wp-hook.php:298

( ! ) Warning: Parameter 1 to wp_default_scripts() expected to be a reference, value given in /virtual/kurosquare/public_html/lego.kuroneko-square.net/articles/wp-includes/class-wp-hook.php on line 298
Call Stack
#TimeMemoryFunctionLocation
10.0000361736{main}( ).../index.php:0
20.0001362024require( '/virtual/kurosquare/public_html/lego.kuroneko-square.net/articles/wp-blog-header.php' ).../index.php:17
30.0001362376require_once( '/virtual/kurosquare/public_html/lego.kuroneko-square.net/articles/wp-load.php' ).../wp-blog-header.php:13
40.0001362792require_once( '/virtual/kurosquare/public_html/lego.kuroneko-square.net/articles/wp-config.php' ).../wp-load.php:37
50.0002364160require_once( '/virtual/kurosquare/public_html/lego.kuroneko-square.net/articles/wp-settings.php' ).../wp-config.php:89
60.11526408304do_action( ).../wp-settings.php:449
70.11526408680WP_Hook->do_action( ).../plugin.php:453
80.11526408680WP_Hook->apply_filters( ).../class-wp-hook.php:323
90.13106781144call_user_func_array:{/virtual/kurosquare/public_html/lego.kuroneko-square.net/articles/wp-includes/class-wp-hook.php:298} ( ).../class-wp-hook.php:298
100.13106781536hc_googlo_ajax_libraries( ).../class-wp-hook.php:298
110.13106781536register_script( ).../regist_ajax_libs.php:194
120.13106781944WP_Scripts->__construct( ).../regist_ajax_libs.php:84
130.13106781944WP_Scripts->init( ).../class.wp-scripts.php:144
140.13116782344do_action_ref_array( ).../class.wp-scripts.php:162
150.13116782344WP_Hook->do_action( ).../plugin.php:515
160.13116782344WP_Hook->apply_filters( ).../class-wp-hook.php:323
170.13126783448call_user_func_array:{/virtual/kurosquare/public_html/lego.kuroneko-square.net/articles/wp-includes/class-wp-hook.php:298} ( ).../class-wp-hook.php:298

( ! ) Warning: Parameter 1 to wp_default_styles() expected to be a reference, value given in /virtual/kurosquare/public_html/lego.kuroneko-square.net/articles/wp-includes/class-wp-hook.php on line 298
Call Stack
#TimeMemoryFunctionLocation
10.0000361736{main}( ).../index.php:0
20.0001362024require( '/virtual/kurosquare/public_html/lego.kuroneko-square.net/articles/wp-blog-header.php' ).../index.php:17
30.0001362376require_once( '/virtual/kurosquare/public_html/lego.kuroneko-square.net/articles/wp-load.php' ).../wp-blog-header.php:13
40.0001362792require_once( '/virtual/kurosquare/public_html/lego.kuroneko-square.net/articles/wp-config.php' ).../wp-load.php:37
50.0002364160require_once( '/virtual/kurosquare/public_html/lego.kuroneko-square.net/articles/wp-settings.php' ).../wp-config.php:89
60.11526408304do_action( ).../wp-settings.php:449
70.11526408680WP_Hook->do_action( ).../plugin.php:453
80.11526408680WP_Hook->apply_filters( ).../class-wp-hook.php:323
90.13106781144call_user_func_array:{/virtual/kurosquare/public_html/lego.kuroneko-square.net/articles/wp-includes/class-wp-hook.php:298} ( ).../class-wp-hook.php:298
100.13106781536hc_googlo_ajax_libraries( ).../class-wp-hook.php:298
110.13956859944wp_register_style( ).../regist_ajax_libs.php:270
120.13956859944wp_styles( ).../functions.wp-styles.php:123
130.13956860352WP_Styles->__construct( ).../functions.wp-styles.php:23
140.13956860752do_action_ref_array( ).../class.wp-styles.php:127
150.13956860752WP_Hook->do_action( ).../plugin.php:515
160.13956860752WP_Hook->apply_filters( ).../class-wp-hook.php:323
170.13956861880call_user_func_array:{/virtual/kurosquare/public_html/lego.kuroneko-square.net/articles/wp-includes/class-wp-hook.php:298} ( ).../class-wp-hook.php:298
LDrawを使ったLEGOモデルの制作 – LEGO Extensions

現在のページの位置: LEGO Extensions > LDrawを使ったLEGOモデルの制作

LDrawを使ったLEGOモデルの制作

「LDrawってなに?」という方へ、具体的な手順を参考にしながら概要を掴んでいただきたいと思います。なお、ここでご紹介するものはLDrawのほんの一部ですので、もっと詳しく知りたい方には実際にLDrawを使っていただくことを強くおすすめします。

LEGOを組み立てるためのシステム「LDraw」

LDrawは、コンピュータ上でLEGOモデル(3DCG)を作るためのツール群です。特徴としては「理論上はブロックの数に際限がない」「アニメーション制作に活用できる」といった点が挙げられますし、フリーウェアでもあります。LDrawはもともと英語のソフトですが、日本語での解説もいくつか公開されています。GONTAさんによるLEGO GONATAの部屋や、 777さんによるJust To Kill TimeMLCadヘルプ、L&MさんによるMLCadチュートリアルを翻訳などがよいでしょう。

モデリング

モデルを作る方法はいろいろありますが、ここでは現実のLEGOブロックと同じく、ブロックを1個ずつ組み立てていく方法をご紹介します。組み立てにはMLCadというモデリングソフトを使います。MLCadはLDraw.orgからDLできるパッケージにも最初から同梱されています。「パーツを選ぶ・1個ずつ配置」という作業も、現実のLEGOブロックの組み方と全く同じです。

MLCadで作ったデータはLDraw共通のファイル形式(拡張子は*.mpdや*.ldrなど)で保存されるので、LDrawに対応したものであれば様々なソフトで編集や再利用できます。ここではLDViewで開いてみることにします。LDViewも、LDrawパッケージに入っている優秀なツール(GPL)です。

LDView 標準画面
LDViewを使うと、作品を様々な角度から見ることが可能

POV-Ray用のパーツ形状ライブラリで、もっと豊かな表現力を

MLCad上で作品を見るだけでも充分楽しいのですが、より現実のレゴブロックに近い描写を得る方法があります。ここではレイトレーシング(反射や屈折を忠実に再現できる手法)に対応したPOV-Rayというレンダリングツールとパーツ形状ライブラリを使います。パーツ形状ライブラリとは、LEGOブロックの形状(滑らかな曲線など)を詳細に記述したデータのことで、LGEO LibraryAnton’s Libraryなどがあります。

POV-Rayでレンダリングするためには、LDrawのデータをPOV-Ray形式に変換する必要があります。従来はL3Pを使用していましたが、最近ではLDViewから画面の表示通りに出力できるようになり、角度の調整などがやりやすくなりました。L3PとLDrawはいずれもLGEOに対応していますが、レンダリング前には別途POV-Rayの設定(iniファイルなど)でLGEOへのパスを通しておいたほうがよいでしょう。

LEGO#6668 with LGEO
LGEOを使ってPOV-Rayでレンダリング。見栄えが良くなりました。

空の設定

POV-Ray日本語マニュアル(大分大学)を参考に背景をつけてみます。

1
2
3
4
5
6
7
8
9
10
sky_sphere {
    pigment{
        gradient -y
        color_map {
            [0.0 rgb 1]
            [0.2 rgb <0.7,0.8,1.0>]
            [0.6 rgb <0.1,0.2,0.8>]
        }
    }
}

※y軸はマイナスにしてあります。

LEGO#6668 with LGEO
簡単な背景ができました。

ラジオシティ

つづいてPOV-Rayが得意とするラジオシティ(光の相互反射作用を計算する技法)を使ってみます。簡単に使えるインクルード用ファイル「LDraw Radiosity」が用意されています。これにもPOV-Rayでパスを通しておきます。Tutorial: POV-Ray Floor Effectsでも解説されています。

画像のサイズが大きいとレンダリングに時間がかかりますが、最近のコンピュータであれば長くても数時間でしょう。しばらく待っていると先ほどとは見違えるような画像ができあがります。

LEGO#6688 with LGEO
ラジオシティを使ってレンダリングすると、光が白い床に反射して明るく見えます。

上記のインクルードファイルほどではありませんが、次のような簡単なコードを追加するだけでも、多少はラジオシティの効果を確認できると思います。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
global_settings {
     radiosity {
       pretrace_start 0.08
       pretrace_end   0.04
       count 35
       nearest_count 5
       error_bound 1.8
       recursion_limit 3
       low_error_factor 0.5
       gray_threshold 0.0
       minimum_reuse 0.015
       brightness 1
       adc_bailout 0.01/2
     }
}

Anton’s Library

一方、もう一つのパーツ形状ライブラリAnton’s Libraryを使うとどうなるでしょうか。Anton Raves氏はWebにてPOV-Ray形式へのコンバータを公開なさっています。LGEOと比較しますと、Anton’s LibraryはLGEOよりも透明感があるようにも感じられますが、素材設定の違いなのでしょうか。両者はエッジの形状などが異なっているようです。もっとも、毎回Web上のコンバータを使うという点は少し面倒です。

LEGO#6668 with Anton's Library LEGO#6668 with Anton's Library
前者はラジオシティOFF、後者はラジオシティON

撮影用のセットを作ってレンダリングする

ところで、Anton’s Libraryの開発者Anton Raves氏は数多くのLEGO作品を公開なさっています。そのどれもが目を見張るような美しさですが、このようなレンダリングを実現するためには一工夫必要です。Anton Raves氏の作品はPOV-Rayシーンファイルが公開されているので、参考にしてみました。

すぐにできる工夫の一つは、実際のカメラで撮影するのと同じように、POV-Rayシーンファイルの中に撮影用のセットを作って撮影する手法です(当たり前と言えばそれまでですが)。今回の例では、左右に白いボックスを置き、背景にはグラデーションをかけたバックスクリーンを配置します。以下は撮影用セットの要点のみを書いたコードの例です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
union{
#declare Final_town    = 1;
#declare Preview_town  = 4;
#declare Building_test = 7;
#declare Quality = Preview_town;

union{
#switch ( Quality )
  #case ( Final_town )
    //light_source { <500, 500, 0> color white area_light 50*y, 50*z, 5, 5 adaptive 0 jitter }
    #declare nice = color white;
    #declare nice2 = color rgb <.2, .2 ,.8>;
    #declare grad_tex =
    texture {
      pigment { gradient y color_map { [ 0.0 color nice ] [ 0.6 color nice2 ] } }
      finish { basic_finish }
      scale 200
    }
    #break
  #case ( Preview_town )
    //light_source { <-500, 500, -50> color white media_interaction off }
    #declare nice = color white;
    #declare nice2 = color rgb <.2, .2, .8>;
    #declare grad_tex =
    texture {
      pigment { gradient y color_map { [ 0.0 color white ] [ 0.6 color nice2 ] } }
      finish { basic_finish }
      scale 200
    }
    #break
  #case ( Building_test )
    light_source { <500, 500, 0> color white }
    #declare nice = color white;
    #declare nice2 = color rgb <.2, .2 ,.8>;
#end

  // the floor
  box { <-1400, -2, -800> <1400, 0, 900>
    texture { pigment { color nice } } finish { basic_finish }
  }
  #if ( Quality < 7 )
    // the "enclosing world"
    box { <-1400, -1, -750> <1400, 1100, 850> hollow
      texture { pigment { color white } } finish { basic_finish }
    }
    // the background
    union {
      box { <-1400, -2, 849> <1400, 1200, 851>
        texture { finish { basic_finish } pigment { color nice2 } } }
      difference {
        box { <-1400, 0, 649> <1400, 200, 849> }
        cylinder { -1610*x, 1610*x, 200 translate <0, 200, 649> }
        texture { grad_tex }
        //bounded_by { box { <-805, -1, 648> <805, 201, 850> } }
      }
    }
  #end
  rotate <0, 50, 180> translate <0, LDXFloorLoc, 0>
}

軸の方向を合わせるため、最後に撮影セットごと回転させています。その他、さらに照明の位置を直す必要があります。

LEGO#6668
雰囲気が少し変わりましたが、いまひとつでした。

他にも背景にHDRIを使うなど、POV-Rayを使えばいろいろな可能性が広がります。参考までに、今回使用したLDraw用のファイルとPOV-Ray用のファイルを置いておきます。