mieki256's diary



2020/01/07(火) [n年前の日記]

#1 [love2d] love2dのImageDataについて動作確認

love2d には ImageData なるクラス(?)があるようで。画像の生データを入れて管理できるらしいけど、どういうことができそうなのかちょっとよく分からなかったので、動作確認してみたり。環境は、Windows10 x64 1909 + love2d 11.3。

こんな感じでどうか。

love2d_imagedata_test_ss01.gif

ImageData を使って、グラデーションを作成。カーソルキーの上下で明るさを変える処理も入れてみた。 *1

つまり、ImageData を使えば、1ドットずつ RGBA を指定して画像を作成、みたいなことができるのかな。たぶん。

ソース。 :

_conf.lua
function love.conf(t)
  t.version = "11.3" -- love2d version
  t.window.title = "ImageData test - love2d"
  t.window.vsync = 1
  t.window.width = 640
  t.window.height = 480

  -- t.window.fullscreen = true
  -- t.window.fullscreentype = "exclusive"
end

_main.lua
-- ImageData test on love2d

function make_gradation(imgdata)
  local w, h = imgdata:getDimensions()
  local x, y
  for y = 0, (h - 1) do
    for x = 0, (w - 1) do
      local r, g, b, a
      r = x / (w - 1)
      g = y / (h - 1)
      b = (x / ((w - 1) / 4)) % 1.0
      a = (y / ((h - 1) / 4)) % 1.0
      imgdata:setPixel(x, y, r, g, b, a)
    end
  end
end

function brighten(x, y, r, g, b, a)
  r = math.min(r * 1.5, 1.0)
  g = math.min(g * 1.5, 1.0)
  b = math.min(b * 1.5, 1.0)
  return r, g, b, a
end

function darken(x, y, r, g, b, a)
  r = math.max(r * 0.75, 0.0)
  g = math.max(g * 0.75, 0.0)
  b = math.max(b * 0.75, 0.0)
  return r, g, b, a
end

function love.load()
  love.graphics.setDefaultFilter("nearest", "nearest")
  local w, h = love.graphics.getDimensions()

  imgdata = love.image.newImageData(w, h)
  make_gradation(imgdata)

  img = love.graphics.newImage(imgdata)
end

function love.update(dt)
end

function love.draw()
  love.graphics.clear(0, 0, 0, 1)

  love.graphics.setColor(1, 1, 1, 1)
  love.graphics.draw(img, 0, 0)

  love.graphics.print("Hit Up/Down key", 2, 20)
  love.graphics.print("FPS: " .. tostring(love.timer.getFPS()), 2, 2)
end

function love.keypressed(key, isrepeat)
  if key == "escape" then
    -- ESC key to exit
    love.event.quit()
  elseif key == "up" then
    imgdata:mapPixel(brighten)
    img:replacePixels(imgdata)
  elseif key == "down" then
    imgdata:mapPixel(darken)
    img:replacePixels(imgdata)
  end
end

少し解説。 :

  • imgdata = love.image.newImageData(w, h) で ImageData を作成できる。
  • imgdata:setPixel(x, y, r, g, b, a) で、(x, y) の位置のドットにRGBAを指定できる。
  • love.graphics.newImage(imgdata) で、ImageData から Image を作れる。Image にすれば、Canvas に描画することができる。
  • imgdata:mapPixel(関数) で、ImageData の全ドットに対して処理ができる。
  • Image:replacePixels(imgdata) で、Image の内容を ImageData で置き換えることができる。

RGBAの各値として渡せるのは、0.0 - 1.0 の値で、0 - 255 ではない点に注意。love2d 11.0 より前は 0 - 255 を渡していたけれど、love2d 11.0 以降は 0.0 - 1.0 の範囲になった模様。

何にせよ、こういうクラスがあるのであれば、フィルタ処理等も書けるのかもしれないな…。もっとも、フィルタ処理などは、 _Shader を使ったほうが良さそうかな…。事前に何かしら画像処理をして、そのデータを持っておいて時々使う、といった用途であれば、ImageData は便利なのかもしれない。たぶん。

