2015/10/23

Win32API メモ (その3) : コントロールを追加する

※ここではUnicode文字セットを使用するものとして書いてある。Wで終わるものは基本的にUnicode版なので、ドキュメントを検索するときは末尾のWを消しておくこと。


コントロールを追加するには、CreateWindowExW関数のLPCTSTR lpClassNameにコントロールのクラス名を、DWORD dwStyleにWS_CHILDを、HWND hWndParentにコントロールの表示に使用するウィンドウをセットして実行する。

デフォルトではコントロールが表示されないので、DWORD dwStyleにWS_VISIBLEをセットしておくか、ShowWindow関数を使う必要がある。

※DWORD dwStyleにWS_OVERLAPPEDWINDOW等がセットされている場合、ウィンドウの枠が表示されてしまうので注意が必要。(ちなみに、移動もできるようになる)(WS_から始まるスタイルは上位ワードを使用して定義されている)


Editコントロールで文字を入力するには、TranslateMessage関数を実行してWM_CHARメッセージ等を生成する必要がある。

2015/10/21

Win32API メモ (その2) : メッセージループ

※ここではUnicode文字セットを使用するものとして書いてある。Wで終わるものは基本的にUnicode版なので、ドキュメントを検索するときは末尾のWを消しておくこと。


メッセージループを構成する際、次のようなことをしてはいけない:

    while (GetMessageW(&msg, hWnd, 0, 0))
    {
        //処理
    }

GetMessageW関数はエラーが有った場合に-1を返すため、このように書くと問題のあるメッセージを処理しようとして致命的なエラーを引き起こす可能性がある。
代わりに、次に示すように-1が返されたらエラー処理を行うようにする:

    while ((bRet = GetMessageW(&msg, hMainWindow, 0, 0)) != 0)
    {

        if (bRet == -1)
        {
            //エラー処理
        }
        else
        {
            //通常の処理
        }
    }



PeekMessageW関数でループを構成すると、パフォーマンスに悪い影響をあたえるので避けるべきである。

2015/10/20

Win32API メモ : ウィンドウの作成と表示

※ここではUnicode文字セットを使用するものとして書いてある。Wで終わるものは基本的にUnicode版なので、ドキュメントを検索するときは末尾のWを消しておくこと。


windows.hをインクルード。



wWinMainエントリポイントを定義する。

WinMainの引数LPSTR lpCmdLineは、wWinMainではLPWSTR型である。



WindowProcコールバック関数を定義する。
この関数の返り値は次のように記述する(ただし、変数名はWindowProcの引数と同じ):

    return DefWindowProcW(hwnd, uMsg, wParam, lParam);



WNDCLASSEXW構造体を記述する。

WNDPROC lpfnWndProcには先程のコールバック関数を指定する。

LoadIconW関数の返り値をHICON hIconに代入することによってウィンドウのアイコンを指定することができる。
デフォルトで使用できるアイコンはリンク先を参照。

LoadCursorW関数の返り値をHCURSOR hCursorに代入することによってウィンドウにカーソルが移動した時に表示されるカーソルの形状を指定することができる。
NULLを指定した場合は、ウィンドウにカーソルが移動するたびに、明示的にカーソルの形状を指定しなければならない。
デフォルトで使用できるカーソルはリンク先を参照。

HBRUSH hbrBackgroundにはクライアント領域を塗りつぶすのに使用されるブラシへのハンドルまたは、システム標準の色の値+1をHBRUSHにキャストしたものを代入する。
例えば、COLOR_WINDOWを使用する場合は次のようになる:

    (HBRUSH)(COLOR_WINDOW + 1)

NULLを指定した場合は、アプリケーションが自分でクライアント領域を塗る必要がある。

LPCTSTR lpszClassNameには、CreateWindowExW関数でクラスを呼び出すのに使用される文字列へのポインタまたは、RegisterClassExW関数等から返されるATOM型の値を指定することができる。



RegisterClassExW関数に先程のWNDCLASSEXW構造体を引数として実行



