mieki256's diary



2024/03/18(月) [n年前の日記]

#1 [prog] C言語とOpenGLで疑似3D道路の描画実験中。その5

C言語 + OpenGL + glfw を使って実験中。疑似3D道路を描画してみたい。

_昨日、 C言語で書いた疑似3D道路を描画するプログラムを、省電力CPUを載せてるサブPC上で動かしてみたところ、30 - 37FPS ぐらいしか出なくてガッカリしたのだけど、他のサブPC上で動かしたらどうなるのか気になったので試してみた。

サブPCのスペック :

1つは、Core i3-6100T機。
  • CPU : Intel Core i3-6100T (2C/4T, 3.2GHz, 35W, 第6世代)
  • GPU : 内蔵GPU Intel HD Graphics 530 (350 - 950MHz)
  • RAM : 8GB
  • OS : Ubuntu Linux 22.04 LTS 64bit
  • 画面解像度 : 1920 x 1080

1つは、Core i5-2500機。
  • CPU : Intel Core i5-2500 (4C/4T, 3.3 - 3.7GHz, 95W, 第2世代)
  • GPU : 内蔵GPU Intel HD Graphics 2000 (850MHz - 1.10GHz)
  • RAM : 8GB
  • OS : Ubuntu Linux 20.04 LTS 64bit
  • 画面解像度 : 1920 x 1200

1つは、A6-3500機。
  • CPU : AMD A6-3500 (3C/3T, 2.1 - 2.4GHz, 65W)
  • GPU : 内蔵GPU Radeon HD 6530D (443MHz)
  • RAM : 8GB
  • OS : Linux Mint 21.1 64bit
  • 画面解像度 : 1920 x 1200

結果 :

i3-6100T機は60FPSで動いてくれた。Intel第6世代CPU、しかも省電力タイプなのに60FPSで描画してくれたのは助かる…。例えば今現在2万円台で買えるミニPCには Intel N100 を載せてる製品が多いけど、その N100 が第8世代と同じくらいの性能らしいので…。第6世代の i3-6100T で60FPSが出るなら、第8世代相当と言われる Intel N100 でも、おそらく60FPSで動いてくれそうな気がする。

i5-2500機は、なかなか厳しい結果になった。16 - 60FPS で描画されている。道路と背景しかない場所なら60FPSで滑らかに動くけれど、ビルボードがたくさんある場所に来ると酷い時は 16FPS まで落ち込む。もう画面がガックンガックン。紙芝居かと思うほど。まあ、第2世代だし、内蔵GPUが圧倒的に非力なのだろうけど…。

A6-3500機も、ちと厳しい結果になった。34 - 60FPS で描画されている。i5-2500機と同様に、道路と背景だけなら60FPSで動くけど、ビルボード密集地は34FPSまで落ち込む。それでも30FPSを下回らないあたり、当時としては比較的スペックが高いとされていた内蔵GPUを載せてるだけのことはあるなと…。

何はともあれ、ビルボードの描画で、昔の非力な内蔵GPU達が悲鳴を上げてるようではあるなと…。ビルボードを描画しないモードをつけておいたほうがいいのかもしれない。

ビルボードを一部削ってみた :

木のビルボードが出てくると描画が重くなってる印象を受けたので、試しに、木のビルボードは草のビルボードに置き換えてしまう処理を入れてみた。

件のモードをつけたことで、A6-3500機上では常時60FPSが出るようになった。

ただ、i5-2500機上では、一応フレームレートが改善したものの、法面ビルボードが出てくるあたりでググッとフレームレートが落ちてしまう。法面の有無は結構印象を変えてくれる気もするけれど、一応出さないモードもつけておくか…。

Linuxで時間を取得するあたりでハマった :

Ubuntu Linux 22.04 / 20.04 LTS でもビルドできるようにソースを修正するあたりで少しハマった。そもそも、Linux + C言語で時間取得をする方法が分からなくて…。

最初は clock() を使ったけれど、自分の使い方が間違ってたのか、頓珍漢な時間を取得する状態になってしまったようで、カメラの移動速度その他が珍妙なことに…。clock_gettime() を使ったら、どうにかそれらしい値が取得できたっぽい。

_時間情報の取得 clock() - 時間の扱い - 碧色工房
_時間情報の取得 clock_gettime() - 時間の扱い - 碧色工房

ただ、clock_gettime() 等を使う際、Windows + Visual Studio Code の環境で自動補完機能(IntelliSense)が働いてくれなくて、ソースを書くのがちょっと面倒な状態になった。普段は Visual Studio Code に対して MinGW gcc 9.2.0 を設定しているのだけど、どうやら MinGW gcc 9.2.0 では、clock_gettime() や CLOCK_MONOTONIC が利用できないようで…。Visual Studio Code の 「C/C++ : 構成の編集 (UI)」で、MSYS2 gcc 13.2.0 (D:/msys64/mingw64/bin/gcc.exe) を利用するようにしてみたら改善された。

Linux上のvsync :

今現在、glfw で glfwSwapInterval(1) を指定することで、vsync をチェックしてダブルバッファを切り替えるようにしているはずだけど、Windows10 x64 22H2上のみならず、Linux実機上でも vsync をチェックしてくれるようで、その点は助かった。もし vsync を見ていなかったら時々60FPS以上のフレームレートになるはずだけど、今のところ60FPSは超えてないので…。これは vsync を見てくれてるようだなと。もっとも、液晶ディスプレイで表示しているのに vsync 云々というのもなんだかよく分からない状態なのだけど…。

#2 [prog] 1つのMakefileでWindowsとLinuxに対応させたい

1つのMakefileで、Windows と Linux の両方に対応させたい。どうしたらいいのだろう。

以下が参考になった。ありがたや。

_【make】Makefile内の記述をWindowsとLinux両対応にする│株式会社シーポイントラボ|浜松のシステム・RTK-GNSS開発

ifeq ($(OS),Windows_NT)
# Windows

else
# Linux

#endif

一例。以下のように書いたら動いてくれた。
SRCS = 04_ps3d_bb.c

ifeq ($(OS),Windows_NT)
# Windows
TARGET = 04_ps3d_bb.exe
GCC_VERSION=$(shell gcc -dumpversion)

ifeq ($(GCC_VERSION),6.3.0)
# MinGW gcc 6.3.0
LIBS = -static -lSOIL -lopengl32 -lglu32 -lwinmm -lgdi32 -lglfw3dll -mwindows
else
# MinGW gcc 9.2.0, MSYS2
LIBS = -static -lSOIL -lopengl32 -lglu32 -lwinmm -lgdi32 -lglfw3 -mwindows
endif

else
# Linux (Ubuntu Linux 22.04 LTS, gcc 11.4.0)
TARGET = 04_ps3d_bb
LIBS = -lSOIL -lGL -lGLU -lglfw -lm
endif

all: $(TARGET)

$(TARGET): $(SRCS) glbitmfont.h Makefile
    gcc $< -o $@ $(LIBS)

.PHONY: clean
clean:
    rm -f $(TARGET) *.o

OpenGLを使う時のライブラリ指定 :

ついでなので、MinGW gcc や Linux + gcc で、OpenGL, glfw(glfw3), SOIL を使ってるプログラムをビルドする時のライブラリ指定もメモ。

Windowsの場合。
gcc hoge.c -o hoge.exe -static -lSOIL -lopengl32 -lglu32 -lwinmm -lgdi32 -lglfw3 -mwindows
or
gcc hoge.c -o hoge.exe -static -lSOIL -lopengl32 -lglu32 -lwinmm -lgdi32 -lglfw3dll -mwindows

Linux (Ubuntu Linux (22.04|20.04) LTS) の場合。
gcc hoge.c -o hoge -lSOIL -lGL -lGLU -lglfw -lm

ちなみに、Ubuntu Linux で SOIL(Simple OpenGL Image Library) や glfw3 を使いたい時はパッケージをインストールするだけで済む。
sudo apt install libsoil-dev
sudo apt install libglfw3-dev

2023/03/18() [n年前の日記]

#1 [cg_tools] ffmpegで連番画像からアニメgifを作りたい

ffmpeg を使うと連番画像から動画ファイルを作れたりするけど、アニメgifを作るにはどうしたらいいのか…。

以下で解説されてた。ありがたや。

_ffmpegで連番画像からGIFを作成 / 解像度変更 / 逆再生 - Qiita
_PNG連番画像からGIFパラパラアニメをつくる | air-h-128k-il@phazor
_Linux/ffmpeg - Takuya Miyashita

手順としては以下。まずは連番画像内の色を調べて、パレット用画像 palette.png を作成する。
ffmpeg -i input%04d.png -vf palettegen palette.png
ちなみに、「%04d」と書くことで、0000 - 9999 が指定できる。「%06d」なら 000000 - 999999 になる。

連番画像とパレット用画像を指定しつつ、アニメgifを作る。
ffmpeg -f image2 -r 24 -i input%04d.png -i palette.png -filter_complex paletteuse output.gif
-r 24 で、24FPSを指定してる。もっとも、アニメgif はwait値を1/100秒単位でしか指定できなかった記憶があるので、おそらく近似値になるのだろう…。

注意点その1。Windows上でbatファイルを書いて自動処理したい場合、「%」は「%%」と書く必要がある。例えば「%04d」は「%%04d」と記述することになる。

注意点その2。ffmpeg が「ファイルを上書きするか? (y/N)」と尋ねてくる時があるけれど、-y も指定しておけば、デフォルトで「y」を入力したものとして動作してくれる。

ffmpegの入手先 :

_Download FFmpeg
_Builds - CODEX FFMPEG @ gyan.dev

今回は gyan.dev の、release builds、ffmpeg 6.0 を利用させてもらった。ffmpeg-6.0-full_build.7z を入手して解凍。

essentials build と full build の2種類があるけれど、一般的な用途なら essentials build で十分で、full build はそれ以外の機能も入ってる、と書いてあるように見える。libraries の項に、内包してるライブラリが列挙されてるけれど、たしかに essentials build で大体のことはできそう。

#2 [windows] Lightshotというソフトが妙なモノを残す

Windows10 x64 22H2上で、System Explorer を使ってアプリの起動ログを眺めてたら、妙なプログラムが実行されていることに気づいた。

_System Explorer - k本的に無料ソフト・フリーソフト

実行されていたのは以下。
C:\Program Files (x86)\Skillbrains\Updater\1.8.0.0\Updater.exe

ググってみたら、Lightshot というスクリーンキャプチャソフトについてくるアップデートチェックプログラムらしい。そういえば、たしか以前試用して、しっくりこなかったのでアンインストールしたような気がする…。アンインストールしても、アップデートチェックプログラムだけは残ってしまう作りなのだな…。

以下のページのコメント欄でも、そのあたりの報告が上がっていた。

_Lightshot の評価・使い方 - フリーソフト100

タスクスケジューラを起動して、以下の2つを右クリックして削除した。削除するのが不安な場合は「無効」にしておくだけでも良さそう。
update-S-1-...
update-sys
選択してから、下のほうの「操作」タブをクリックすれば、どのプログラムが実行されるのか確認することができる。前述のプログラムのパスが記述されてたら、Lightshot のソレ。

#3 [anime] 「タメツメ」という言葉は危ない

アニメ関係のアレコレを眺めてたら、「タメ」「ツメ」という言葉は、手描きアニメ業界とCG業界の間で、真逆の意味で使われちゃってるという話を見かけた。ナニソレ怖い。怖いから一応メモしておく。

_[B! タメツメ誤用問題]

得たい結果が完全に真逆じゃないですか…。怖い…。そんなの絶対に事故が起きるやん…。

手描きアニメ業界の中だけ、もしくは、CG業界の中だけでその言葉を使う分には問題無いのだろうけど。業界間で指示が行き来する時は「タメ」「ツメ」という言葉を安易に使わないほうがいいのだろうな…。いやはや、怖い…。

手描きアニメ業界は、動きに関して動画枚数の増減で捉えるけれど、CG業界はタイムライン上での時間の長さの増減で捉えてしまう傾向があるので、それで言葉の意味が違ってしまったのでは、という推測を目にしてなんだか納得。常に枚数を意識せざるをえない手描きアニメ業界と、枚数なんて気にしなくてもいいCG業界の違いがそこにあったのだろうか…。

2022/03/18(金) [n年前の日記]

#1 [nitijyou] 雪と雨

朝は雪が積もってた。夕方は雨。犬の散歩がシンドイ…。買出しにも行きたかったけど、この天気では…。