参考ページ。 :


*1: ただし、今回は、一度明るさを変更すると元のRGB値が微妙に失われていくので、最初の状態には戻らない。

#2 [cg_tools] D5 Render Engineを少し試用

D5 Render Engine なるリアルタイムレンダラー?があるそうで。

_フォトリアリスティックな結果を生み出してくれるD5 Render Engineがリリース | 3DCG最新情報サイト MODELING HAPPY
_D5 Render - リアルタイムレイトレーシングに重点を置いた新レンダリングエンジン(旧:D5 Fusion?)!現在無料ダウンロード可能!

気になったので少しだけ試用してみたり。環境は、Windows10 x64 1909 + Intel Core i5 2500 + RAM 8GB + GeForce GTX 1060 6GB。

D5_Render_installer-cn2-latest.zip をDLして解凍すると、セットアップファイルが出てくる。実行してインストール。

起動したら、ランチャー画面が出てきたけれど。なんだか中国語っぽい文字列が…。中国の方が開発してるのだろうか。そのへんちょっとよく分からない。

サンプルをDLできるっぽい画面が表示されたので、辿ってDL。D5Demo1.zipを入手して解凍。

D5Demo1.drs を開いてみた。右ボタンドラックでカメラ位置を変更できるっぽい。右上のほうに、3Dと、もう一つ足跡っぽいアイコンがあるけれど。足跡っぽいアイコンを選べば、WASD + QE でカメラの移動ができるようで。カメラの向きは右ドラッグ、なのかな。

リアルタイムで描画しているのに、比較的綺麗な画面が出てくる。凄いなあ…。ただ、画像出力レンダリングは、リアルタイムというわけではないようで、若干時間がかかった。

何かの拍子に落ちてしまうこともあるようで、「ビデオドライバをアップデートしてみたらどうかな」的メッセージが表示された。いや、コレを動かす前に、念のために GeForce Driver を 441.66 にアップデートしたんだけど…。GTX 1060 という、ちょっと古いビデオカードだからアレなのかな。

何にせよ、今後に期待してしまうレンダラーだなと…。

#3 [anime] 「BEASTARS」最終回を視聴

BSフジで放送されていた3DCGアニメ、「BEASTARS」最終回を視聴。

凄いアニメだった…。オレンジは凄いな…。「宝石の国」も面白かったけど、コレも面白い…。独特な原作を、最高の映像でアニメ化してるというか…。素晴らしい。

#4 [game] PCエンジンのこともちょっとは思い出してあげてほしい気もする

思考メモ。

Webブラウザのブックマークを整理してたら、しくじり先生なるバラエティ番組の、メガドラ回の視聴を忘れていたことに今頃気づいてしまった。失敗した…。自分、なんで忘れてしまったのか…。

どんな放送内容だったのか気になったのでググってみたら、なるほど、メガドラタワーをネタにして失敗談に仕立て上げたのですな…。アレで笑いが取れるところまで順々に説明していくのは結構大変だったのでは。講師役の方、頑張ったなあ。などと本編を見ていないのに感心してしまったり。

それはともかく。メガCDの話が出てきたあたりで、PCエンジン+CD-ROM^2の存在が無かったことにされて、メガCDが初のCD-ROMゲーム機として紹介されちゃったらしいと知り、なんとなく悲しい気分になったりもして。いやまあ、バラエティ番組向けにメガドラ関係で笑いを取るなら、PCエンジン(以下PCEと表記)が一切出てこないほうが話としてはスッキリするので、それもまた仕方ないのだろうなあ、とも思うのだけど。

PCE + CD-ROM^2の存在は、結構大きいと思うのだよな…。と言うのも、あのハードウェア向けに作られたゲームタイトルの中には、特定のゲームジャンルを確立することに貢献したものが含まれているというか…。