CreateWindowExW関数のLPCTSTR lpClassNameに、lpszClassNameに指定した文字列または、RegisterClassExW関数から返されるATOM型の値を指定してウィンドウを作成する。



ShowWindow関数に先程のCreateWindowExW関数からの返り値を引数として実行することでウィンドウを表示時する。

int nCmdShowには、ユーザーがプログラムに対して設定したウィンドウの表示方法に従う場合はWinMainエントリポイントの引数のnCmdShowを、それ以外の場合はリンク先にて記述されている値を指定する。

2013/11/23

Octane for Blenderについて

Octane Render for Blenderを購入したので、
いくつか参考になることでも書いていこうかと思う。


自分が初めてOctane Renderを使用しようとして手間取ったのは、
Environment LightがデフォルトでONになっていて、
OFFにすることが出来ないということであった。
なので、実質的にOFFにするための手順を以下に示す。

Environment Lightを(実質的に)無効にするには、
World>Octane Environment>Daylight TypeをDirectionにし、
Sun DirectionをX,Y,Zすべて0にすると、Octane Environmentは何も照らさなくなる。

上記の方法だと上手くいかない(全てのライトが何も照らさなくなる)ので、訂正。
下が正しい方法。

Environment Lightを(実質的に)無効にするには、
World>Octane Environment>Daylight TypeをDirectionにし、
Sun DirectionをXとZは0,Yは-1にすると、Octane Environmentは何も照らさなくなる。
※Yは負の数ならなんでも良い(正規化されるため)

2013/06/11

Blenderの軟体シミュレーションについて(その4)

前回の続きです。

ソフトボディセルフコリジョン:
  頂点に球状の領域を持たせ、球同士の衝突の判定を有効にする。
  使用するには、ソフトボディエッジ>コリジョン>辺がオンになっている必要がある。
ソフトボディセルフコリジョン>コリジョンボールサイズの計算:
  頂点に持たせる球状領域の半径の計算方法を設定する。
  マニュアル:
    辺の長さによらず、自分で設定した値(単位はBU(ブレンダーユニット))を使用する。
  平均:
    辺の長さの平均値を使用する。
  最小:
    辺の長さの最小値を使用する。
  最大:
    辺の長さの最大値を使用する。
  最小最大平均:
    辺の長さの最小値と最大値の平均値を使用する。
ソフトボディセルフコリジョン>ボール>サイズ:
  コリジョンボールサイズの計算がマニュアルなら、球状領域の半径を、
  それ以外なら、計算された値(平均値など)の係数を設定します。
ソフトボディセルフコリジョン>ボール>剛性:
  不明。
  大きくすると強く反発するようだ。
  減速が1の場合は効果がない。
ソフトボディセルフコリジョン>ボール>減速:
  球状領域内に侵入した球状領域を持つ頂点に働く反発力を弱める量。
  小さくするほど反発力は大きくなり、大きくするほど反発力は小さくなる。
  大きすぎると十分に反発せず自己交差を起こし、
  小さすぎると過剰に反発して破綻する原因になる。

2013/06/09

Blenderの軟体シミュレーションについて(その3)

前回の続きです。
 
ソフトボディソルバー>ステップサイズ>最小ステップ:
  フレームあたりの最小ステップ数を設定する。
  コリジョンがうまくいかない場合はこの値を大きくすると動作が安定する。
ソフトボディソルバー>ステップサイズ>最大ステップ:
  フレームあたりの最大ステップ数を設定する。
  エラー上限、最小ステップと共に設定することで、
  計算時間が極端に長くならずに良い結果が得られるようになる。
ソフトボディソルバー>ステップサイズ>オートステップ:
  ステップ数の決定に速度を使用する。
  ステップ数は状況に合わせて最小ステップと最大ステップの間で動的に変化するようになる。
ソフトボディソルバー>エラー上限:
  コリジョンとステップ数を設定する際の不正確性を設定する。
  この値を小さくすることで、適切なステップ数が設定されるようになるが、
  ステップ数が大きくなる原因にもなる。
  (正確な計算のためにステップ数が増やされるという意味であり、悪いことではない。)
