擬似球面Textureを生成する関数

52 views
Skip to first unread message

genomag

unread,
Sep 26, 2010, 2:20:08 AM9/26/10
to Star Ruby
正方形(※長方形は不可)のTextureを元に擬似球面Textureを生成する関数を作ってみました。
ネットに落ちていたC言語用のソースを機械的にRuby用に修正しました。

需要としては、球状の水やガラス、ファイナルファンタジーのグラビデのような効果も表現できそうです。

動かし方は以下のサンプルを適当に保存し、"earth.png"(※正方形に限る)を同じファイルパスに置いて実行してください。
#####################################

require "starruby"
include StarRuby

# 正方形(※長方形は不可)のTextureを元に擬似球面Textureを生成する関数
def square2circle(texture)
red = Array.new(2){Array.new(2)}
green = Array.new(2){Array.new(2)}
blue = Array.new(2){Array.new(2)}
xs = texture.width / 2
zs = texture.height / 2
rho = 2.0 * xs / Math::PI #ρ
new_texture = Texture.new((rho * 2).ceil, (rho * 2).ceil)

for j in -rho.to_int..rho.to_int
z = rho * Math.asin(j / rho)
if z > 0 then
n = z.to_int
else
n = (z - 1).to_int
end
t = z - n
if t == 1 then
t = 0
n += 1
end

for i in -rho.to_int..rho.to_int
if i * i + j * j > rho * rho then
next
end
y = Math.sqrt(((rho * rho) - (i * i) - (j * j)).abs)
x = rho * Math.atan2(i, y)
if x > 0 then
m = x.to_int
else
m = (x - 1).to_int
end
s = x - 1
if s == 1 then
s = 0
m += 1
end

for k in 0..1
for l in 0..1
red[k][l] = texture[m + xs + k, n + zs + l].red
green[k][l] = texture[m + xs + k, n + zs + l].green
blue[k][l] = texture[m + xs + k, n + zs + l].blue
end
end

r = ((red[0][0] + red[1][0] + red[0][1] + red[1][1]) / 4).to_int
g = ((green[0][0] + green[1][0] + green[0][1] + green[1][1]) /
4).to_int
b = ((blue[0][0] + blue[1][0] + blue[0][1] + blue[1][1]) /
4).to_int

new_texture[i + rho, j + rho] = Color.new(r, g, b)
end
end
return new_texture
end

texture = Texture.load("earth.png")
earth = square2circle(texture)

Game.run(256, 256) do |game|
game.screen.clear
game.screen.render_texture(earth, 0, 0)
end

#####################################
Reply all
Reply to author
Forward
0 new messages