#2 [anime][neta] 「ヴァイオレット・エヴァーガーデン外伝 永遠と自動手記人形」を視聴

以前地上波で放送されたソレを録画したまま見れてなかったので消化。放送日は2021/11/05だったらしい。京都アニメーション作品。TVアニメの外伝・劇場版。例の事件の前日に完成していた作品らしい。

フツーにいい話だった気がする。自分も歳なので、 幼女が泣くシーンはどうにも貰い泣きしてしまうなと…。

考えてみたら、携帯電話が普及してしまった現代を舞台にしてしまうと成立しない話なのかなと。手紙というアイテム/伝達手段が主流として使われてる時代設定だから作れる話というか。いや、携帯電話も使い方次第だろうか。例えば「ほしのこえ」などは上手に使ってみせた気がする。まあ、どちらも伝わるまでにタイムラグがあるとか、その瞬間の相手の表情等は分からないあたりが、話を作る上では便利だったりするのかなと。

思いを伝える何かしら。 :

その手のお話において、人の思いを伝えるための何かしらは、上手に使えると効果絶大なわけだけど。そういえば、ヒロインのペンダントも、その何かしらに相当するのだろうか。つまり、手紙や電話以外でも、思いを伝える何かしらは用意できるのだな。

例えば、「ニュー・シネマ・パラダイス」のアレだって、その何かしらだよな…。他にも、 写真がソレになってたPIXARアニメもあった気がする。

であれば、例えば祖父が孫に残してくれた巨大ロボットもその何かしらに仕立て上げたり、というのはちょっと難しいか…。車とかバイクとかそのあたりなら、まだそれっぽくできるだろうか。あるいは楽器とか。工具とか。銃とか。「銀河鉄道999」の戦士の銃はビミョーに近いような、全然違うような。

PCを、その何かしらにするのは難しいだろうか。と思ったけど、それはアレだな。 「よりもい」だな…。アレも上手かった。

まあ、色々と手はあるのだなと…。

祖父が残してくれた巨大ロボットと、祖父が残してくれた楽器では、印象が全然違うよな…。

2021/03/18(木) [n年前の日記]

#1 [godot] Godot EngineのVehicleBodyノードについてまだまだ調べてる

_昨日 に引き続き、以下の動画を参考にしつつ、Godot Engine 3.2.3 x64 上で VehicleBody について使い方を調べているところ。

_Godot Vehicle Tutorial part 1 - import and setup a car - YouTube
_BastiaanOlij/vehicle-demo at Part-1

指定の branch を git clone したい。 :

github から git clone して、プロジェクトをローカルにダウンロードしてみようとしたのだけど、最新版(Part6)の実装状態しか落ちてこない…。ググってみたら、github から clone すると最新版しか落ちてこないそうで。

branch を指定して clone する時は、「-b ブランチ名」を追加すれば良いらしい。
git clone -b Part-1 https://github.com/BastiaanOlij/vehicle-demo.git

_リモートから特定のブランチを指定してcloneする - Qiita
_リモートのブランチをcloneする - Qiita

これで、Part-1 の状態で git clone できた。

VehicleBodyノードの構成。 :

VehicleBody ノードを使う時は、おおよそ以下のような構成になるらしい。
Car : VehicleBody
│
├─ Body : MeshInstance (車体のメッシュ)
│
├─ front_left : VehicleWheel (左前タイヤ)
│   │
│   └─ MeshInstance (タイヤホイールのメッシュ)
│
├─ front_right : VehicleWheel (右前タイヤ)
│   │
│   └─ MeshInstance (タイヤホイールのメッシュ)
│
├─ rear_left : VehicleWheel (左後ろタイヤ)
│   │
│   └─ MeshInstance (タイヤホイールのメッシュ)
│
├─ rear_left : VehicleWheel (右後ろタイヤ)
│   │
│   └─ MeshInstance (タイヤホイールのメッシュ)
│
└─ CollisionShape (車体のアタリ範囲)

  • VehicleBody ノードの下には、車体の3Dモデルメッシュ (MeshInstance)、タイヤホイールを担当する VehicleWheel x タイヤ個数、車体のアタリ範囲 (CollisionShape) がぶら下がる。
  • VehicleWheel ノードの下には、タイヤホイールの3Dモデルメッシュ (MeshInstance) がぶら下がる。

2020/03/18(水) [n年前の日記]

#1 [neta][cg_tools] 3D空間で位置合わせするのが面倒

某3Dゲームを触っていて、ふとなんとなく、3D空間で位置合わせするのってかなり面倒だなー、と思えてきて。 *1 まあ、自分達が使っている表示デバイスは2Dしか表示できないので、奥行きまで把握しづらいのは当たり前なのだけど…。

このあたり、何か上手い解決方法って無いのかな。

自分が blender を使って作業する時、カーソル位置の把握はどうしてたかなと思い返してみると…。 パースがかかっていると、位置の把握が難しいのだよな…。また、正面、側面、上面を、次々と瞬時に切り替えて表示することで、カーソルや頂点が3D空間のどのへんに位置しているかを無意識に把握している気配もあるなと。複数の視点からの映像を得ることで、脳内に3D空間を作っている、とでもいうか…。

ただ、結局のところ、一つの視点からの情報だけでは、位置の把握はほぼ不可能で…。最低限、2ヵ所から見た映像(?)を目にしないと、3D空間での位置の把握は難しい。

自分、blenderを使う前は、Shadeを使っていたけれど。Shadeの場合はどうだったかなと思い返すと…。 4画面構成は、一画面分の面積が小さくなって、ちょっと細かいところが見辛いけれど、目を泳がせるだけで位置の把握ができる、というメリットはあったなと…。また、ラージカーソル(画面を横切るような十字線)は、他のオブジェクトとの位置合わせが楽だった。

そこから考えるに、以下のような策がありそうだなと…。
そういえば、立体視機能を使ったモデリング作業ってのはどうなんだろう。アレはどの程度実用的なのだろうか…。

そもそも位置を把握しなくてもよいのでは。 :

考えてみたら、そもそも位置を把握しなくてもいいのかもしれない。他のオブジェクトのこのあたりにくっつけたい、みたいな要求であれば、だけど…。動かしたい物体と、基準にしたい物体を選択して、前者を後者にぶつけて位置を止めてやれば、ある程度は目的が叶えられるのではないか…。

blender で言えば、Drop to Ground アドオン、みたいな感じで…。

_[2.8]Drop to Ground →???|MITSUDA Tetsuo|note

本当にやりたいことは、例えば人物モデルの目の端に涙オブジェクトをくっ付けたい、みたいな話であって…。コンピュータがイイ感じに自動でやってくれないから、目視と手作業になるし、となると位置の把握が、という話になってしまうのだよな…。

コンピュータが計算してイイ感じにくっつけたり、貼り付くように変形してくれますよ、という機能があれば、人間様が位置を把握する行為は不要、となりそうな気もする。

もっとも、どうしたってある程度は、3Dモデルをこのへんに手作業で配置、という過程が入ってきてしまうので、位置の把握がしやすい何かが盛り込んであれば、あらゆる場面で、便利で快適にはなるのだろうけど…。

でもまあ、位置合わせに関しては、「ドリルを買いにきた人が欲しいのはドリルではなく『穴』である」という話のような気もする…。

*1: 時々急に思い出したように、某3DゲームのStudioモードを起動して、Sceneの作り方を勉強しようとするものの、なんだか面倒臭くなってちゃんと把握しないまま終了、てなことを何年も繰り返していたのだけど。さすがにそろそろちょっとだけ、少しは操作方法が分かるようになってきて、3Dモデルの配置などをしていた際に、「あー。コレ、面倒臭いな」「不便だな」と感じたわけで。

2019/03/18(月) [n年前の日記]

#1 [ruby][gosu] gosu + opengl-bindings を試しているところ

手元のスクリプトは Ruby + gosu + opengl を前提にして書いていたけど、せっかくだから gosu + opengl-bindings でも動くように修正しているところ。

作業をしていてちょっと気になる箇所が出てきた。OpenGL関連の処理部分で自作(?)シェーダを動かしてしまうと、その後の gosu側の描画がおかしくなる模様。例えば、OpenGL で何かしらを描画したその上に、gosu側でテキストを描画すると、テキストが正常に描画できなくなるようで。

おそらく、gosu側で使うはずの、本来のシェーダを書き換えてしまっているから、そういう症状が発生してしまうのではないかなと。であれば、全てを OpenGL で描画してしまうか、あるいは OpenGL で描画し終わった後に、gosu側相当のシェーダを作っておいて指定し直してから、gosu側に処理を返す、といったことになりそうな。

自作シェーダを使わないなら、そういう症状は出ないような感じがする。フツーにテキスト表示ができたので。

2018/03/18() [n年前の日記]

#1 [ruby][mruby] MSYS2上でCのプログラムにmrubyを組み込んでSDL2を使う

Windows10 x64 + MSYS2 上で、SDL2を使うCプログラムに、mrruby 1.4.0 を組み込んで、スプライト相当を描画できそうか実験。

DXRuby作者様が、mruby + SDL をビルドする記事を以前公開されていたので、参考にして作業。ありがたや。

_SDL_imageとmrubyを使ってみた - mirichiの日記

MSYS2上にSDL2関係をインストール。 :

MSYS2上でSDL2関係のアレコレをインストールする手順については、 _2018/03/13の日記 にメモしてあるけど…。MSYS2は pacman というパッケージ管理ツールが入ってるので…。
  • pacman -Ss SDL2 で関連パッケージをリストアップ。
  • pacman -S 〜 でパッケージをインストール。
これだけでインストールできる。ありがたや。

mruby 1.4.0のファイル一式を入手。 :

_Releases - mruby/mruby から、mruby 1.4.0 の zip をダウンロード。

フォルダ構成。 :

今回は以下のフォルダ構成にした。
~/prg
|
+---- mruby
      |
      +---- glmrubysdl2
      |
      +---- mruby
  • ~/prg/mruby/mruby/ 以下に、mruby 1.4.0 のファイル一式を入れる。
  • ~/prg/mruby/glmrubysdl2/ 以下に、今回書いたプログラム群を入れる。

mruby 1.4.0 をビルド。 :

cd ~/prg/mruby/mruby
make

今回試したソース。 :

glmrubysdl2/ 以下に、
  • glmrubysdl2.c ... Cで書いた、SDL2を使うプログラムのソース
  • main.rb ... mruby に渡す、mrubyスクリプト
  • Makefile ... ビルドするための Makefile
  • sample.png ... 使用画像
を入れた。

_glmrubysdl2.c
#include <stdio.h>
#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>
#include <mruby.h>
#include <mruby/class.h>
#include <mruby/data.h>
#include <mruby/compile.h>
#include <mruby/variable.h>

SDL_Window *mwindow;
SDL_Renderer *renderer;

struct RClass *cSprite;

// class work
struct glmrb_sprite
{
  SDL_Surface *surface;
  SDL_Texture *texture;
  int width;
  int height;
};

static void glmrb_sprite_free(mrb_state *mrb, void *ptr);

static struct mrb_data_type mrb_sprite_type = {"Sprite", glmrb_sprite_free};

struct Timer
{
  Sint64 now, interval;
  // Uint32 now, wit, lev;
} timer;

/* Sprite#initialize */
static mrb_value
glmrb_sprite_initialize(mrb_state *mrb, mrb_value self)
{
  struct glmrb_sprite *sprite;
  mrb_value vx, vy;
  char *s;

  sprite = (struct glmrb_sprite *)mrb_malloc(mrb, sizeof(struct glmrb_sprite));
  if (sprite == NULL)
  {
    SDL_Log("Out of memory.\n");
    mrb_raise(mrb, E_RUNTIME_ERROR, "out of memory.");
  }

  DATA_TYPE(self) = &mrb_sprite_type;
  DATA_PTR(self) = sprite;
  sprite->width = 0;
  sprite->height = 0;
  sprite->surface = NULL;
  sprite->texture = NULL;

  // get paramater, o:Object [mrb_value], z:String [mrb_value]
  mrb_get_args(mrb, "ooz", &vx, &vy, &s);

  mrb_iv_set(mrb, self, mrb_intern(mrb, "@x", 2), vx);
  mrb_iv_set(mrb, self, mrb_intern(mrb, "@y", 2), vy);

  // load image file
  sprite->surface = IMG_Load(s);
  if (sprite->surface == NULL)
  {
    SDL_Log("Cannot create SDL_Surface.\n");
    mrb_raise(mrb, E_RUNTIME_ERROR, "Cannot create SDL_Surface.");
  }
  else
  {
    // get image width and height
    sprite->width = sprite->surface->w;
    sprite->height = sprite->surface->h;
  }

  // create texture
  sprite->texture = SDL_CreateTextureFromSurface(renderer, sprite->surface);
  if (sprite->texture == NULL)
  {
    SDL_Log("Cannot create SDL_Texture.\n");
    mrb_raise(mrb, E_RUNTIME_ERROR, "Cannot create SDL_Texture.");
  }

  return self;
}

