genomag
unread,Sep 26, 2010, 2:20:08 AM9/26/10Sign in to reply to author
Sign in to forward
You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
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
#####################################