ソフトボディソルバー>ヘルパー>チョーク:
  コリジョンオブジェクト内に侵入した頂点を減速させる量。
ソフトボディソルバー>ヘルパー>ファジー:
  不明。
ソフトボディソルバー>診断>コンソールに出力:
  ソルバーの進行具合をフレームごとにコンソールに表示する。
ソフトボディソルバー>診断>概算行列:
  不明。

個人的に推奨する設定方法を以下に示す。
  1. 最小ステップを0、エラー上限を0.001にし、オートステップをオンにする。
    (但し、頂点が多い場合はエラー上限を上げたほうがいいかもしれない。)
  2. 最大ステップを設定し、異常な結果が得られる場合は最大ステップを大きくする。
  3. 最大ステップが非常に大きな値であるのにもかかわらず異常な結果が得られる場合は、
    最小ステップを大きくし、最大ステップを設定し2に戻る。
  4. それでも異常な結果が得られる場合は、パラメータの設定を見直す。
以上。

続きは後で説明したいと思う。

Blenderの軟体シミュレーションについて(その2)

前回の続きです。
未知のパラメータについては、後で調べます。

ソフトボディエッジ:
  辺にばねを適用する。
ソフトボディエッジ>ばね>引く:
  辺が伸びた時の縮む力を設定する。
  ステップ数に対して大きすぎる値を指定すると破綻するので注意が必要。
ソフトボディエッジ>ばね>押す:
  辺が縮んだ時の伸びる力を設定する。
  ステップ数に対して大きすぎる値を指定すると破綻するので注意が必要。
ソフトボディエッジ>ばね>減衰:
  変形させる力を減衰させる。
ソフトボディエッジ>ばね>プラスチック:
  不明。
ソフトボディエッジ>ばね>曲げ:
  エッジのなす角を維持しようとする力の量を設定する。
  0で無効、重さに対して適当な値を設定すると、
  ゼリーのようにぷるぷるした動きをするようになる。
  重さに対して十分小さい値を設定すると、曲げる力に負けて、潰れるようになる。
  逆に、十分大きい場合は、ほとんど変形しなくなる。
ソフトボディエッジ>ばね>長さ:
  不明。
  不適切な値を設定すると破綻する。
  0で無効。
ソフトボディエッジ>ばね(頂点ウェイト):
  不明。
ソフトボディエッジ>四角面の対角線:
  不明。
ソフトボディエッジ>四角面の対角線>せん断:
  不明。
ソフトボディエッジ>空気力学>シンプル/揚力:
  不明。
ソフトボディエッジ>空気力学>強さ:
  不明。
ソフトボディエッジ>コリジョン>辺:
  辺に対するコリジョンを有効にする。
  ソフトボディセルフコリジョンを使用する場合はオンにする必要がある。
ソフトボディエッジ>コリジョン>面:
  面に対するコリジョンを有効にする。

続きは後で解説したいと思う。

2013/06/08

Blenderの軟体シミュレーションについて

Blenderには軟体シミュレーション(Softbody)があるが、
探してみてもパラメータについて解説しているサイトがないので、
それについて解説して行きたいと思う。(実際には自分用のメモにするつもりだが)

ソフトボディ>オブジェクト>摩擦:
  オブジェクトの頂点が移動するときに掛かる摩擦力。
  この値を大きくすると、変形がゆっくりになる。
ソフトボディ>オブジェクト>重さ:
  オブジェクトの質量のはずだが、詳細不明。
  重力下で重さを0にすると動かないのは当然だが、
  0に近い値を設定すると何故か動きが非常にゆっくりになるので注意が必要。
ソフトボディ>質量:
  頂点ウェイトを使用して各頂点の重さを設定できる。
ソフトボディ>シミュレーション>速度:
  シミュレーションの速度を設定する。

続きは後で解説したいと思う。