/* Sprite#draw */
static mrb_value glmrb_sprite_draw(mrb_state *mrb, mrb_value self)
{
  struct glmrb_sprite *sprite = DATA_PTR(self);
  SDL_Rect src, dst;

  src.x = 0;
  src.y = 0;
  src.w = sprite->width;
  src.h = sprite->height;

  dst.x = mrb_fixnum(mrb_iv_get(mrb, self, mrb_intern(mrb, "@x", 2)));
  dst.y = mrb_fixnum(mrb_iv_get(mrb, self, mrb_intern(mrb, "@y", 2)));
  dst.w = src.w;
  dst.h = src.h;

  // SDL_BlitSurface(sprite->surface, &src, mwindow, &dst);
  SDL_RenderCopy(renderer, sprite->texture, &src, &dst);
  return self;
}

/* Sprite#width */
static mrb_value glmrb_sprite_width(mrb_state *mrb, mrb_value self)
{
  struct glmrb_sprite *sprite = DATA_PTR(self);
  return mrb_fixnum_value(sprite->width);
}

/* Sprite#height */
static mrb_value glmrb_sprite_height(mrb_state *mrb, mrb_value self)
{
  struct glmrb_sprite *sprite = DATA_PTR(self);
  return mrb_fixnum_value(sprite->height);
}

static void glmrb_sprite_free(mrb_state *mrb, void *ptr)
{
  struct glmrb_sprite *sprite = ptr;

  if (sprite->texture != NULL)
    SDL_DestroyTexture(sprite->texture);

  if (sprite->surface != NULL)
    SDL_FreeSurface(sprite->surface);

  mrb_free(mrb, sprite);
}

// quit check
int quits(void)
{
  SDL_Event events;
  if (SDL_PollEvent(&events))
  {
    switch (events.type)
    {
    case SDL_QUIT:
      return 0;
      break;
    case SDL_KEYDOWN:
      if (events.key.keysym.sym == SDLK_ESCAPE ||
          events.key.keysym.sym == SDLK_q)
        return 0;
      break;
    default:
      break;
    }
  }
  return 1;
}

int main(int argc, char *argv[])
{
  FILE *fp;
  mrb_value mrb_obj;

  // mruby state open
  mrb_state *mrb = mrb_open();
  if (mrb == 0)
  {
    SDL_Log("Cannot open mruby state.\n");
    return -2;
  }

  // define class
  cSprite = mrb_define_class(mrb, "Sprite", mrb->object_class);
  MRB_SET_INSTANCE_TT(cSprite, MRB_TT_DATA);

  // define class method
  mrb_define_method(mrb, cSprite, "initialize",
                    glmrb_sprite_initialize, MRB_ARGS_REQ(3));

  mrb_define_method(mrb, cSprite, "draw",
                    glmrb_sprite_draw, MRB_ARGS_NONE());

  mrb_define_method(mrb, cSprite, "width",
                    glmrb_sprite_width, MRB_ARGS_NONE());

  mrb_define_method(mrb, cSprite, "height",
                    glmrb_sprite_height, MRB_ARGS_NONE());

  // SDL2 init
  if (SDL_Init(SDL_INIT_EVERYTHING) < 0)
  {
    SDL_Log("Failure SDL_INIT()\n");
    mrb_close(mrb);
    return -1;
  }

  // mwindow = SDL_SetVideoMode(640, 480, 0, 0);
  // SDL_WM_SetCaption("glmruby application", NULL);
  mwindow = SDL_CreateWindow("glmrubysdl2", 100, 100, 640, 480, 0);
  if (mwindow == NULL)
  {
    SDL_Log("Cannot create window.\n");
    SDL_Quit();
    mrb_raise(mrb, E_RUNTIME_ERROR, "Cannot create window.");
    exit(-1);
  }

  // create renderer
  renderer = SDL_CreateRenderer(mwindow, -1, SDL_RENDERER_ACCELERATED);
  if (renderer == NULL)
  {
    SDL_Log("Cannot create renderer.\n");
    SDL_DestroyWindow(mwindow);
    SDL_Quit();
    mrb_raise(mrb, E_RUNTIME_ERROR, "cannot create renderer.");
    exit(-1);
  }

  // load and run mruby script. execute after create renderer
  fp = fopen("main.rb", "r");
  if (fp == NULL)
  {
    SDL_Log("Cannot load main.rb.\n");
    mrb_raise(mrb, E_RUNTIME_ERROR, "Cannot load main.rb");
    exit(-2);
  }
  mrb_obj = mrb_load_file(mrb, fp);
  fclose(fp);

  timer.interval = (Sint64)SDL_GetPerformanceFrequency() / 60;
  timer.now = 0;

  int framecounter = 0;

  // main loop
  while (quits() != 0)
  {

    mrb_funcall(mrb, mrb_obj, "update", 0);

    // clear with background color
    SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
    SDL_RenderClear(renderer);
    // SDL_FillRect(mwindow, NULL, SDL_MapRGB(mwindow->format, 0, 0, 0));

    mrb_funcall(mrb, mrb_obj, "draw", 0);
    SDL_RenderPresent(renderer);

    // timer wait
    while (SDL_TRUE)
    {
      if (((Sint64)SDL_GetPerformanceCounter() - timer.now) >= timer.interval)
        break;
      SDL_Delay(0);
    }
    timer.now = SDL_GetPerformanceCounter();

    // timer.now = SDL_GetTicks();
    // timer.wit = timer.now - timer.lev;
    // if (timer.wit < 16)
    //   SDL_Delay(16 - timer.wit);
    // timer.lev = SDL_GetTicks();

    // SDL_UpdateRect(mwindow, 0, 0, 0, 0);

    framecounter++;
    // if (framecounter % 60 == 0)
    //   printf("%d\n", framecounter);
  }

  mrb_close(mrb);

  SDL_DestroyRenderer(renderer);
  SDL_DestroyWindow(mwindow);
  SDL_Quit();

  return 0;
}

_main.rb
#!ruby

class TestSprite < Sprite
  def initialize(x, y, imagefile, dx, dy)
    super(x, y, imagefile)
    @bx = x
    @by = y
    @dx = dx
    @dy = dy
  end

  def update
    wh = width / 2
    hh = height / 2
    @bx += @dx
    @by += @dy
    @dx *= -1 if (@bx <= wh or @bx >= 640 - wh)
    @dy *= -1 if (@by <= hh or @by >= 480 - hh)
    @x = (@bx - wh).to_i
    @y = (@by - hh).to_i
  end
end

class Scene
  def initialize
    @sprs = []
    num = 128
    ang = 0
    ang_d = 360.0 / num
    num.times do
      rad = ang * Math::PI / 180.0
      r = rand * 4.0 + 1.0
      dx = r * Math.cos(rad)
      dy = r * Math.sin(rad)
      s = TestSprite.new(320, 240, "sample.png", dx, dy)
      @sprs.push(s)
      ang += ang_d
    end
  end

  def update
    @sprs.each { |s| s.update }
  end

  def draw
    @sprs.each { |s| s.draw }
  end
end

Scene.new

_Makefile
TARGETS = glmrubysdl2

all: $(TARGETS)

SDL_PREFIX  = /mingw32
# SDL_PREFIX  = /mingw

MRB_HEAD    = ../mruby/include
MRB_LIBS    = ../mruby/build/host/lib

# SDL_CONFIG  = $(SDL_PREFIX)/bin/sdl2-config
SDL_CONFIG  = sdl2-config
CG_LIBS     = 

CROSS_COMPILE = $(SDL_PREFIX)/bin/
CC = $(CROSS_COMPILE)gcc
CXX = $(CROSS_COMPILE)g++

# SDLCFLAGS   = `$(SDL_CONFIG) --cflags`
SDLCFLAGS = -I$(SDL_PREFIX)/include/SDL2 -Dmain=SDL_main
CFLAGS = -g -Wall $(SDLCFLAGS) -I$(MRB_HEAD)
CXXFLAGS = -g -Wall $(SDLCFLAGS) -I$(MRB_HEAD)

# SDLLIBS     = `$(SDL_CONFIG) --libs`
# SDLLIBS     = -L$(SDL_PREFIX)/lib -lmingw32 -lSDL2main -lSDL2 -mwindows
SDLLIBS = -L$(SDL_PREFIX)/lib -lmingw32 -lSDL2main -lSDL2

# LDFLAGS     = -Wl,-rpath,$(SDL_PREFIX)/lib  -static -static-libgcc -static-libstdc++ -mwindows
LDFLAGS = -Wl,-rpath,$(SDL_PREFIX)/lib -static -static-libgcc -static-libstdc++

# LIBS = -L$(MRB_LIBS) -lmruby -lm $(SDLLIBS) -lopengl32 -lglu32 -lm -lSDL2_image
LIBS = -L$(MRB_LIBS) -lmruby -lm $(SDLLIBS) \
  -lSDL2_image -lpng -lz -ljpeg -ltiff -lwebp -llzma \
  -ldinput8 -ldxguid -ldxerr8 -luser32 -lgdi32 -lwinmm \
  -limm32 -lole32 -loleaut32 -lshell32 -lversion -luuid \
  -lopengl32 -lglu32 -lpthread

clean:
	rm -f *.o *.a *~ $(TARGETS)

$(TARGETS): $(TARGETS).o
	$(CXX) -o $@ $^ $(LIBS) $(LDFLAGS)


使用画像。

_sample.png

ビルドしてみる。 :

$ cd ~/prg/mruby/glmrubysdl2/

$ make

/mingw32/bin/gcc -g -Wall -I/mingw32/include/SDL2 -Dmain=SDL_main -I../mruby/include   -c -o glmrubysdl2.o glmrubysdl2.c

/mingw32/bin/g++ -o glmrubysdl2 glmrubysdl2.o -L../mruby/build/host/lib -lmruby -lm -L/mingw32/lib -lmingw32 -lSDL2main -lSDL2 -lSDL2_image -lpng -lz -ljpeg -ltiff -lwebp -llzma -ldinput8 -ldxguid -ldxerr8 -luser32 -lgdi32 -lwinmm -limm32 -lole32 -loleaut32 -lshell32 -lversion -luuid -lopengl32 -lglu32 -lpthread -Wl,-rpath,/mingw32/lib -static -static-libgcc -static-libstdc++

ビルドできたら実行してみる。
$ ./glmrubysdl2.exe

実行結果。



結構滑らかに動いてるような気がする。

スタティックリンクをしたので、exe と使用画像のみを他のPC(Windows8.1機。Intel Atom CPU搭載)に持っていっただけで動いてくれた。dllファイルをごっそりコピーして持っていかなくても済むあたりはイイ感じ。もっとも、glmrubysdl2.exe のファイルサイズが 10MBを超えるサイズになってるけど…。

一応、exeも含めたファイル一式を zip にして置いておきます。

_glmrubysdl2_20180318.zip

とりあえず、
  • SDL2を使うプログラムをCで書く際のアレコレ。
  • Cで書いたプログラムに mruby を組み込む方法。
  • MSYS2上でビルドする方法。
この3つは、少し分かってきた気がする。

課題。 :

せっかくだから、DXRuby の Image っぽい感じで画像を読み込んで Sprite に渡すように…と思ったけれど、DXRuby の Image のようなものをどうやって作ればいいのか分からず。DXRuby の Image は、Image.new(w, h, color) で生成できる上に、Image.load("画像ファイル名") でも生成できる…。.new() 以外でも生成できる何か、ってどうやって作るのかしら。

また、mrubyスクリプト内で何かエラーが発生した場合に、エラーが出ていることを表示する方法も分かってなくて。当初、実行しても何も画面に表示されなくて、Cのソースとにらめっこしたのだけど、結局 mrubyスクリプト側で記述が間違っていた、てな場面があって。mrb_load_file() で mrubyスクリプトを読み込んで実行した際、エラーが出てるかどうかを調べる何かが用意されているのだろうな、とは思うのだけど…。

参考ページ。 :


2017/03/18() [n年前の日記]