例えば、ときメモ。アレが出てきたことで、その後、恋愛シミュゲーというジャンルが確立して、一時期流行したわけだけど。アレは、メガCDしか市場に存在しない世界線なら出てこないよなと。某社の偉い人達は、メガドラやメガCDは海外市場がメインと捉えてたから、日本国内でしか売れそうにない企画は通さなかったはずで。国内向けとしてシェアを持ってた PCEが存在して、かつ、大容量のCD-ROMが使えるからこそ通った企画というか。

更に、メトロイドヴァニアというジャンル(?)も、PCE + CD-ROM^2 でド○キュラXが作られたから、その発展・改良版としてプレステ1版でスタイルを確立できたのだろうと思うし…。PCE版のスタッフがスーパー32X版を作り始めていたけど、上のほうから、メガドラからも撤退して次世代機向けに開発を集中するぞ、とお達しが出てプレステ版に、という流れだった記憶が…。なので、もしPCE版が無かったら、あのタイミングで、あのジャンル・スタイルが生まれていたかどうか…。 *1

てな感じで、某社の事例のみを考えても、PCE + CD-ROM^2 があったからこそ生まれたジャンル、その後の流れを作った部分ってあるよなーと思うし、更に他社まで範囲を広げたら、PCEがあったおかげでこうなった、みたいな話がたくさんありそうだよなと。

ということで、どうかPCEのことも忘れないで、たまには思い出してあげて…みたいな気持ちになってしまったのでした。

などとメモ。只の思考メモです。
*1: 当時の某社のPCE担当部署ではPCE版とX68K版のド○キュラを作って、メガドラ担当部署ではSFC版とメガドラ版が作られたけど。プレステ版はPCE版の延長だよなと…。そもそもタイトルにXが入ってるし、開発初期メンバーはPCE版の方々だし。もっとも、元メガドラ担当部署の方々も途中で開発に加わってるから、東京開発でこれまで作ってきたアレコレの集大成・全部入りがプレステ版ですよー、ということになるのだろうけど。

2020/01/06(月) [n年前の日記]

#1 [cg_tools] Pixel Studio を試用

Pixel Studio なるドットエディタがあると知ったので試用してみたり。環境は WIndows10 x64 1909。Microsoft Store経由でインストールしてみた。

_Pixel Studio for pixel art - シンプルかつ軽快に動作する無料のピクセルアート(ドット絵)制作ツール!Win&MacOS&iOS&Android

少し触ってみたものの、各アイコンが何の機能を示しているのか、ツールチップすら表示されないので、操作方法がよく分からず。

紹介記事内で symmetry drawing なる文字列を見かけて、すると左右対称描画、上下対称描画ができるのかなと期待したけれど、これまたそのモードを有効にする方法が分からない。

もしかすると、Microsoft Store経由のWindows版はバージョンが古くて全機能が使えないのではないかと思えてきた。スマホ版その他であれば、各種機能を持ってるのかもしれない…? 例えば TIC-80 も、Microsoft Store経由でインストールできる版は、バージョンが古かったりするわけで。Microsoft Store は、そういう状況になってるアプリが多いのだろうか、などと根拠なく勝手に邪推したりもして。

それはともかく。起動時に Unity のロゴが表示されて驚いた。Unity で作ってあるツールなのか…。そういえば、先日触った Pixelorama は Godot Engine で作られていたし、ゲームエンジンの類で実装されたツールって意外と多いのだろうか。

2020/01/05() [n年前の日記]

#1 [love2d] love2dで簡単なペイントアプリモドキを書いてみたり

love2d を使って、簡単なペイントアプリっぽいものを書いてみたり。

こんな感じになった。環境は Windows10 x64 1909 + love2d 11.3。

simplepaint_ss01.gif

ソース。 :

_conf.lua
function love.conf(t)
  t.version = "11.3" -- love2d version
  t.window.title = "Simple paint - love2d"
  t.window.width = 800
  t.window.height = 600

  -- VSync Off
  t.window.vsync = 0

  -- t.window.fullscreen = true
  -- t.window.fullscreentype = "exclusive"
end

_main.lua
-- Simple paint on love2d

