ざつだ ん。 (12/01/01~)
12/01/06
・
謹賀新年
今年もよろしくお願いします。
・
引越し
年末に事務所を移転しまして。クリスマス前後の変な連休と短い正月休みも相まってかなりドタバタしました。totonica氏に 「絵ヅラがおかしいwww」 と言わしめたショットがコレ。引越し直後の僕の机です。
ディスプレイアームを導入したので、ちょっとスッキリしました。エルゴトロンの 45-241-026 に、余っていた 45-248-026 のアームを 2 本付けてトリプルディスプレイになっています (うち、1台は TW317A5 用スタンド)。
なんとか片付けも終わり落ち着いてはきたのですが、お客さんが納期を伸ばしてくれる事はない訳で (w
12/01/10
・
It's "天文" show time!
今年の 05/21 には金環日食があります。行儀悪いですけど、国立天文台のサイトから前回の皆既日食と今回の金環日食の画像を貼ってみます (画像はクリックで別窓で開きます)。
前回の日食並あるいはそれ以上に食分が大きいようです。東京は完全な金環日食となります。前回は日食観測用メガネが早々に品薄になったので、今回は早めに確保したいと思っています。
12/01/12
・
カーテン留め留め
カーテン留め用のフックを壁に打ち付けられないので、カーテン留め留めを作りました。
ダイソーで "くるみボタン" とフエルトを買ってきてハサミでチョキチョキ、木槌でガンガンやりました (フエルトは厚手なので)。もちろん、カーテンに縫いつけるのも自分でやりました。
最初はカーテン用の紐 (タッセルって言うんだっけ?) で纏める事も考えていたのですが、「誰もやらないだろうな...」 という考えに至ったので現在のような形になった訳です (w
・
60秒
05/21 に金環日食がありますが、07/01 には "2012/07/01 08:59:60" という、うるう秒があります (日本時間)。
・
22日
今年の秋分の日は 116年振りに 9/22 なのだそうです。"26.指定した日が祝日かどうかを調べる (Delphi によるテクニック&アルゴリズム)" は今年の秋分の日を正しく 9/22 と判定します...ご安心(?)あれ。
12/01/14
・
FireMonkey の TModel3D に読み込めるデータ (XE2)
Twitter ネタです。
オブジェクトインスペクタで TModel3D の MeshCollection の [...] ボタンを押して読み込める形式は、
- *.ase (Ascii Scene Export)
- *.dae (COLLADA)
- *.obj (Wavefront)
の 3 種類です。Blender や Google SketchUp でいずれかの形式にエクスポートできます...*.3ds?何の事ですか?
画像はこちらの初音ミクデータ (by ayihcustさん) を Google SketchUp で読み込み、COLLADA (*.dae) 形式でエクスポートしたものを TModel3D に読み込ませてみたものです。
ぶっちゃけ、正確に取り込めるかどうかはモデリングツールのエクスポータや元データに依存します。Google SketchUp で "正しく表示されているデータを *.dae にエクスポートしたもの" は TModel3D で大抵うまく読み込めるようですが...。では、もう一つ。
さらに、もう一つ
こちらは MikuMikuDance の *.pmd データ (by SaYaKa Project) を、
- PMD Editor で開く
- PMD Editor 用 Collada(.dae)エクスポータープラグイン で *.dae 形式でエクスポート
- Google SketchUp にインポート
- [ウィンドウ | エッジをソフトニング] でモデル形状を滑らかに
- [ファイル | エクスポート | 3D モデル...] にて、再度 *.dae にエクスポート
...という手順で作成した、萌え萌えキュンな *.dae を TModel3D に読み込ませたトコロです。
・
FireMonkey の TMemo (XE2 / Windows)
FireMonkey の TMemo は当方の環境だとメチャメチャ重いです。TMemo のコントロールサイズに比例して入力レスポンスが悪くなっていく件は QC にも入っています。
これを回避するには、FMX フォームの OnCreate イベントハンドラ等に
FMX.Types.GlobalDisableFocusEffect := True;
|
この一行を追加します。名前の通り、フォーカス時の(グロー)エフェクトを無効にするものです。回避策と言えば回避策ですが、見た目が若干違ってしまいますね。元ネタは公式フォーラムの "FireMonkey TMemo performance problems." です。
12/01/16
・
地球はま~るい、ま~るいはママの顔、ボ~クの~顔♪ (副題: 多分、4 分以内でできると思う地球儀)
さて、お題の通り (?)、FireMonkey で地球儀を作ってみたいと思います。では、それっそれー!
- [ファイル | 新規作成 | FieMonkey HD アプリケーション]
- TViewport3D (Viewport3D1) を貼り、プロパティを変更します。
- Align: alClient
- Color: Black
真っ暗ですが気にしない。
- TLight (Light1) を貼ります。LightType がデフォルトで ltDirectional (平行光源) なので、プロパティの設定は不要です。
適当な場所に移動させてください。
- あいなまさん...じゃなくて、スフィアじゃな...合ってるのか。TSphere (Sphere1) を貼り、プロパティを変更します。
- Depth: 10
- Height: 10
- RotationAngle.X: 90
- Width: 10
正面から見て北極を上にするために、X 軸を 90°傾けます。サイズは適当です。
- オブジェクトインスペクタで Sphere1.Material.Texture をダブルクリックして地球のテクスチャを読み込ませます。
地球のテクスチャは "Texture maps of Earth and Planets" のを利用しています。
- オブジェクトインスペクタで Sphere1.Depth (Height でも Width でもいい) をドロップダウンし、"TFloatAnimation の新規作成" を選びます。
- TFloatAnimation (FloatAnimation1) のプロパティを変更します。
- Duration: 30
- Enabled: True
- Loop: True
- PropertyName: RotationAngle.Z
- StopValue 360
Sphere1 の Z 軸 (赤道方向) を 30 秒で 1 周 させます。
- この時点でコンパイルして実行しても地球は回るのですが、もうひと工夫してみます。
- TSphere をもう一つ (Sphere2) 貼り、プロパティを変更します。
- Depth: 10.1
- Height: 10.1
- Material.Ambient: White
- Material.DiffUse: Null
- Material.Emissive: White
- RotationAngle.X: 90
- Width: 10.1
雲のレイヤーです。外径をわずかに Sphere1 より大きくしておきます。
- オブジェクトインスペクタで Sphere2.Material.Texture をダブルクリックして雲のテクスチャを読み込ませます。
雲のテクスチャも "Texture maps of Earth and Planets" のを利用しています。
- オブジェクトインスペクタで Sphere2.Depth (Height でも Width でもいい) をドロップダウンし、"TFloatAnimation の新規作成" を選びます。
- TFloatAnimation (FloatAnimation2) のプロパティを変更します。
- Duration: 40
- Enabled: True
- Loop: True
- PropertyName: RotationAngle.Z
- StopValue 360
Sphere2 の Z 軸 (赤道方向) を 40 秒で 1 周 させます。これで雲と地球が二重スクロール (?) します。
- 完成です。コンパイルして実行してみましょう。
[構造ペイン] でコントロールの関係を確認しながらやってみれば、そう難しい事ではないと思います。多分、4 分以内に地球が回せたのではないでしょうか?"4 分の縛り" の意味が解らない方はこちらをどうぞ。
なお、"TSphere の Depth (または Height / Width) で TFloatAnimation を追加している" のは、コンポーネントパレットから TFloatAnimation を親子関係で貼り付ける方法が判らなかったのと、直接 TSphere.RotationAngle.Z から TFloatAnimation を作る事はできないからです。
・
コンポーネントパレットの TFloatAnimation を TSphere に貼り付けるには?
あー、
- Viewport3D の何も無いところをクリック
- コンポーネントパレットの TFloatAnimation を選択
- 目的の TSphere をクリック
こうすれば親子関係で貼り付くのか...先に選択してちゃ駄目なのね。他に TFloatAnimation を Viewport3D に貼りつけて構造ペインで TSphere に移動する方法もあるけど、何らかのタイミングで目的のコントロールの配下に移動できない事があるんだよなぁ...。この辺、ちょっとトリッキー...というか慣れが必要だなぁ。
12/01/18
・
FireMonkey の Tips
一昨日辺りからこっそりと "Delphi (FireMonkey) によるテクニック&アルゴリズム" というのが追加されています。
"1.FireMonkey で使えるコンポーネントは?" は DocWiki へのリンク以外に内容が殆どありませんが、そのうち拡充していく予定です。FireMonkey については英語版 DocWiki にすら記事がないものもあり、特に 3D 関係は今まで 3D を扱った事のないヒトにはプロパティ名から機能を推測する事も困難だと思います。そういった背景もあり、例えば...
先日の地球儀の雑談で解説しなかったプロパティの意味等も、若干ですが記述しています。
・
GRADIUS THE SLOT
パチやんないんでノーマークだったけど...相良軍曹、何やってるのよ?
12/01/20
・
Dive into your body. Feel so good! (副題: 二匹目のドジョウでパノラマ写真ビューア)
さて、お題の通り (?)、パノラマ写真ビューアを作ってみましょう。トキメキの Diving!
- [ファイル | 新規作成 | FieMonkey HD アプリケーション]
- TForm (Form1) のプロパティを設定します。
- ClientHeight: 450
- ClientWidth: 800
実行時のフォームのデフォルトサイズを 16:9 にしたかっただけです。必須作業ではありません。
- TViewport3D (Viewport3D1) を貼り、プロパティを設定します。
- TCamera (Camera1) を貼り、プロパティを設定します。
- Position.X: 0
- Position.Y: 0
- Position.Z: 0
- TViewport3D (Viewport3D1) のプロパティを再度設定します。
- Camera: Camera1
- UsingDesignCamera: False
- TCylinder (Cylinder1) を貼り、プロパティを設定します。
- Depth: 100
- Height: 100
- Material.Modulation: tmReplace
- Rotation.Angle.Z: 90
- TwoSide: True
- Width: 50
TCylinder の底面を上下に持ってくるために Z 軸を 90°回転させています。また、テクスチャを裏面にも表示するために TwoSide プロパティを True に設定します。TCylinder の高さ (ここでは Width プロパティ) は適当です。アスペクト比がおかしくなるので本来なら画像サイズから計算すべきですが、今回はコーディングレスが目標ですので...。
- オブジェクトインスペクタで Cylinder1.Material.Texture をダブルクリックしてパノラマ写真をテクスチャとして読み込ませます。今回のパノラマ写真は、"パノラマ写真をつくってあそんでみた日記 (スイーツにはほど遠い)" さんからお借りしました。
注意点ですが、読み込ませたテクスチャの裏面は鏡像になっていますので、あらかじめ画像の左右を反転させておく必要があります。
- [構造ペイン] で ViewPort1 を選択し、コンポーネントパレットの TFloatAnimation を選択して、フォームデザイナで適当な位置 (Camera1 の上以外ならどこでもいいです) に置きます。
Cylinder1 以外の子になってしまったら、[構造ペイン] で Cylinder1 の子になるようにドラッグ&ドロップして修正して下さい。
- TFloatAnimation (FloatAnimation1) のプロパティを変更します。
- Duration: 60
- Enabled: True
- Loop: True
- PropertyName: RotationAngle.X
- StartValue: 360
- StopValue: 0
Cylinder1 の X 軸 (水平方向) を 1 分で 1 周 させます。StartValue が 360 で、StopValue が 0 なので、カメラが時計回りに動いているように見えます。もちろん、Camera1 の方をアニメーションで回転させても構いません。
- 完成です。コンパイルして実行してみましょう。
簡単な解説を。
- 要は "壁"...じゃなくて、"TCylinder の中にいる" のです。
- TViewport3D.UsingDesignCamera を False に設定すると Camera プロパティに指定した TCamera の視点になります。コードで実行時にカメラを切り替える場合には Repaint しなくてはなりません。
- TCylinder.Material.Modulation を tmReplace にすると、テクスチャの色が使われるため TLight を使う必要がなくなります。
- 地球儀と同じ横回転なのに、RotationAngle.Z ではなく RotationAngle.X をアニメーションさせているのは、3D オブジェクトを 90°傾けた軸が異なるからです。
とても簡単にパノラマ写真ビューアができました。単純な 3D アプリケーションではありますが、むしろこのような単純な物の方が応用範囲が広くていいと思います。なお、素材となるパノラマ写真を作るには、"Microsoft Research Image Composite Editor (ICE) (Microsoft Research)" が使えます (窓の杜の記事)。
・
TPlane と TwoSide プロパティ
「何で "Double-Sided" じゃないのだろう?」 とか思わなくもないけど、TwoSide プロパティの話です。
TPlane は TwoSide を True にしてもテクスチャは裏面に描画されません。"変更不可能な 0.01 の厚みがある" からです。TPlane の裏面は、その 0.01 の厚みの中にあります。裏返った画像が使いたければ、TImage3D を使うか、ライティングの影響を受ける必要があるのであれば、TDummy を使って二枚の TPlane を貼り合わせるしかないように思えます。
12/01/24
・
Youtube にアップした FireMonkey 関連動画
現時点で 3 本あります。BGM を含む音声は一切使われていません。
動画は最大化して観ることをオススメします。
・
Delphi (FireMonkey) Tips
"1.FireMonkey で使えるコンポーネントは?" は、簡単ではありますが各パレットページの説明がすべて記述されています。英語版 DocWiki にしか記述がないもの、あるいは英語版 DocWiki にも記述がないコンポーネントもすべてあります...但し、ドキュメントやサンプルコードが存在しないものに関しては記述が曖昧になっている箇所があります。
...また、
新しい Tips も追加されています。