#1 [dxruby] DXRubyのCustomRenderTargetを勉強中その2

_DXRuby開発版 を使ったスクリプト中で、 _tinywavefrontobj を用いて Wavefront形式(.obj + .mtl)の3Dモデルデータを直接読み込んで描画してみたり。

_crt_test05_readobj.rb

こんな感じの結果に。



一応、.obj を直接読んで使えることが確認できた。

ついでに、3D描画部分の背景として、2D画像をフツーに描画できるかどうかもテスト。DXRuby ならこういう描画も可能であることを確認できた。コレ、Ruby + gosu + opengl では、OpenGL描画部分の背景に2D画像を描画できなかったわけで…。いや、もしかすると gosu も書き方次第でできるのかもしれないけど、ググってもヒントが見つからなくて。

さらに、頂点配列、法線配列、uv配列、頂点カラー配列を、別々の頂点バッファにして描画できるか試してみたり。一応描画できてるように見えるけど、これで合ってるのかどうか…。昔は、1つの頂点毎に、頂点座標、法線ベクトル、uv等をまとめてしまったほうが速かったらしいけど、最近のGPUは分かれてるほうが速い事例もあるそうで。まとめたほうがいいのが、分けてあるほうがいいのか、どっちを使ったほうがいいのかちょっと分からんけど。

_GPU本来の性能を引き出すWebGL頂点データ作成法 - Qiita
_wgld.org | WebGL: インターリーブ配列 VBO |

何はともあれ、こんな感じの描画ができるのであれば、例えば 2DのSTGやアクションゲームでも、背景をそれっぽく見せられそうな予感。

jsonと.objのどちらがいいのやら。 :

jsonファイルを解析して頂点配列等を取得するのと、.obj + .mtlファイルを解析して頂点配列等を取得するのでは、どちらがいいのだろう…。

例えば、RubyのjsonライブラリがCで書かれてたりするなら、一旦jsonにしておいて、jsonを読み込んだほうが処理時間も速いのだろうけど。

もっとも、パース(=解析)にかかる処理時間を気にするなら…。jsonになった時点で、もはや中身を眺めて修正したり等はほとんど不可能な状態になるのだから、いっそのことバイナリで保存したり読み込んだりするほうがいいのかな、とも思えてきたり。でも、エディタで開いて一応は内容が見れるテキストファイルと、何が何だか分からない謎バイナリでは、前者のほうが気分的に楽かな…。

頂点カラーを記録できる3Dモデルフォーマットを探していたり。 :

テキストで記述されていて、かつ、頂点カラーを記録できる3Dモデルフォーマットは無いのかなとググってるところ。

ここ数日使っている Wavefront形式は、テキストで記述されてるので解析しやすいものの、頂点カラーについては記録できないみたいで。いや、アプリによっては頂点情報に頂点カラーまで付加してしまうものもあるらしいのだけど…。

そもそも blender上で頂点カラーを指定するのって、どんな操作をすればいいんだろう。ソレ以前に、blenderは、頂点カラーを使える機能があるのだろうか。

仮に blender がそういう機能を持ってないとしても、Wings3Dあたりではどうだろう。Wings3Dは、ゲーム向けのローポリモデルを作成しやすい、という話を見かけたから、頂点カラーも指定できそうな。

課題。 :

今のところテクスチャを使ってるモデルしか描画できないので、テクスチャを使ってないモデル、及び、複数のマテリアル(材質設定)も描画できるようにしたいのだけど、さて、どうすればいいのやら。シェーダを数種類用意して対応するのが妥当なのだろうか。それとも違う方法があるのだろうか…。

ピクセルシェーダ内の計算も、これで合ってるのかどうか…。意味も分からずコピペしただけなので…。 _グーローシェーディング(Gouraud shading) とか _フォンシェーディング(Phong shading) とか勉強しないと、なのかな…。

#2 [nitijyou] ファンヒーターが壊れた

自室で使っていたダイニチ製のファンヒーターが壊れてしまった。運転開始ボタンを押してしばらくすると、液晶画面に「F06」のエラー表示が。

_エラーへの対処方法一覧 - 石油暖房機器 - DAINICHI によると、「F06」のエラー表示は、気化器サーミスタオープンなる症状らしい。修理が必要ですよ、と書いてある。

親父さんの運転する車で、近所にあるホームセンター、ホーマックまでファンヒーターを運んで修理をお願いしてきた。とりあえず見積もりを出してもらえるらしいけど、下手すると二週間ぐらいかかるかも、との話。

件の店では、既にファンヒーターをほとんど売ってないそうで。店頭にはコロナ製の製品しかなかった。値段は税抜き14,800円。

ついでに、ホーマックで犬の餌も購入。柴犬用と謳ってるドッグフードだけど、食べてくれるかどうか…。

何時頃買った製品だったか。 :

検索してみたら、 _2007/11/05 に買った製品だったらしい。ダイニチ FW-322S とメモしてあった。

当時の店頭では9,980円で売られてたのか…。すると、今は製品価格が1.5倍に値上がりしてるんだな…。と思ったが、ググってみたら、9,980円前後で売ってるお店もあるな…。今回店頭で見かけた製品は、何かしらランクの高い製品だったのだろうか。

階下のファンヒーターを貸してもらえた。 :

親父さん曰く、「1階の奥の部屋に置いてある古いファンヒーターはほとんど使ってないので、ひとまずソレを使え」とのことで。助かった。

自室まで運んで動作確認。フツーに動いてくれた。

CORONA GT-3240、と書いてあるな…。 _道燃整組 コロナ年度表一覧 によると、1991年の製品らしい。…えっ? 1991年? 大丈夫かコレ。

コロナ製品は、一部にリコール対象製品があるようで。「手を汚さずに開け閉めできますぜ」てのが売りだったタンクの蓋部分に問題があるらしい。

_コロナ石油ストーブ 油タンク確認不足で火災の恐れ - リコール情報のお知らせ - ヤフオク!
_CORONA Information web
_recallpapaer.pdf
_株式会社コロナが製造した石油ストーブのリコールが行われます(無料点検・部品交換)(METI/経済産業省)

幸い、型番リストの中に GT-3240 は入ってなかった。古過ぎて、タンクの蓋が昔ながらの金属製なので、リコールにはならなかった模様。

2016/03/18(金) [n年前の日記]

#1 [prog] GIMPのシームレスフィルタが再現できなくて悩んでいたり

Processingを使ってGIMPのシームレスフィルタを再現できないか試していたのだけど、これが上手くいかなくて。

今のところ、下のような結果になったのだけど。

sketch_make_seamless_ss.png
_sketch_make_seamless (Processing.js版)
_sketch_make_seamless.pde (ソース)

_GIMPのシームレスフィルタ と比べると、かなり違う結果に。

GIMPのシームレスフィルタの結果を検証。 :

例えば、以下の画像を元画像とした場合。見えにくいけど、左上が真っ黒、右下が真っ白、それ以外は透明になってる画像。
seamless_g_src.png

GIMPのシームレスフィルタをかけると、以下のような画像になる。
seamless_g_gimp.png

画像を4分割して、左上の領域と、右下の領域が合成されて、その合成結果が両方に描かれてる状態、とでも言うか。ちなみに、右上の領域と左下の領域も合成されて、両方に同じ内容が描画されているのだけど。

これを、今回 Processing で書いたソレで試してみると、以下のようになる。
seamless_g_processing.png

違いがお分かりいただけるだろうか。って全然違いますがな。そもそも同じ内容が描画されてないので、これではシームレスにならない。

この白黒のグラデーションは、2つの画像を合成する時の割合に相当するはず。つまり、x と y の値を使って、このグラデーション画像を生成する式さえ分かれば、GIMP のシームレスフィルタだって再現できるはず。

なのだけど。その式が分からない。思いつかない。どういう式にすれば、こういうグラデーションが描けるのだろう。

これは GIMPのソースを眺めてみるしかないかなと、GIMP 2.9.2 のソースをDLして解凍してgrepしてみたけど、それらしい部分が見つからなくて。gegl:tile-seamless だか plug_in_make_seamless_invoker だか、そのへんが関係してそうな気もするのだけど、どこに処理が書いてあるのやら。

#2 [nitijyou] 歯医者に行ってきた

詳細はGRPでメモ。

#3 [nitijyou] 自転車で買い物に

歯医者の帰りに、自転車で買い物に。ダイソーとリオンドールまで。乾電池、乾電池ケース、LEDライト、夜食等を購入。

ダイソーの乾電池は、以前は6本入りだったのだけど、今回行ってみたら全部5本入りになってた。LEDライト等、電池を3本使う機器が多いので、5本入りでは余ってしまうではないか。その点、以前の6本入りは便利だったのに…。9本入り200円で売ってくれても構わんのだけどなあ。

2015/03/18(水) [n年前の日記]

#1 [nitijyou] 犬が戻ってきた

朝、門の前でクンクンと鳴いてるところを親父さんが保護。とりあえず、自分の家はココなのだと認識してるらしい。助かった。

#2 [nitijyou] 自転車で買い物に

カワチで夜食その他を購入。

2014/03/18(火) [n年前の日記]

#1 [web] PhishWallが気になる

ゆうちょ銀行のサイトにアクセスしたら、「PhishWallをインストールしてくれや」と表示されてたので、「なんスかソレ?」と。まさか、ユーザ名やパスワードを盗む怖いソフトじゃあるまいな…。ゆうちょ銀行のサイトもやられたのかな…。などと不安に。

_高木浩光@自宅の日記 - 緑シグナルが点灯しないのに誰も気にしていない?という不思議, 追記 が参考になった。サーバ証明書その他をちゃんと用意できないアレな企業・銀行が、別の仕組み = PhishWall なるソフトを使って、「このサーバは問題無いサーバですよ」「公式サイトですよ」と証明してるらしい…。

サーバ側をちゃんと用意すればもっと安く上がるのに、PhishWall を導入することで数十倍の値段になってるという話に、なんだかもやもや。そのコストはお客様であるこちら側が負担してるわけで…。もっとも、サーバ側をちゃんとさせるために必要になる人件費に比べたら、PhishWall とやらに払ったほうが早く対応できるし安上がり、という判断でもしてるのかな。実際はどうなのか分からないけど。

ちと気になるのは、PhishWall の仕組み。

たぶん、PCがWebにアクセスするたびに、それを横から掠め取って、「このURLは正しい」「このURLは俺知らねえ」と判別してるのだろうけど。てことは、Webへのあらゆるアクセスを横から掠め取っている分、全てにおいて処理が余計に増えている・レスポンスが悪くなってしまうのではないのかなと予想。体感上はどうなんだろう。劇遅になったりしないのかな。

DRMその他と同様に、OSの根幹部分に食い込んでくるヤバい仕組みだったりしないのかな、てな不安も。何せ、他のソフトから処理内容を変更されたら全てが台無しだろうから、システムの根幹をドデーンと占拠して他のプログラムからのアクセスを弾いてしまうアレなところがありそうな。下手すると、一度組み込んだらアンインストールすらできなくなって、消すためにはOS再インストールしか手はない、みたいなヤバさもありそうで。大丈夫なのかな…。

どこぞの犯罪組織が、コレとそっくりのプログラムを作って広めちゃったらどうなるのだろう…。

てな感じで色々不安はあるのだけれど。とりあえず、ゆうちょ銀行のサイトから辿って一応インストールしてみたり。

IE11を何度か再起動させないと、ツールバー上のランプが光らなかった。また、IE起動時に、「起動時にコイツが足を引っ張ってるよ! コイツを無効にすればもっと速く起動できるよ」とメッセージが表示された。軽いプラグインというわけではナサゲ。

ツールバー上にランプが表示される見た目だけど。これでは、例えばウチの親父さんなどは、ランプがついてることにも気付かんだろうなと思ったり。ブラウザ下部のダウンロードバー出現や、ActiveX関係のバーが出現することにも気付いてない感じだし…。かといって、例えばダイアログ等でデカデカと、「このサイトは正しいサイトです」なんて表示してもマズいわけだし。そんなのフィッシングサイトでも容易に実現できちゃうもんなあ…。そんなアレコレを考えると、「これで本当に有効な対策になるんかいな…」と。しかし名案も浮かばない…。

2013/03/18(月) [n年前の日記]

#1 [digital] 半球ミラーでパノラマ画像を作成できそうか実験中

半球ミラーで撮影して、HDRI、360度パノラマ画像を作れそうか実験。