function love.load()
  love.graphics.setDefaultFilter("nearest", "nearest")
  font = love.graphics.newFont(20)

  scrw = love.graphics.getWidth()
  scrh = love.graphics.getHeight()
  canvas = love.graphics.newCanvas(scrw, scrh)

  bg = make_checker_canvas(scrw, scrh)

  love.graphics.setCanvas(canvas)
  love.graphics.clear(0, 0, 0, 0)
  love.graphics.setCanvas()

  mx, my = 0, 0
  req_clear_canvas = false
  req_export = false

  msg_timer = 0
  msg_str = ""
end

function love.update(dt)
  mx, my = love.mouse.getPosition()

  if req_clear_canvas then
    -- clear canvas
    req_clear_canvas = false
    msg_timer = 0.75
    msg_str = "Clear canvas"
    love.graphics.setCanvas(canvas)
    love.graphics.clear(0, 0, 0, 0)
    love.graphics.setCanvas()
  end

  if love.mouse.isDown(1) then
    -- draw brush
    love.graphics.setCanvas(canvas)
    love.graphics.setColor(0, 1, 0, 1)
    love.graphics.circle("fill", mx, my, 8)
    love.graphics.setCanvas()
  end

  if req_export then
    -- export canvas
    req_export = false
    msg_timer = 0.75
    local filename = os.date("%Y-%m-%d_%H-%M-%S") .. ".png"
    if export_canvas(canvas, filename) then
      msg_str = "Export " .. filename
    else
      msg_str = "Can not export."
    end
  end

  if msg_timer > 0 then
    msg_timer = msg_timer - dt
    if msg_timer <= 0 then
      msg_timer = 0
    end
  end
end

function love.draw()
  love.graphics.setCanvas()
  love.graphics.clear(0, 0, 0, 1)

  -- draw bg
  love.graphics.setColor(1, 1, 1, 1)
  love.graphics.draw(bg)

  -- draw canvas
  love.graphics.draw(canvas)

  -- draw cursor
  love.graphics.setColor(1, 1, 1, 1)
  love.graphics.circle("line", mx, my, 8)

  -- draw text
  love.graphics.setFont(font)
  love.graphics.setColor(1, 1, 1, 1)
  if msg_timer > 0 then
    love.graphics.print(msg_str, 2, 40)
  end

  love.graphics.print("C)lear S)ave", 10 * 10, 2)
  love.graphics.print("FPS: " .. tostring(love.timer.getFPS()), 2, 2)
end

function love.keypressed(key, isrepeat)
  if key == "escape" then
    -- ESC key to exit
    love.event.quit()
  elseif key == "s" and msg_timer == 0 then
    req_export = true
  elseif key == "c" then
    req_clear_canvas = true
  end
end

function export_canvas(canvas, filename)
  local imagedata = canvas:newImageData()
  local filedata = imagedata:encode("png")

  local filepng = io.open(filename, "wb")
  if filepng ~= nil then
    filepng:write(filedata:getString())
    filepng:close()
    return true
  end
  return false
end

function make_checker_canvas(w, h)
  local cnavas = love.graphics.newCanvas(w, h)
  cnavas:renderTo(
    function()
      local start = true
      local sz = 8
      local x, y
      for y = 0, (h - 1), sz do
        local fg = start
        for x = 0, (w - 1), sz do
          local c = fg and 0.6 or 0.4
          love.graphics.setColor(c, c, c, 1)
          love.graphics.rectangle("fill", x, y, sz, sz)
          fg = not fg
        end
        start = not start
      end
    end
  )
  return cnavas
end

conf.lua と main.lua を任意のフォルダに入れて、「love フォルダ名」で実行できる。

少し解説。 :

やってることは以下。
  • 初期化処理(love.load()内)で、ウインドウサイズと同じサイズの Canvas を作成して。
  • 更新処理(love.update(dt)内)で、マウス左ボタンが押されてたら Canvas に緑色の丸を描画。
  • 描画処理(love.draw()内)で、Canvas を画面に描画。

conf.lua 内で、t.window.vsync = 0 を書いて、VSYNC を無効にしてるあたりにちと注意、だろうか。

