SVX日記

2004|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|

2017-04-27(Thu) 8bit風OpenGLライブラリで8bit風3DCGをグリグリする

  3DCGっぽいCGを描いたりゼビウスっぽい3DCGを描いたりしているうち、3DCGっぽい3DCG(?)を描いてみたくなった。で、長らく、ちまちまと実装を続けていたが……。

  ジャーン。

  画像の説明

  こっちは本物の3DCG。キー操作で拡大、縮小、回転、視点移動が可能だ。

  例によって、いつものTrueLegacyGraphicsライブラリの「OpenGL版」として実装したので、ほぼ、以前のコードのイメージのまま、3Dに対応できてしまうのであった。

     def tile(win, xyzs, b, n, xyz, c)                           # xyzs, bank, n, xyz
         xyzs[b][n] = xyz
         win.polygon3d([ xyzs[b    ][n - 1],
                         xyzs[b    ][n    ],
                         xyzs[b ^ 1][n    ],
                         xyzs[b ^ 1][n - 1] ], c) if(xyzs[b][n - 1] && xyzs[b ^ 1][n - 1])
     end
 
     xyzs = [[], []]
     ix = 0
     (0..360).each {|rx| x0 = 360 - rx
         x0 % 3 != 0 and next
         ix += 1
 
         iz = 0
         (0..360).each {|z0|
             z0 % 3 != 0 and next
             iz += 1
 
             x = 140 + x0                                        #  140 <- 360 ->  500
             z = z0 - 180                                        # -180 <- 360 ->  180
 
             y = (dcos(3 * x0) - 1) * (dcos(2 * z0) - 1) * 60 if(ARGV[0] !~ /bc/)
             y = (dcos(1 * x0) - 1) * (dcos(1 * z0) - 1) * 60 if(ARGV[0] =~ /b/)
             y = (dcos(3 * x0) - 1) * (dcos(3 * z0) - 1) * 60 if(ARGV[0] =~ /c/)
 
             if(ARGV[0] !~ /p$/)
                 win.depth3d(z, 1)
                 win.pset(x, 300 - y, 4)                         #  300 <- 240 ->   60
             else
                 tile(win, xyzs, ix % 2, iz, [x, 300 - y, z], (ix + iz) % 2 == 0 ? 4 : 0)
             end
         }
     }

  3Dのみ対応の関数以外は、2Dと共通なので、requireするライブラリをこれまでのものに差し替えるだけで、2D表示となる。

  画像の説明

  逆に、以前に2Dのつもりで書いたプログラムも、requireしているライブラリをOpenGL版に差し替えるだけで、拡大、縮小、回転、視点移動が可能になる。

  画像の説明

  作ることは面白いのだが、日常の生活で3Dグラフィックスが必要な状況は少なく、活用の幅が狭いのは残念。でも、作ることが面白かったのだからよいのだ。

  改めてゼビウス軍をモデリングし「ソルバルウもどき」でも作ってみるかなぁ。パッケージを置いておく。