環境やソフトは以下。
半球ミラーは、裏にダンボールで作った板を両面接着テープで貼り付けて、その板部分を三脚にメンディングテープで固定。コンデジ側も三脚で固定して撮影。

以下、気付いた点をメモ。

半球ミラーを使って撮影する場合、光学ズームはどうも必須な感じ。最初は、ズームがついてない A300 で撮影してみたけど、半球ミラー部分が豆粒サイズにしか映らないので解像度的によろしくなくて。近づけて撮影しようとしたら、マクロ撮影モードにしないとミラー部分にピントが合わず。そのせいか、肝心要の鏡に映った部分はボケボケに。これでは話にならないので、お袋さんのデジカメ、FinePix JX280 を借りて実験することにした。JX280 なら、5倍ズームがついてるので、どうにかそれらしく撮影できた。

ひとまず、4方向 x 3露出を撮影。ミラーもカメラも90度ずつ回しつつ。露出は、0,+2,-2で。

撮影した画像を左右反転すれば、魚眼レンズで撮影したかのような画像になる。

半球ミラーだから180度分が映ってる、と単純に思い込んでたけど、実際に撮影してみたら、180度以上の風景も映っている模様。考えてみたら、半球ミラーならミラーの後ろ側も映り込んでるよな…。真横が映っている位置は、球の中心から見て45度の角度になっている箇所のはずで…。ミラーで隠れている部分以外は映っているはず。もっとも、周辺部分は歪みが酷くて使えるかどうか微妙だけど。

Huginに読み込ませると、デジカメのレンズ設定をjpg中のExifから読み取って、その値でその後の処理をするようで、色々と上手くいかない気がしてきた。一旦、jpg中のミラーが映ってる部分をトリミングして、png保存してから読み込ませることに。png保存することでExif情報が無くなるから、Huginが「これは何の画像だ?」と尋ねてくる。円周魚眼レンズを指定。

そのままだと、カメラ、三脚、撮影者が映ってしまっているので、不要な部分は削除しないといけない。Huginのマスク機能(「マスク」タブを選択)を使って、不要部分はマスクする。

コントロールポイント編集タブ上では、異なる画像同士で共通する部分をコントロールポイントとして指定していくけど。同じ画像同士にすれば、「鉛直な線」「水平な線」を指定できる。「鉛直な線」「水平な線」の指定方法は、左側の画像で、線の開始座標を指定して、右側の画像で線の終了座標を指定する。それらの線を指定することで、まともな配置になることが多い、らしい。

Hugin でHDRI画像(.exr)を出力する方法がさっぱり分からず。途中で何かのエラーが出て、バッチ処理?が「失敗」になってしまう。設定を色々変えているうちに、処理が「完了」して、.exr が出力される時もあるようなのだけど。各設定項目の意味が、さっぱり分からない…。

2012/03/18() [n年前の日記]

#1 [movie] シャーロックホームズを視聴

映画がTV放映されてたので見てみたり。ガイ・リッチー監督版、とメモしておけば後から読んでも分かるのだろうか。さて。

ホームズとワトソンが殴る蹴るのアクションを繰り広げる作りで、面白く感じた。特に、頭の中でシミュレーションしてから攻撃する描写がイイ感じ。ホームズならこういう戦い方をしそうだなと。いや、原作はほとんど読んだことがないのだけど。自分の中の勝手なイメージでは、あんな感じ。

ホームズとワトソンの相棒ぶり?がイイ感じ。この脚本家さん(?)が、ルパン三世の脚本を書いてくれたら、ルパンと次元がこんな感じでカッコよく見えるのかな、と全然関係のない妄想をしてしまったぐらいに、イイ感じ。

てなことを思ったところで気が付いた。宮崎ルパンにおけるルパンと次元の描写は、もしかするとホームズシリーズからの引用だったのかな。と思ったが、調べてみたらカリ城が1979年、名探偵ホームズが1985年だから、時期が合わないや。ルパン参加以前にホームズシリーズの原作を読んでいる可能性はあるかもしれないが、原作のホームズとワトソンに、ルパンと次元のようなコミカルさがあった印象は無いし。自分、考え過ぎの可能性大。

本編中、ワトソンが発した「安心しろ。私は医者だ」の台詞が、何故か気に入ってしまった。使い道がありそうな予感。と思ったけど、元々何かのジョークで使われていたソレのような気もしてきた。

_TAS動画まとめ@ウィキ - FC シャーロック・ホームズ 伯爵令嬢誘拐事件 :

_シャーロックホームズ伯爵令嬢誘拐事件|クソゲー レビュー 動画 攻略|トーワチキ アクション ファミコン

関連情報を検索していたら、ファミコンソフトのコレに遭遇した。まさか、映画版は、コレにインスパイア…いや…それはないだろう…たぶん…。

2011/03/18(金) [n年前の日記]

#1 [niijyou] コタツに入ってTVニュースを一日中見てる状態

灯油が無いのでコタツしか暖房器具が無く。家族3人コタツに入りっぱなし。原発の状況によっては福島県を逃げ出さないといかんだろうからNHKもつけっぱなし。放射能物質が怖いので外出もできない。

夜、3回ほど余震で目が覚めた。なんだか毎日3回は来ているような気がする。間隔が決まってる・傾向があるのだろうか。

原発と余震。どちらか片方だけにしてほしい。と書いてみても仕方ないのだけど。

須賀川市長からのメッセージで、水道の施設がオーバーヒートして安定供給できなくなりそうだから節水を、という呼びかけが。節水を意識して使っていけば断水せずに済むかもしれないが、また断水すると困るから的に抜け駆けして水を溜め込もうとする家庭が多いとあっさり断水しそう。こういう時に市民の賢さ、あるいは愚かさが、浮き彫りになるのかもしれない。

2010/03/18(木) [n年前の日記]

#1 [nitijyou] エンジンが全然かからない

やらなきゃいかんのに…。ここ数週間ずっとそんな感じ。これではいかんのだが…。

2009/03/18(水) [n年前の日記]

#1 [python] GUIで作る際に使えるアレコレを調べていたのだけど

Tkinter を捨てて、wxPython で置き換えようか。であれば wxGlade や XRCed でレイアウトを、とかやってたけど。面倒くさくなってきた。

コマンドラインツールで別にいいんじゃないの、みたいな。コマンドラインで動かせば、最初にバッチファイル書くだけで済むだろうし。一回バッチファイルを書いて残しておけば、しばらくして作業手順を忘れても、ソレを見て自分がしていた手順を思い出せるだろうし。…どうしてもGUIにしたかったら、コマンドラインツールを呼び出すだけのラッパーみたいなGUIのソレを書けばいいのだ。そうしよう。

2008/03/18(火) [n年前の日記]

#1 [iappli][cg_tools][prog] GIMPのレイヤー位置を取得できないかと実験中

iアプリの画面上にgif画像を表示するわけだけど。各gifの表示位置調整をする際に、今現在は下のような作業手順を踏んでたり。
  1. GIMPの、「ファイル」→「レイヤーとして開く」で、複数のgifをレイヤーとして読み込む。
  2. 各レイヤーを順々に選択。して以下の作業を。
  3. 「すべて選択」でレイヤーサイズの選択領域を作る。
  4. 「選択領域をストローク描画」して、レイヤーサイズの枠を描く。
  5. レイヤーを移動。位置調整。
  6. 全レイヤーの位置調整が終わったら、「ファイル」→「コピーを保存」で、レイヤー統合状態の画像をpngとして保存。
  7. ドットエディタ EDGE2を起動。先ほど保存した png を読み込み。
  8. クリップボード履歴をテキストファイル保存するユーティリティ、CliPla を起動。
  9. 「目視」で、png上の各枠を選択。←ここがシンドイ。
  10. 選択範囲(左上座標値と縦横幅)をテキストとしてコピー。(ショートカットキーで Alt+C に割り当ててる。)
  11. 一通り座標値を取れたら、CliPla で、クリップボード履歴をテキストファイル保存。
実にアホらしい。

目の前の画像編集ツール上では、レイヤー位置情報を内部的に持ってるからこそ、表示位置の調整ができているわけで。しかし、それをテキスト出力できないというただそれだけで、人間が目視でもう一度座標値を測定し直すことになるという…。まったくもう、何のためのコンピュータか。何のためのデジタルデータ化なのか。これでは、人間がコンピュータに使われちゃってる典型例ではないか。ぷんすか。

一度や二度の修正だったら、まだこんな感じでやれなくもないけれど。今後、相手先から、「ここ直して」「こっちもずらして」てな修正要求がどんどん出てくるだろうから、さすがにこのへんどうにかせんといかんなと。かといって、エディタでソース上のテーブルをチクチクと修正→コンパイル→画面確認、とかやるのもアホらしい。

ということで、GIMP の Script-fu (2.4は、Tiny-fu?)でどうにかできんかと実験中。

Scheme 判らねえ。 :

Script-fu にしろ Tiny-fu にしろ、Scheme なるLisp系の言語が元になってるらしいのだけど。アレコレ検索しても資料ページにぶつからない。数値から文字列への変換ってどうやるんだらう。とかそんなレベルで躓いたり。資料がないってことは、物凄くマイナーなんだな。この言語は。

大体にして、Lisp系の、「a = 1 + 2」を「(a (+ 1 2))」とか書かなきゃいけないところが嫌だ。や、前者も、内部的には後者にして処理をする・スタックに貯めていって処理をする、と中学の頃に読んだ雑誌には書いてあったけど。勝手な想像だけど、前者で言語を作った人は、「やっぱり人間が判りにくい書き方はいかんだろう。人間がコンピュータに使われちゃいかん。俺が苦労しても、それで皆が楽になるなら…」と思いながら実装してたのではなかろうか。しかし後者は「俺はこれでも判るし、コンピュータも判りやすいんだから、これでええやんか」という気持ちで言語を作ってたのではないか。「俺が判るんだからそれでいい」という姿勢からして気に食わん。しかも「え? なんでこれが判んないの? 君達バカ?」みたいな雰囲気を時々漂わせてるし。>Lisp使用者。こんな独りよがりで、優越感ゲームに浸った気持ちで作られた、カッコばかりつけてる言語が、普及するわけなどないのです。嘘です。根拠のない妄想を垂れ流してんじゃねえ。>俺。どうもスイマセン。

つーかどうしてGIMPは、PyGimp? Python-fu を標準にしないのかな。標準ではないから、pythonで書いても「俺しか使えない・俺の環境でしか使えない」ということになっちゃって、作成意欲?公開意欲?が削がれるし。さりとてLisp系言語は習得が大変みたいだし。なもんだから、「よっしゃ、ここは一つ、俺がスクリプト書いたるか」てな人が滅多に出てこない状態に。Lisp系を導入したツール・アプリケーションは、えてしてそのことが足を引っ張ってる気がする。Lispは存在自体が害悪。とまで書くのはアレだけど、結構それに近い場面が多い気もしたり。…まあ、スクリプト関連が何もないよりはマシなのかもしれんのですが。

printf()デバック的手法が使えねえ。 :

(gimp-message hogestring) みたいな感じで動作確認しようとしたら、「不正なUTF8文字列です」等のエラーが出て困り果てる。巷で何かとバカにされがちだったりするぐらいに一般的な手法である、printf()っぽいソレも使えないとは…。なんというクソ環境!

Script-fuコンソールで事前に部分的テストをしようと思っても、入力欄が1行しかないから大変なことに。対応カッコを色づけ表示等もなければ、タブキーで補完とかそういうのもないし。結局、スクリプトファイルを書いたら、ツールボックスの「拡張」→「Script-fu」→「スクリプトリフレッシュ」をして、しばらく待たされてから動作確認、というループで作業する羽目に。どうにかならんのか。

例えば、Script-fuコンソールを出力先として指定した状態でメッセージ出力、とかできんのかな。あるいはどこぞのテキストファイルにひたすらログを残すとか。

保存先ファイルのフルパス文字列すら作れねえ。 :

保存テキストファイル名のパスを、SF-DIRNAME と SF-STRING から得たソレで、 (string-append dirname "/" filename) で作ろうとしたら。できたソレは、C:\hoge\piyo/hoge.txt みたいな。あー、パス区切り文字が…。

外人さんは「SF-FILENAME の仕様が変わったんで (string-append dirname "/" filename) でフルパス作ってどうにかせい」とか言ってるみたいだけど。ソレ、*NIX文化圏でしか動かないスクリプトになったりしないのか? 各OS環境でどのパス区切り文字が使われてるか、システム変数とか関数とかそのあたり使って取り出せれば助かるけれど、そんなもんがあったら「(string-append dirname "/" filename)で〜」とか言ってたりしないよな。ということは、おそらくそんな気の利いたものは用意されてないに違いない。

