SVX日記
2017-02-04(Sat) VNCで衛星をロックオンしつつ、卓上カレンダを印刷
先週末、コンクリートブロックに塩ビパイプを立ててセメントを流し込んでいたのは、実は衛星放送受信用のアンテナ設置用の土台だったりするのであった。
で、例によって、パラボラアンテナの向きの調整には、ウェブカメラとVNCを活用するのがベストなのである。今回、VNCサーバはカミさんが使わなくなったThinkPadT400。また「Che-ez! webbie」という骨董のウェブカメラを引っ張り出してきて(数年ぶりなので探しだすのに苦労した)USBコネクタに挿す。アプリはvlcでアッサリ映った。VNCクライアントはオイラが使わなくなったPORTABOOKである。PORTABOOKはWindows10に戻してしまったので、厳密にはVNCでなく、リモートデスクトップ接続。T400にはxrdpをインストールした。
が、うまくいかない。T400には接続できるが、リモート画面の中で「error - problem connecting」といって沈黙してしまう。なんじゃこれ。ググるとやたらと事例が見つかるが、原因はどれもバラバラ。何か問題があると、どれもこのメッセージが出るらしい。
目的はアンテナの向きの調整であり、本質じゃない部分に引っかかっているのでイライラしてくる……が、最近は歳をとったのか、ちょっと心に余裕があるので、卓上カレンダをレンダリングする作業を挟んで気分を変える。
で、再開。大したログが出ていないが、netstatを見ると、xrdp-sesmanとのxrdpサーバの内部VNC通信がTIME_WAIT状態になっているのに気づいた。もしかして……と、思ったら、やっぱりこれだった。「.Xclients」を書いたら、デスクトップが映るようになった。よっしゃ。
手元の画面を見ながら(画面はハメコミ合成です)、アンテナの向きをチョイチョイと調整し、アンテナレベル55(推奨36以上)を達成。今後はズレて録画に失敗したりすることはないだろう。なにせ、これまでブロックに挿した木の棒にアンテナをくっつけていたのだからな。これにて、衛星放送受信環境改善作戦を終了する。
さて、引き続き、先ほどレンダリングした卓上カレンダを印刷する。以前より少しスクリプトを改善し、前後の月や、ワンポイントのイラストが入るようになっている。生成されたPDF(4月〜、8月〜)とライブラリごとスクリプトを置いておく。
2017-02-24(Fri) プログラミングフライデー
個人が幸せや楽しさを感じられるプログラミング(純粋に興味を満たす、生活を便利にする等)や、そのための時間の創出を促すことで、
- 充実感・満足感を実感できる生活スタイルの変革への機会になる
- プログラミング能力の強化や知的好奇心の充足につながる
- (単に消費するだけではなく)創造する人間へと傾向を変えていくきっかけとなる
……なんてのは、オイラの勝手な取り組みだ。別にプレミアムフライデーも悪くない取り組みだとは思っているけど。
と、別に今日完成させたわけではないのだが、ちょっと前から「30年前から気になっていたmz-2000のデモ画面の3DCG」の再現に取り組んでおり、無事描画に成功したのでプログラムリストと併せて公開しておく。
オリジナルのデモ画面は、シャープのガラパゴスストアのレトロ家電カタログで見ることができる。3種類とも基本的にはコブの数が違うだけだ。
(0..360).each {|rx| x0 = 360 - rx
x0 % 3 != 0 and next
(0..360).each {|y0|
y0 % 3 != 0 and next
x = 50 + x0 + y0 * 0.5
y = 300 + y0 * 0.2 - (x0 >> 3)
h = (dcos(3 * x0) - 1) * (dcos(2 * y0) - 1) * 60 if(ARGV[0] !~ /bc/)
h = (dcos(1 * x0) - 1) * (dcos(1 * y0) - 1) * 60 if(ARGV[0] =~ /b/)
h = (dcos(3 * x0) - 1) * (dcos(3 * y0) - 1) * 60 if(ARGV[0] =~ /c/)
win.line(x, y, x, y - h, 0)
win.pset(x, y - h, 4)
}
}
さらに、新たに気になった「mz-80Bのデモ画面の3DCG」も再現してみた。中折れ帽のような複雑な形状だが、シンプルなアルゴリズムで描いているのに違いなく、これまたヒラメくまでに時間がかかった。左下の付近で「陰面処理」が微妙に破綻しているが、オリジナルのデモ画面も同様に破綻しているようなので、それでよしとしておく。
xo = 150; yo = 150
(0..300).each {|rx| x0 = 300 - rx
x0 % 3 != 0 and next
(0..300).each {|ry| y0 = 300 - ry
y0 % 3 != 0 and next
x = 50 + x0 + y0 * 0.75
y = 200 + y0 * 0.5
r = sqrt((xo - x0) ** 2 + (yo - y0) ** 2) * 1.2
h = dcos(r) * 100 + dcos(3 * r) * -30 + 100
win.line(x, y, x, y - h, 0)
win.pset(x, y - h, 4)
}
}
2017-02-25(Sat) MAGICよりOpenGLへ、こちらガルデロータ
負けてらんないのよーッ! OpenGLなんかにーッ!などと叫びつつ、舌の根の乾かぬうちに、OpenGLの試食を始めたのであった。いや、実は仕事半分なのではあるが。
実はオイラ、68MACの末期の時代に、ちょっとレイトレーシングにハマった時期がある。モデラは使わず、完全にテキストファイル(テクスチャデータ以外)のみから、画像が生成されるというロジカルなところに魅力を感じ、毎晩、レンダリングさせつつ寝入っては、翌朝に結果をみて一喜一憂する、という日々を送っていた。
というわけで、3DCGのイロハくらいは身につけているのであるが、OpenGLはポリゴンが基本なので、ちょっと勝手が違う。ペラペラで中身がなく、表裏があり、勝手に影がつかない。一番驚いたのは、陰影をつけるためには、ポリゴンの法線ベクトルを自分で計算しなければならないところだ。
レイトレーシングの計算方法のストイックさに比べると、OpenGLには強いニセモノ感を感じる。例えるならグランツーリスモとレッジレーサーみたいなものか。とはいえ、様々に擬似する技術が次々に投入され、実写に近いクオリティでリアルタイムレンダリングできるまでに到達しているのはOpenGLの方なのも確かだ。
つーわけで、OpenGLを「自分のモノ」にするため、いつものように、ウェブ上からサンプルプログラムを持ってきて、写経するように、コードスタイルを自分好みに書き換えながら内容を理解し、ちょっとしたものを作るのである。
今回のお題は「ガルデロータ」。記憶が定かでないが、確か昔シャープのX1で「ガルデロータ」をモデリングし、そのワイヤーフレームをクルクル回して遊んでいた気がするのだ。Oh!mzで、高速グラフィックパッケージ「MAGIC」が発表されたのは1986年9月だから、たぶん、その頃のはず。30年を経て、いま、ポリゴン化するのである。
習作なので、敢えて雑に作ってあるが、陰影付きのガルデロータが30FPSでなめらかに回転できている。ソルバルウ(1991)、バージョン0.01といったところか。あとはバキュラを回して、ゲームっぽいモノにまとめてみたいところだが。
しかし、やたらとあちらこちらでみかける「ドビン」は、OpenGLのサンプルモデルだったのね。妙に納得したわ……。
■ narishi1972 [これはどんな言語で実装されたのでしょうか?]