love2d は、何も設定しないデフォルト状態なら VSYNC が有効になっている。その状態だと更新処理が60FPS前後で呼ばれるので、マウスを動かして画面に何か描こうとすると、軌跡(?)がかなり飛び飛びになってしまう。 *1

しかし、VSYNCを無効にすれば、更新処理が呼ばれる頻度が多くなるので、それほど飛び飛びにはならなかった。手元の環境では、500FPS前後で更新処理が呼ばれてるっぽい。

もっとも、本来は、マウスカーソルが動いた時だけ、距離に応じて線を引くように実装すべきかなと…。そう考えると、マウスカーソルを動かした時に呼ばれるコールバック関数( _love.mousemoved() )を用意して処理したほうがいいのかもしれない。

love2d の API についても一応メモ。
  • love.graphics.setCanvas(canvas) で、指定した canvas を対象にして描画できるようになる。
  • love.graphics.setCanvas() で、デフォルトのキャンバスに対して描画できるようになる。
  • canvas:renderTo(func) で、canvas に対して関数 func の処理を実行することもできる。
  • love.graphics.circle("fill", x, y, r) で、(x,y) を中心にして塗り潰した円を描画。
  • love.graphics.circle("line", x, y, r) で、(x,y) を中心にして線のみの円を描画。
  • love.graphics.rectangle("fill", x, y, w, h) で、四角形を描画。

_love.graphics.setCanvas (日本語) - LOVE
_Canvas:renderTo (日本語) - LOVE
_love.graphics.circle (日本語) - LOVE
_love.graphics.rectangle (日本語) - LOVE

さておき。こういう処理を書けたのだから、お絵描きツールっぽい何かしらを、love2d を使って書くことだって不可能ではなかったりするのかもしれないなと…。

*1: 液晶ディスプレイ側のリフレッシュレート設定によって、VSYNC有効時のFPSが違ってくるのかもしれない。自分は120Hz等の液晶ディスプレイを持っていないので、そのあたりは確認できず。

#2 [tv] 「チャンネルはそのまま! 」を視聴

たまたまTVをつけていたら、「チャンネルはそのまま! 」なる実写ドラマが流れ始めたので、つい見てしまった。今回は、1話と2話が放送されていたらしい。

北海道のTV局を舞台にしたドラマ。どこかで見たような設定だなと思ったら、漫画「動物のお医者さん」で有名な佐々木倫子先生の漫画作品を原作としたドラマだったのだな…。たしか、原作の最初のあたりだけ、ちょっと読んだような記憶があるわけで。

少なくとも、1話と2話はかなり面白かった。TV業界の独自用語についても勉強になったし…。何より、日常的にTVで流れているのが当たり前の、視聴者側が普段全く気に留めていないアレコレに対し、それぞれをドラマとして盛り上げて、どこか感動的なシーンとして見せてしまうあたりが秀逸というか。

テロップで、登場人物の心の声や精神状態を伝える見せ方も興味深かった。漫画原作の、独特の書き文字を、ドラマ版でも再現していたような気がしたり。

もっとも、漫画の場合は背景を白くして文字が読み易い状態にできるけど、実写ドラマは背景に現実の風景が入ってしまうため、視覚情報が多くなりがちで。そのせいか、テロップがちょっと読み辛い部分はあったけど。一応、テロップを白く縁取りする等、文字情報と背景を分離する努力をしていた気配は感じたけれど。そのあたり、まだもうちょっと、微妙な工夫が必要だったりするのかもしれない。見せ方自体は全然アリだと思えるので、技を発明・発見して使いこなしてほしいなと。

元々は Netflix で独占先行配信されたドラマらしい。何かの賞も取っているそうで。なるほど。さすが Netflix 向け作品、なのだろうか…。

何にせよ、視聴する気は全く無かったのに、結局最後まで見てしまったあたり、これはかなり良い出来のドラマなのではなかろうか。実に良いものを見せていただきました。これはフツーに面白い。素晴らしい。

以上、3 日分です。

過去ログ表示

Prev - 2020/01 -
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

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project