GIMPの標準添付スクリプト界隈は、ディレクトリやファイルの取扱いに関して、どうも何かが弱い気がする。例えば、 _Python の os.path あたりを見てると、「異なる環境でもちゃんと使えるように」てな気配り?が感じられるんだけど。それに比べるとGIMPのソレは、上記のような感じで。

それはともかく、解法はないものかと検索してたら、Windows版 GTK+ では「\」も「/」も両方パス区切り文字として扱ってたりするかもよ、てなPDF文書に遭遇。であれば、問答無用で「/」でやっちゃってもいいんだろうけど。本当にそうなってるのかなぁ…。なんだか怖いなあ…。

なんとかできたかもしれない。 :

こんな感じに。
(define (script-fu-dump-layer-offsets
         img         ; image ID
         drawable    ; target drawable ID (not used)
         dirname     ; output dircetory name
         pathstr     ; path separator
         filename    ; output text filename
         )

  (let* ((layers (gimp-image-get-layers img))
         (number-layers (car layers))
         (layer-array (cadr layers))
         (layer-count 0)
         (layer 0)
         (outputpath (string-append dirname pathstr filename)))
    (set! layer-count 0)
    (call-with-output-file
     outputpath
     (lambda (p)
       (while (< layer-count number-layers)
         (set! layer (vector-ref layer-array layer-count))
         (gimp-image-set-active-layer img layer)
         (let* ((name         (car (gimp-layer-get-name layer)))
                (offset-x     (car (gimp-drawable-offsets layer)))
                (offset-y     (cadr (gimp-drawable-offsets layer)))
                (layer-width  (car (gimp-drawable-width layer)))
                (layer-height (car (gimp-drawable-height layer)))
                (s (string-append
                    name ","
                    (number->string offset-x) ","
                    (number->string offset-y) ","
                    (number->string layer-width) ","
                    (number->string layer-height) ","))) 
             (display s p)
             (newline p))
         (set! layer-count (+ layer-count 1)))
       ;; (close-output-port p)
       ))
    ; (gimp-message-set-handler MESSAGE-BOX)
    ; (gimp-message (string-append "Output File : " outputpath))))
    
    ))
    

(script-fu-register 
 "script-fu-dump-layer-offsets"
 "Dump All Layer Offsets..."
 "全レイヤー位置座標をダンプ"
 "mieki256"
 "mieki256"
 "2008/03/18"
 "*"
 SF-IMAGE    "Image"    0
 SF-DRAWABLE "Drawable" 0 
 SF-DIRNAME  "Select Output Directory" "."
 SF-STRING  "path separator" "\\"
 SF-STRING  "Input Output Text Filename" "dump_temp.txt"
 )

(script-fu-menu-register "script-fu-dump-layer-offsets"
                         "<Image>/Layer")
エラー処理とかどうやって書いたらいいのか判んないので、場合によっては酷いことになる可能性大。それと、レイヤー名に日本語を使ってると謎の文字列で記録される。例えば、「背景」→「闇」になってたり。…なんで「闇」なんだ。なんだか怖い。

「闇」じゃなくて、別の文字っぽいな。

#2 [xyzzy] Schemeを勉強する関係で Scheme-mode を xyzzy にインストール

_xyzzy - WikiWikiFun - scheme-mode

ありがたや。

Schemeもインストール。 :

Windows上で動作する Scheme もインストールしておいたほうが勉強がやりやすいだろう、と思って _MzScheme もインストールしてみたり。 _昔は UNICODE 非対応だったけど最近は対応してる との話も見かけたので、これがいいのかなと。

が、while が使えない…。> MzScheme。GIMP のほうのソレは使えるんだけどな。

_Scheme 入門 15. 構文の定義 というページを見る限りでは、そもそも「自分で while をマクロ定義しろや」ということなのかもしれず。

つーか、 _Scheme において繰り返しは再帰で行うべし てな話もあるようで。うーむ。

_Emacs Lisp プログラミング: ループと再帰 :

む。わかりやすいかも。

#3 [windows] _CliPla - クリップボードに送られたテキストを連結、連番、階層付きで保存

このユーティリティのおかげで時々助かってるわけで。ありがたや。

いつもは、ArtTips のクリップボード履歴機能を使ってるのだけど。ArtTips にはクリップボード履歴のテキストファイル保存機能がないわけで。

まあ、ArtTips は、AUTO FIFO(順番に履歴を貼り付けしていく機能)を使ってどうにかせいや、的思想なんだろうけど。自分がいつも使ってるエディタが xyzzy だし、eclipse のキー配置も emacs と同様にしてるので、エディタ上での貼り付けに関して、ArtTips を呼び出してどうこうするのはほとんど諦めてたり。ましてや AUTO FIFO 云々はほとんど呼び出す場面もなく。Ctrl、Shift、Insert、Delete の組み合わせによる、コピー/切り取り/貼り付けのショートカットキーが、各アプリ間で統一されていればまだどうにかなるのかもしれないけど。xyzzy はそのへんも Windows の他アプリと違ってて異端なわけで…。いや、どうしても、xyzzy 上でその手のツールを使いたいときは、一時的にゲイツモード(M-x toggle-gates。Windows標準のキー割り当て)に変更して使うのだけど。滅多に使わないから、ショートカットキーの割り当ても忘れてるわで…。まあとにかく色々と面倒なのです。

2007/03/18() [n年前の日記]

#1 [anime] HDDに溜まってたメビウスを消化

てるてるぼうずみたいな怪獣が出てくる回から、女性が怪獣になってしまう回まで。

タロウが出てたのか。しかも教官か。さらにウルトラダイナマイトまで。たしかに、タロウと言えば、ウルトラダイナマイトですな。自爆して怪獣を倒すなんて無茶苦茶。それを必殺技と言い張るのか。心臓さえ残ってれば復活可能、という設定だったかしら? なんかズルイ。

タロウの光線技のときに、「ストリウム光線!」と叫んでたのが、なんだか印象に残ったり。言わなきゃ何の技だかわからないから、叫ばせてみたのだろうか。また、かつては光学合成で画にしてたものを、現在のデジタル合成技術でどのように再現したのか、そのあたりも気になる。

メビウスの正体が知られる過程も判った。なるほど、そういう流れにしたのだな。…メビウスの正体が知られたことで、ウルトラ兄弟についても、当たり前のように正体が知られるようになってるな。ウルトラ兄弟をバンバン出そうとした場合、正体が知られてるほうが話が作りやすいのだろうな。

「怪獣使いと少年」の続編的回もあって驚いた。内容的に、日本と中韓のことを連想したり。脚本や映像の出来不出来に関係なく、何か考えさせる作りに最初からなってるというそれだけで、該当回は価値を持つ回のように思えた。

#2 [flash][prog] クリッピングってどうやるんだっけ

FLASHで、ワイヤーフレームで地平線を描くようなアレを作りたいなと。昔のCGと言われると脳裏に浮かぶアレ。8bitPC時代の雑誌広告なんかで、PCや電子部品・基板の背景に描かれてるアレ。…google画像検索で探してみると実はほとんど無いみたいだけど。

アレって言っても判んないわな…。こういう感じ。
ワイヤーフレームで地平線を描いてあるアレ。
「月刊マイコン」とか「I/O」なんて言葉に懐かしさを感じた人なら十中八九「ああ、アレか」と思うアレ。

FLASHアニメの素材として扱うだけなので、最初のうちは手で描こうと試みたり。昔は全部、エアブラシや筆で描いてたわけだし。 *1 しかし、作業しているうちに面倒臭くなってきた。こういう画像はPCで描かせるに限る。しかも直線しかないのだし、ActionScriptで描いちゃうのがヨサゲ。と思ったのだけど。何も考えずにスクリプトを書くと、MovieClipの非表示部分にまで線を描いてしまうので、気分的も、さらにおそらくは描画処理的にもよろしくない。やはり描画領域でクリッピングする必要があるかなと。

でも、どうやってやるのか忘れた。ASCIIから出てたCGの本に、やり方が書いてあった記憶はあるのだけど。その手の本は、全部捨ててしまったからなぁ…。検索しても、今時クリッピングは、ライブラリ側に任せてしまうのがほとんどのようで。自前でやってる事例にはなかなか遭遇せず。…こういう時に、ちゃんと数学を勉強してたのかが試されますな。

考えてみたらあらゆる状況を想定してクリッピングする必要はないな。 :

消失点から放射状に伸びる直線に関しては…
  • 画面の高さ以上は描画しなくていいわけだから、始点終点のy座標は変化しない。終点のx座標だけが変化する。
  • 終点が x > 画面幅 / 2 のときだけクリッピングすればいい。
  • クリッピングと言っても、x = 画面幅 / 2 のときの y座標を求めればいいだけ。
  • 左側は、右側を水平反転して描けばいい。
水平な直線は…
  • 始点終点のx座標は一定。(- 画面幅 / 2 , y) 〜 (+ 画面幅 / 2, y)。
  • y座標は透視変換で求めればいい。
…中学生でも出来て当然の話だった。自分、複雑(?)に考えすぎてた。

_こんな感じ になった。

_ライン・ルーチン (2)線分のクリッピング :

あらゆる場面に対応できる線分のクリッピング処理についての記事。ありがたや。

_アルゴリズムの紹介 も勉強になるであります。…昔は、PC雑誌にこういった内容が当たり前のように載ってたことを思い出したりもして。

*1: 溝のついた定規にガラス棒をあてて、とか、マスキングテープを張って、とかそんな感じ? >エアブラシや筆で作画。

この記事へのツッコミ

Re: クリッピングってどうやるんだっけ by ほげ    2007/03/19 22:31
>こんな感じ
おお!すばらしいですね!!
プチ感動しました。
ふと、スペースハリアーを連想 by mieki256    2007/03/24 13:34
> プチ感動しました。

ありがとうございます。
…む。考えてみたら、コレ、スペースハリアーっぽいですね。

#3 [flash] _透過PNGが表示されない

_画質の違いは、アンチエイリアス以外にも影響する

なんてこった。リアルタイム系のゲームを作ろうとしたら、制限が出てくるじゃないか。

画質を低にすると問題は出ないようではある。ゲームを作る際は画質低にせよ、ということなのかしら。

#4 [anime] HDDに溜まってたプリキュア5を消化

はじけるレモンの香りってコレかー。

お姉さまみたいな人がすんなり変身できないあたりは、構成として上手かった気がする。5人に増えた効果あり、だらうか。

それにしても、やはり既存作品のアレとかコレとかに見えてしょうがない。まあ、東映作品らしい世界観・デザインセンスで、今後独自性が出てくるのだろうけど。

2006/03/18() [n年前の日記]

#1 [nitijyou] 両親が埼玉へ

親戚の結婚式に。…親父さんは埼玉出身の人なので、親父さん側の親戚一同は埼玉近辺に住んでたり。

朝の6:00に車で出発。今日、結婚式に出て、親父さんの兄弟の家に泊まって、そのついでに、親父さんの兄弟に、親父さんがPC関連の操作をコーチしてくるとの話。帰りは明日。

ということで、自分が夕飯当番。買出しに自転車で。

#2 [nitijyou] 須賀川市労働福祉会館に行ってきた

新聞の折込広告を見てたら、全国を渡り歩いて販売するアレな業者が、件の施設で売出しをするとかで。気になったので行ってみた。

_労働福祉会館 なる場所は行ったことがなくて、てっきり _須賀川市民温泉 に隣接する施設なのかなと思い込んでウロウロしてたけど。道路一本挟んだところにある施設だったのだな。時間を無駄にしてしまった。

目ぼしいものは無し。ていうか、100円ショップで売られてるのと同レベルの品が999円ぐらいで売られていてどうなんだろうと思った。でも、年配の方が意外と来てたので、結構売れてしまいそうな予感。

#3 [nitijyou][digital] 電波時計を買ってきた

前々から温度のデジタル表示もしてくれる時計が欲しかったのだけど。たまたま覗いた _カインズホーム で、980円で売られてる品を見つけた。芳国産業なるところが輸入・販売してる品。商品名、「ゴクウ」。MADE IN CHINA。

帰宅後、電池を入れた。…ブザー音が大きすぎる。これは中国人の声の大きさに合わせて調整したブザー音でございましょうか。それはさておき、たしかに電波を受信して時刻合わせをするようで。何もしなくても日付・時間が合ってしまって驚いた。便利だなぁ。

