SVX日記
2017-04-27(Thu) 8bit風OpenGLライブラリで8bit風3DCGをグリグリする
3DCGっぽいCGを描いたり、ゼビウスっぽい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
}
}
逆に、以前に2Dのつもりで書いたプログラムも、requireしているライブラリをOpenGL版に差し替えるだけで、拡大、縮小、回転、視点移動が可能になる。
改めてゼビウス軍をモデリングし「ソルバルウもどき」でも作ってみるかなぁ。パッケージを置いておく。