ただ、説明書には、「電気製品の近くに置くと誤動作する」「窓際に置かないと電波を受信しない」と書いてあった。不便だなぁ。

この記事へのツッコミ

Re: 電波時計を買ってきた by けいと    2006/03/21 19:15
> 電気製品の近くに置くと誤動作する

私はパソコンのすぐそばにおいているのですが、時々誤動作します。

で、この時計は日常の目覚まし時計として使っていたりするので
誤動作は致命的だったりします。
なので、
電波時計と非電波時計、両方使ってます。

須賀川だと電波発信地のお膝元といってもいいところだと思うので
条件は国内屈指だと思いますけどね。
おおたかど山、でしたっけか by mieki256    2006/03/22 05:36
> 須賀川だと電波発信地のお膝元

恥ずかしながら、電波塔が福島県にあることすら知りませんでしたよ。
説明書を読んでビックリでした。

> パソコンのすぐそばにおいているのですが、時々誤動作します

逆に言うと、普段は誤動作してないということですな。
自分もPCの近くに置いてみようかしら。
…考えてみたら、PCはPCで、
NTPサーバにアクセスして時間を合わせてるから、
自分の場合は近くに置く必要はないのか。むぅ。
ソーラー&電波時計のG-SHOCKを愛用してます。 by がんした    2006/03/22 23:50
携帯電話の時計を使ってましたが、昨年、一昨年と夏場に
大量の汗で携帯が不通となり、やむなく去年から腕時計してます。
電波時計は一度使い始めると旧来の時計は時刻修正が面倒で使えませんね。
便利、便利。
Re: おおたかど山、でしたっけか by けいと    2006/03/23 15:45
> 普段は誤動作してないということですな

パソコンの電源を切っていれば誤動作は皆無です。

> NTPサーバにアクセスして時間を合わせてるから

どっちかっていうと、
イーサネット(もしくは無線LAN)のインタフェースがついて
NTPクライアント搭載している置時計がほしいんですが…

NTP対応の時計って高いんだよねー
秋月の自作?キットみたいなやつはあったと思うけど。
Re: おおたかど山、でしたっけか by mieki256    2006/03/29 00:30
> パソコンの電源を切っていれば誤動作は皆無です。

あっ! そういうことか。納得であります。

> 無線LANつきNTPクライアント搭載置時計

おお。なんかヨサゲな。
なるほど、無線LANを使えば、そういう商品も可能になってくるのか…。

#4 [nitijyou] PSEマーク云々の影響

中古ゲームソフトを売ってる店を覗いたら、中古のDreamCastが、これから売れなくなるとのことで、2,980円。買おうかと思ったけど、DreamCastでしか遊べなくて、かつ、自分がプレイしたいと思えるソフトのタイトルが何も思い浮かばず、踏み止まったり。…『斑鳩』が気になってるけど、どうせこんな田舎では、入手不可能なのは間違いないし。仮に入手できたとしても、自分がプレイできる難易度とも思えないし。

PSEマークのついてない中古PS2も、2,980円ぐらいのはずだけど。さすがにソレは、皆さん買い求めてしまったのか、一台も置いてなかった。

#5 [iappli] ロックタウンのDoCoMo関係の店を覗いてきた

ずいぶんと豪勢・おしゃれな店内。その上、受付番号の紙をとらなきゃいけないぐらいに混んでた。自転車で食料買出しの帰りだったので、買い物袋をぶら下げたまま待つという、極めて異質・トホホな状態に。が、用があるので仕方ない。

こちらの異様な風貌に疑念を持ったのか、番号が呼ばれる前に、店員さんが声をかけてくれた。N505iの在庫はないかと尋ねたら、在庫は無いし、販売中止になってるから入手は無理とのこと。…だろうな。答えてもらったことに礼を言って、店から出た。

オークションとやらのやり方を調べ始めないといかんな。手を出したくはないけれど、そこでしか見かけないのでは仕方ない。

#6 [pc][digital] デジカメ PowerShot A300 から画像を読み取れない

新しいPC(Sempron 3100+、 _MSI K8MM-V(VIA K8M800 + VT8237R) )にWIAドライバやZoomBrowserEX等をインストールして、デジカメ Canon PowerShot A300 をUSBケーブルで接続してみたのだけど。画像を何枚か読んでるうちに反応が無くなってしまう。

タスクマネージャを見ると、CDPROC.exe というのがCPU処理を99%ほど占有してる。うーむ。

以前使っていたPCは 440BX M/B だったので、USB1.1 で接続していたのだけど。新しいPCは、USB2.0。そのへんがアレなのだろうか。それとも、VIAチップ関連の不具合とか、必要なドライバを入れてない状態とか、そのへんだろうか。

USBハブ(1.1対応品)を経由して繋いでいたので、直接、PC本体のUSBポートに接続してみた。…変化なし。

もしかして、A300 のファームウェアを更新してないのが問題なのかしら。改変内容として「PictBridge への対応」としか書いてなかったから、特に必要ないなと思っていたけど。何か送受信の手順が変わって、PCにインストールするアプリ側もそれを前提にしたやり取りになってる、とか。…と思って、ファームウェア更新のためのファイルをDLしたものの。ドキュメントを読むと、満充電された電池を使うことと書いてあった。というわけでまずはそのへんから。

何にせよ、せっかく撮影した画像を読み取れないのは困るな…。いっそ、CFリーダでも買ってこようか。そっちのほうが読み込み速度は上なのだろうし。

#7 [nitijyou] パチンコ屋さんを覗いてきた

書き忘れてたので、2006/03/19に追記。グリーンモールの向かいのパチンコ屋さんを覗いてきた。店内の半分がスロット?とやらで期待したけれど、お目当ての機種は無し。なんだか、北斗の拳とか、番長とか、アラビアンナイト風とか、時代劇風とか、そういう機種しか置いてないみたい。

2005/03/18(金) [n年前の日記]

#1 [anime] _操演日記

物凄い情報量。勉強になるなぁ。 *1

_ウルトラマンティガの制作記録。
遺跡壊しのあと2.3手あってダークの「飛び」になった、長谷川君を水平吊りにしてワイヤー親線の台車に吊るし、飛んで来てダーラムの腰につかみかかるというカットを撮るのだ。

実は人入りのウルトラマンをワイヤー親線で飛ばすというのは珍しい事なのだ(私自身は「ウルトラマンストーリー」という映画以来2回目になるのだが、過去のTVシリーズでやっていたろうか?)もちろん平成ウルトラマンでは始めてである、そもそもウルトラマンを人入りで吊るということ自体最近の発想だ、かつては飛びは「飛び人形」でというのがあたり前で、全身が入ると人形、寄りはイントレから体を乗り出して撮る、というのが普通だったのだ。

それが平成シリーズでは縦吊りやグリーンバックでの横吊り(移動しない)はいつの間にかあたりまえのようにやることになってしまった、これはティガの第6話「セカンド・コンタクト」の回で北浦監督がウルトラマンを吊りたいと言ったのが始まりだ。
何も知らずに、操演=ミニチュアの吊りと思い込んでたけど。人でも何でも吊るし、火薬の設置や点火タイミングもやるし、煙の流れる速度も調整するしで…。離れたところにあるものを全て制御して、演技をつけていくのが操演だったのですね。自分、不勉強でした。(;´Д`)

デジタル技術による後処理で吊り線を消せるようになったが故に、吊りのスケールが大きくなったというのは興味深い話。そんなところにもデジタル技術が影響を…。
*1: って何の勉強だかよく判らないけど…。や。単純に、特撮技術の話が好きなので。>自分。

#2 [cg_tools] グリーンバック関係の情報を検索・閲覧中

どんな材質を使ってる場合が多いのかが気になってるわけで。

_クロマキー合成 :

_グリーンバックの布??
わ。こんなスレがあったとは。めちゃくちゃ勉強になるなぁ…。 *1

ガンガンに光を反射する材質のほうがいいのかと思ってたけど、むしろ逆らしく。あまりテカらないもの ―― フェルト地などが良かったりするらしい。なるほど… φ(..)メモメモ

_合成テスト - AfterEffectsPRO 5、Premiere 6、CommotionPRO 4 によるグリーンバック合成の比較 :

_大き目の画像版。 …ソフトによってこんなに結果が変わるのか。うーむ。最後のあたりなんか、合成してる感じが全くしない。スゴイな…。

_自主映画の広場 :

_インディーズ向上委員会 なるサイトの中の掲示板。スゴイ情報量。どれもこれも興味深い話ばかり…。

_使える!照明器具&テクニック :

うーむ。照明って大変そうだ…。 *2

_合成用デジタルグリーンバックの360度ホリゾント :

なんかスゴイ…。

『ルームランナー撮影用スペシャル』に、なんだか感動(?)。歩く・走る場面で、そういう機材が必要になるのかしら。

_LED RING LIGHT :

カメラに装着してグリーンバックに照射するリング状のLEDライト。結構明るいのですな。

*1: いや、だから何の勉強なんだと…。
*2: 自分、今まで照明なる作業を全く意識したことがなかったから、読んでてもチンプンカンプン。

#3 [cg_tools] _特撮ぬいぐるみアニメ

気になる話。やっぱり回転は難易度が高いのですね。

_くま劇場 :

成果物の配信ページ。あらゆる特撮番組をぬいぐるみで再現。

#4 [game][movie] _実写版「鉄拳」

版権云々でもめて、「拳神」というタイトルになったらしい。そんな映画があったことすら知らなかった…。

_鉄拳の世界 :

FC版やらMD版やら。色々あるんだなぁ。

2004/03/18(木) [n年前の日記]

#1 [tv] 白い巨塔最終回

ええもん見せてもらった。ええもん見せてもらった。

#2 [digital][anime] _東芝、ノートPC用のメタノール燃料電池ユニットを試作

全然関係ない話なんだけど燃料電池繋がりで。デカレンジャーに出てきたロボット犬が、冷却水を人間にかけて喜んでたわけですが。アレ、燃料電池で不要になった水云々のセリフだったら、ちょっと感動してたかも。

アレ? そもそも冷却水って外部に排出しちゃっていいのだろうか。あのロボット犬の本体サイズなら、おそらく _こういった感じ で、内部で循環させて使いそうな。水冷システムが搭載されてるということは、内部は常時高温である可能性が高いだろうけど、そんな状況下で不用意に冷却水を捨てて大丈夫なのだろうか。片足上げて排出する見た目ののどかさとは裏腹に、彼自身にとっては生命維持(?)に関わる危険極まりない行動ではないのか。言わば命を懸けた排尿行動。そうまでして視聴者に笑いを提供するとは、漢だな。実はメスだったらどうしよう。ロボット犬の性別ってどうやって判断するんだ。それはともかく、排出してしまえば新たな冷却水を補充する必要があるわけで。彼がゴクゴクと水を飲む=冷却水を補充してる、というシーンも説得力を持つのかも。いや、そのへんの水道水を冷却水にすると腐食云々で危険らしいので、ウメコが差し出した水入れ(水道水)から顔を背けたほうが説得力がでてくるかも。どうでもいいか。…特撮モノは、アニメのように、設定考証の人は居ないのだろうか。幼児向けだからそこまでのレベルは求められてないのかな。

#3 [tv] _サブリミナル的表現手法及び光感受性に関する映像手法の問題への対応

ページ中の、「アニメーション等の映像手法に関するガイドライン」というのが気になった。 _(via 4im.net)

_アニメーション等の映像手法に関するガイドライン(PDF) :

これかな。たぶん。…サブリミナル云々とは問題が異なると思うんだが。いっしょくたにしてええんか>総務省。それはともかく、 _人にやさしい映像表現 って言い方がなんか嫌。

_[検証ポケモン事件] ピカチュウからの 警告 :

詳しく書いてあったのでメモ。参考資料へのリンクも豊富。リンクから辿って読んだ、 _「問題のポケモン38話を数値化する」 の、実写とアニメの編集作業の違いのあたり、面白かった。アニメ業界の各種手法は実写業界から馬鹿にされているらしい<そういうことじゃないだろよ。

#4 [seiji] _秋篠宮眞子さま、学習院初等科を卒業

_ろじぱら にて『「眞子さまが学習院初等科を卒業」というトピックに対し、インコースぎりぎりのネタを展開する剛のサイトはないものか!?』との一文が目に入り、気になって該当記事をググってみたのだけど。そもそも記事が一発で出てこなくて首を捻ったり。まさかと思うがgoogleは、皇室関係のページについても、W社関係と同様の検閲をしてるのであらうか。むむ。なんたる無礼であるかgoogleよ。W社と陛下を同列に扱うとは。陛下に対して無礼千万失礼極まりない不遜な行為ではないか。googleは腹かっさばいて陛下に詫びよ。なわけない。単に最近のニュースなので漏れてるだけであらう。

それはともかく。まこちんのセーラー服姿は犯罪レベルなほどに可愛いで御座るな。同じセーラー服でも、 _スケバン刑事の斉藤由貴 より _MSXのH1の広告の工藤夕貴 より可愛いで御座る。しかし待て。何故セーラー服なのだ。 世間には小学生のうちからセーラー服を着せる学校があるのか。それとも小学校の卒業式にはセーラー服を着せるのが世の常なのか。どうでもいいか。それにしても、もうそんなに大きくなったのかとショックでもあり。ついこないだ生まれたばかりのような気もするのだが。さすが神の血筋を持つだけあって皇室の人間は成長も早い。違うだろ。サーヤじゃあるまいし。間違えた。 _サーシャ じゃあるまいし。

それはそれとして。セーラー服を着た娘さんが天皇になる時代はこないものかのう。実現したら、なんとなく景気も良くなりそうな気がするので御座る。いや、景気が悪いままだとしても、皆、頭のネジが外れて、気持ちだけでもハッピーな国になるであろうよ。正月になると、硝子の向こうでセーラー服姿の娘さんが手を振り、それに呼応して民衆が日の丸の小旗を振るのです。嗚呼。素晴らしい光景。将軍様にも圧勝であるどころか、全世界を眺めてみても向かうところ敵なし。日本の経済復興の為にも、あるいは国民の精神高揚の為にも、女性天皇は是が非でも実現していただきたいと思う所存であります。だがしかし、 _自民党のみが必死に反対している 現状が。ぬう。自民党はそんなに男が好きか。男が好きで好きでたまらないのか。つまりアレか。自民党はホモの集団か。話がレズてる。いや、ズレてる。…全然ぎりぎりの展開になってないな。おそらくは、制服姿のまこちんを征服したい等の邪な文を期待されてるのだろうけど。拙僧はそのように節操のないことを書くのは心苦しいわけで。そもそも、征服したいなどと語る時点でロリコンとして正しくない。娘達を遠くから眺めて愛でてこそ真のロリコン道なり。実際に手を出すなど真のロリコンにあらず。ロリコンはロリコンとしてのプライドを持て。我らが師範であり神でもある宮崎駿御大将の潔い姿を見習うべし。皆の者、世が乱れた今こそ、御大将に続け。勝ち鬨をあげろ。何の勝ち鬨なんだか。

2003/03/18(火) [n年前の日記]

#1 アメリカvsイラク

アメリカがイラクに最後通告。ブッシュは戦争という手段が最もコスト安で短期間で確実に目的を果たせる手段であると計算したのだろうけど、計算ミスしてないか不安。

「戦争嫌い」「戦争ダメ」だけ言ってれば問題解決すると思ってる人達の存在にうんざり。ブッシュ以上に残酷で自己中心的な人達だ。

無知は罪、だった。更に恥。

#2 [seiji] アメリカvsイラク

アメリカがイラクに最後通告。ブッシュは戦争という手段が最もコスト安で短期間で確実に目的を果たせる手段であると計算したのだろう。たしかに他の手段に比べれば短期間で済むかもしれない。だが、人命が失われる。「人命=高コスト」と考えるアメリカ人の大半が戦争を支持しているのもおかしな気がするが、支持するだけの勝算があるのだろうか。あるいは9・11で眼が曇ったか。

フセインはやはり最後通告を拒否してきた。ヒトラーと同じ。独裁者は大抵そうだ。命を落とすその時まで権力の座にしがみつく。国民全員を巻き込んで国に多大な損害を与える「ひきこもり」に付き合わされるイラク国民に同情する。

考えてみると意外と日本は特殊なのかもしれない。明治維新の折、無血開城により江戸を戦火に巻き込まなかった徳川慶喜しかり、本人はまだ命を失っていないのにアメリカに降伏した昭和天皇しかり。前後で致命的判断ミスをしてはいるが、彼等はある瞬間、たしかに王たるものの思考をしていた可能性がある。民を統べる者は何を優先して考えるべきか。それを知らない者が独裁者と呼ばれる。

戦争はたしかに嫌だが、かといってイラクの実状を放置しておくわけにもいかない。戦争がダメだと言うなら、戦争以外にイラクを改善できる方法を提示しなければならない。「戦争嫌い」の感情論だけを声高に叫び、しかし戦争以外の改善策を何ら提示しないなら、「イラクを放置しよう」=「フセインを放置しよう」と呼びかけてことになる。つまり、「イラクの人々がどれだけ犠牲になろうが自分達の知った事じゃない」「彼等を人柱にしてでも俺達は平和を楽しもうぜ」…そう表明しているも同じだろう。

既にフセインはクルド人相手に化学兵器を用いている。空気に含まれたそれら兵器は、関係の無い女性や子供達の全身の皮膚を焼き、内臓をも焼いた。「戦争嫌い」を主張する人々はそれら事実を知っていてもなおフセインを放置すべきと言うのだろうか。「イラクの罪のない子供達の命が」などと一見美しい言葉を吐くが、その罪のない子供達の命を既に奪い、これからも奪い続ける可能性の高いフセインを放置しようとは、随分と矛盾した話ではないか。本心から「子供達の命」を救いたいと願っているなら、何かしら対策を打たなければならないのはたしかだろう。放置などできないはずではないか。「戦争嫌い」などと呑気で非現実な感情論を口にできる状況ではない。

(とは言ってもクルド人虐殺については諸説あり。少なくとも「そんな嘘話信じやがって」と言えるぐらいに知識を持ってる人ならば、反戦を訴えるにしてもそれなりにビジョンを持ち理論武装して訴えてるはずなので何の問題も無いしむしろどんどん反戦を訴えてほしいぐらい。しかしただ単に「嫌戦」だけで反戦を訴えてる人々は、下手すると「罪のない子供達の命」を奪う側に利用されかねない可能性について自覚すべきだ。北朝鮮の首領様と同様、フセインもまた人々を騙す事にかけては一流。ふと気づいたら、サリンをばら撒いたオウムの麻原みたいな奴をかばってた、ではあまりに愚かしいではないか。)

しかし、自分も、この時期に戦争を選択することには反対だ。査察を続ける事で、完全な状況改善は無理だとしても、ある程度の状況改善が得られたはず。そうなれば仮に最後は戦争になったとしても、今より短期間で終結し損害もより少なくて済むだろう。戦争に突入する前にまだやるべき事があったはず。ブッシュは「人命」というコストについて、もっと真剣に、慎重に考えるべきではなかったか。

などと平和ボケしたひきこもりアニヲタが吠えたところで現実は何一つ変わらないわけで。更に日本という国も、具体的な軍事力・各種支援を提供するわけでもなく、国連内でも所詮は蚊帳の外。となれば、せめて早期に戦争が終結する事を祈るだけであります。

2002/03/18(月) [n年前の日記]

#1 お酒

クローズアップ現代を見てたら、お酒に関して面白いニュースが。
酒をたくさん飲むと、酒に強くなるというのは、勘違いなんだそうです。 _(以下略)

つか、どうせ自分はコップ1,2杯のビールで眠くなるし(爆)
「飲め!」と言われても、そのうちマジ寝しちゃうから関係無いか(爆)

#2 [zatta] お酒

クローズアップ現代を見てたら、お酒に関して面白いニュースが。
酒をたくさん飲むと、酒に強くなるというのは、勘違いなんだそうです。

酒を飲める=アセトアルデヒド(=細胞を破壊する)を無力化できる酵素を持つ体質、ってことですが。
これは、先天的にそういった遺伝子を持ってるか否かで決まり、後天的には変化しないのです。

日本人の場合、3種類の遺伝子の持ち方があるらしく、それによって、
5割:酒が飲める。
4割:あまり酒が飲めない。
1割:全く飲めない。
という人数の割合になるのだそうで。

で、あまり酒が飲めないタイプは、飲み続けることで、酒に強くなったと思いこむのですが…
これが勘違い。

元々、そういう遺伝子を持ってませんから、アセトアルデヒドは毒物として体内に残り続けてる。
強くなったと思うのは、毒物が体内に残ってることを感知できない状態になってるから。
体が麻痺してるだけなんです。異常状態がずっと続くと、異常を異常と検出できなくなる。

でも、アセトアルデヒドは存在し続けてる。
そして、食道や胃の細胞を破壊し続ける…
なんでも癌の発生率が10〜15倍に跳ね上がるのだそうですよ。
ただでさえ、仕事でストレス溜めてヤバイのに、更に癌の発生率上げてどうするのよ。

つーことで、無理して飲んじゃイカンのですな。
「飲めば強くなるんだ! もっと飲んで訓練しろ!」
などと酒を注いでくる無知な輩の言葉を真に受けちゃダメです。
こっちが癌になって命を落とし妻や子供が涙に暮れても、相手は責任とってくれませんよ。

しかしなんとかならんかな…こういった、日本人の酒に対する風潮は。
外人と違い、半数が飲めない遺伝子を持つことを運命づけられた民族が…
わざわざ自虐的行為を繰り返し、しかもそれがビジネスと絡んだりする場面も…
日本人って、かなり頭悪い民族じゃなかろうか… (T-T)

2001/03/18() [n年前の日記]

#1 Linux大地に立たず

19,20,21日の3日間、父方の実家方面(埼玉)に墓参り&HP制作のヘルプに行って来ます。
電気屋をやってる親戚が、店のHPを作りたいらしくて。
果たして自分ごときの知識で役に立てるんだろうか。ちと不安。
それ以外にも父にあちこち引きずり回されるはずなので、誰かに会いにいく等の時間的余裕は無さそう。残念…


階下のサブマシンでLinuxを立ち上げようとしたら。
起動せず。トホー
起動途中でリセットがかかったり、エラーメッセージが出て固まったり。
SCSIボード増設したからかな。kernelとやらを作りなおさないとダメなんでしょうか<よくわかってない

色々試行錯誤。
なぜか、BIOSのメモリ関係をいじったら起動しました。
メモリに経年劣化ってあるんだろうか。うーん…
ちなみにSCSIボードは起動途中で自動で認識した模様(>設定画面らしきモノが出てきた)
てことはボード増設が原因ではなかったんでしょうね。

Linuxマシンにftpでcgiを送ったら正常動作しました。書きこみ処理もOK。
なぜ、Win上のAN-HTTPDでは動作しないのだろう。
書きこみ処理用のcgiに、バイナリを送った時点でエラーが出てる模様。
テキストを送ると動くんだけど。何が起きてるんだろう… (・_・?)

2000/03/18() [n年前の日記]

#1 (NoTitle)弟が、貸してた同人ソ...

弟が、貸してた同人ソフトを返しに帰ってきました。
で、その弟が東京にパーツ買出し(笑)に行ったとき入手したという変な同人ソフトを置いていきました。まだプレイしてないですけど「既知街」とかいうタイトル。嫌な雰囲気全開のパッケージを見る限り、どうも東鳩のブラックなパロディーモノらしいのですが。なんか一時期某同人ソフト屋さんで売上一位だったそうですね。
なるほどなーこういうアプローチもありかー、などと少し感心してしまいました。考えてみれば同人ソフトってそっち系のアプローチが主流になってしまったから、かえってこういうやり方のほうが客の興味をひくのかもしれませんね。「ときめかないナントカ」とか、そういう…って、そういうのばかりになってもなんかかなりとめどもなくイヤ〜ンな感じがしますが (´ー`;)

弟から _こんなHP も教えてもらいました。
大爆笑。
こういう使い方もあったのか、あのソフト…

弟曰く「帰る度に兄貴の話に付き合わされて寝る時間遅くなるもんだから、生活リズム狂って体調悪くなる。だからあんまり帰ってきたくないんだ(-_-メ)」だそうで。
そういうわけで珍しくAM3:00頃寝たです。


…ぬおー、眠れねー (´Д`;)

1999/03/18(木) [n年前の日記]

#1 (NoTitle)今日はスタイルシート...

今日はスタイルシートとやらをお勉強。
なんとなくわかったような気もするけど、どうもネスケでは見れない。なぜ?

以上、26 日分です。

過去ログ表示

Prev - 2024/04 - Next
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

カテゴリで表示

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


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

Powered by hns-2.19.6, HyperNikkiSystem Project