Cycles用のDynamic Skyというアドオンがあって、楽に空を作れる。さしてリアルな物ではないが、もの凄く適当(ちょうど良いの意味)な事がある。
それを他のレンダラで使おうと思うと、環境テクスチャにするのが一番いい。
① レンダラをCyclesにする
② カメラを選択し、LensをPanoramicにする
③ TypeをEquirectangularにする
④ 必要に応じて、カメラの位置と角度を変える
⑤ せっかくなので出力形式をhdrにする
結果
注意:
Gizmo |
allows you to connect a Fog Gizmo so that the effect is confined within a specified volume Fog Gizmoを接続することで、指定された領域内にのみエフェクトが発生するようにします |
Color |
defines the color of the fog when it is illuminate by light sources. You can also use a texture map to drive the fog color. 光源によって照らされるときのfogの色を定義します。テクスチャマップを使用することもできます。 |
Emission |
controls the fog emission (self-illumination). You can use this parameter to substitute the ambient illumination inside the fog, instead of using GI. fogの自己照明を制御します。このパラメータを使用すると、GIを使用する代わりに、霧の中の環境光を置き換えることができます。 |
Emission Mult |
a multiplier for the Emission parameter Emissionパラメータの倍率 |
Fog Density |
a multiplier for the fog Distance parameter that allows a texture to be used for the density of the fog |
Lights |
allows you to specify which lights are going to affect the fog fogに影響するライトを指定します |
Use Height |
when enabled allows you to limit the fog height 有効にすると、fogの高さを制限できます |
Height |
specifies an upper limit for the fog fogの上限を指定する |
Subdivs |
this parameter determines the number of points inside the fog at which volumetric lighting is evaluated. Smaller values for this parameter render faster, but may produce noise in the image. Higher values render longer, but with less noise. このパラメータは、体積照明が評価される霧の中の点の数を決定します。このパラメータの値を小さくするほど、レンダリングは高速になりますが、画像にノイズが発生する可能性があります。値が大きくなるほど、ノイズは少なくなります。 |
Fog Distance |
controls the fog density. Larger values make the fog more transparent, while smaller values make it more dense. You can also control the density with a texture map. fogの濃度を制御します。値を大きくすると霧がより透明になり、値が小さいほど霧が濃くなります。テクスチャマップで密度を制御することもできます。 |
Simplify Textures for GI |
When this option is checked V-Ray will use a simplified method for calculating the GI when rendering parts of the fog that are textured or are being faded out. このオプションをオンにすると、V-Rayは、ぼかしの一部がテクスチャリングされているか、フェードアウトされているときにGIを計算するための簡単な方法を使用します。 |
Scatter GI |
when on, the fog will also scatter global illumination. Note that this can be quite slow. In many cases, global illumination within the fog can be substituted with a simple emission term. When this option is on, the currently selected global illumination algorithm in the V-Ray settings will be used to accelerate GI inside the volume. オンにすると、霧は大域照明も散乱させます。これは非常に遅いことに注意してください。多くの場合、霧内の大域照明は簡単な発光項で置き換えることができます。このオプションをオンにすると、現在選択されている大域照明アルゴリズムがV-Ray設定で使用され、ボリューム内のGIが加速されます |
Scatter Bounces |
when Scatter GI is enabled, this controls the number of GI bounces that will be calculated inside the fog. Scatter GIが有効になっている場合、フォグ内で計算されるGIバウンスの数を制御します。 |
Light Mode |
this option allows you to specify which lights will be considered when rendering the environment fog. It is used when you have certain lights affecting just specific objects in the scene while another group of lights is affecting the environment fog. このオプションを使用すると、environment fogをレンダリングするときに考慮するライトを指定できます。 これは、特定のライトがシーン内の特定のオブジェクトにのみ影響を与え、ライトの別のグループが環境フォグに影響を与えている場合に使用されます。 --------------------------------------------------------------- No lights - the lights in the scene will not affect the environment fog. Per-Gizmo (default) - the lights attached to the environment fog set will be ignored. Only the lights affecting the shape where the fog resides, will be used. Override - only the lights affecting the environment fog set will be considered. Intersect - only lights that are affecting both the shape and the environment fog set will be considered. Add - both lights that are affecting the shape and the environment fog set will be considered.
|
Fade Out Mode |
this option allows you to chose between two different falloff modes: Multiply by density and Add density to falloff. フォールオフモードを選択します。密度で乗算か、減算に密度を加算かから選択します。 |
Fade Out Radius |
when the fog effect is contained within a gizmo this option allows you to specify a falloff radius for it. This way the fog effect does not have sharp edges at the edges of the gizmo. Fogエフェクトがgizmoに含まれている場合、このオプションでフォールオフ半径を指定できます。 これにより、fogはgizmoのエッジが鋭くなくなります。 |
Step size |
determines the size of one step through the volume. Smaller steps produce more accurate results but are slower to render. In general, dense volumes require smaller step sizes than more transparent volumes. In practice, step sizes that are two to three times smaller than the Fog distance parameter work well. ボリューム内の1ステップのサイズを決定します。 ステップが小さくなるほど正確な結果が得られますが、レンダリングが遅くなります。 一般に、高密度ボリュームは、より透明なボリュームよりも小さなステップサイズを必要とします。 実際には、フォグ距離パラメータの2〜3倍小さいステップサイズがうまく機能します。 |
Tex Samples |
determines the number of texture samples for each step through the volume. This allows to sample textures more accurately than the volumetric lighting. It is useful in cases where the textures vary much faster than the lighting itself (e.g. for detailed fractal textures). ボリュームを通る各ステップのテクスチャサンプル数を決定します。 これにより、体積測定照明よりも正確にテクスチャをサンプリングすることができます。 テクスチャが照明自体よりもはるかに速く変化する場合(例えば、詳細なフラクタルテクスチャの場合)に有用である。 |
Max steps |
specifies the maximum number of steps through the volume. ボリュームの最大ステップ数を指定します。 |
Cutoff Threshold |
this parameter controls when the raymarcher will stop traversing the volume. If the accumulated volume transparency falls below this threshold, the volume will be considered opaque and tracing will be aborted. Higher values make the rendering faster but may introduce artifacts. このパラメータは、レイマーチャがボリュームをトラバースするのを止めるときを制御します。 蓄積されたボリュームの透明度がこのしきい値を下回ると、ボリュームは不透明とみなされ、トレースは中断されます。 値を大きくするほどレンダリングは速くなりますが、アーティファクトが発生する可能性があります。 |
Shadow Opacity |
this parameter controls the opacity of the shadows cast by the fog このパラメータは、fogによって落ちる影の不透明度を制御します |
Solid Mode |
when enabled V-Ray will sample the fog uniformly 有効にすると、V-Rayはfogを一様にサンプリングします |
Solid Threshold |
a fraction of the Density parameter at which V-Ray will sample the fog when Solid Mode is enabled 上記ソリッドモードが有効になっているときにV-Rayがfogをサンプリングする濃度パラメータの一部 |
Affect Shadows |
specifies if the fog should affect shadow rays. fogがシャドウレイに影響するかどうかを指定します。 |
Affect Background |
when this option is off, the background will not be obscured by the fog. このオプションをオフにすると、背景が霧によって隠されることはありません。 |
Affect Camera |
specifies if the fog will be visible to camera rays. カメラの光線に霧が表示されるかどうかを指定します。 |
Affect GI |
specifies if the fog should affect GI rays. 霧がGI線に影響するかどうかを指定します。 |
Affect Reflections |
specifies whether the fog will be rendered in reflections. フォグが反射でレンダリングされるかどうかを指定します。 |
Affect Refractions |
specifies whether the fog will be rendered in refractions. フォグが屈折でレンダリングされるかどうかを指定します。 |
モーダレスダイアログボックスを作成する関数には、CreateDialogの他にCreateDialogParamがある。
https://msdn.microsoft.com/ja-jp/library/cc410696.aspx
HWND CreateDialogParam( HINSTANCE hInstance, // アプリケーションのインスタンスのハンドル LPCTSTR lpTemplateName, // ダイアログボックステンプレートを指定します HWND hWndParent, // オーナーウィンドウのハンドル DLGPROC lpDialogFunc, // ダイアログボックスプロシージャへのポインタ LPARAM dwInitParam // 初期値 );
この初期値と呼ばれる第五引数dwInitParamは何かというと、ダイアログ初期化の際に呼ばれるWM_INITDIALOGのlParam値である。
オブジェクト指向ではないCreateDialogにとって、CreateDialogに渡せる、ユーザが任意に指定できるグローバル変数以外の唯一のパラメータがこれなのである。
以下はこのdwInitParamで初期値を渡す例である:
#include <Windows.h> #include "resource.h" #include <tchar.h> INT_PTR CALLBACK WndProcModeless(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_INITDIALOG: if (lParam) { TCHAR* c = (TCHAR*)lParam; MessageBox(hWnd, c, 0, 0); ShowWindow(hWnd, SW_SHOW); } return TRUE; case WM_COMMAND: switch (wParam) { case IDOK: MessageBox(hWnd, _T("IDOK"), 0, 0); PostQuitMessage(0); return TRUE; } return FALSE; } return FALSE; } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow) { CreateDialogParam( hInstance, MAKEINTRESOURCE(IDD_DIALOG1), nullptr, WndProcModeless, (LPARAM)_T("鵺") ); MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; }
#pragma once #include <windows.h> class CnuDlgModeless { HWND m_hwnd; HINSTANCE m_hInstance; static INT_PTR CALLBACK StaticWndProcDlg(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); public: HWND GetHWnd()const { return m_hwnd; } HINSTANCE GetHInstance()const { return m_hInstance; } virtual ~CnuDlgModeless(); //CreateDialogParam関数の呼び出し HWND nuCreateDialog( HINSTANCE hInstance, // インスタンスハンドル LPCTSTR lpTemplate, // ダイアログボックスの名前 HWND hWndParent // 親ウィンドウのハンドル ); //個別のウィンドウプロシージャ virtual INT_PTR WndProcDlg( HWND hWnd, UINT msg, WPARAM wp, LPARAM lp ); };
CnuDlgModeless.cpp
#include "CnuDlgModeless.h" CnuDlgModeless::~CnuDlgModeless() { } //CreateDialogParam関数の呼び出し HWND CnuDlgModeless::nuCreateDialog( HINSTANCE hInstance, // インスタンスハンドル LPCTSTR lpTemplate, // ダイアログボックスの名前 HWND hWndParent // 親ウィンドウのハンドル ) { m_hInstance = hInstance; m_hwnd = CreateDialogParam(GetHInstance(), lpTemplate, hWndParent, (DLGPROC)CnuDlgModeless::StaticWndProcDlg, (LPARAM)this); return m_hwnd; } INT_PTR CALLBACK CnuDlgModeless::StaticWndProcDlg(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { CnuDlgModeless* This = (CnuDlgModeless*)GetWindowLongPtr(hWnd, GWLP_USERDATA);; if (message == WM_INITDIALOG) { if (lParam) { This = (CnuDlgModeless*)lParam; SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG_PTR)This); return This->WndProcDlg(hWnd, message, wParam, lParam); } } else if (This == 0) { return FALSE; } return This->WndProcDlg(hWnd, message, wParam, lParam); } INT_PTR CnuDlgModeless::WndProcDlg( HWND hWnd, UINT msg, WPARAM wp, LPARAM lp ) { BOOL ret = FALSE; switch (msg) { case WM_INITDIALOG: ShowWindow(hWnd, SW_SHOW); ret = TRUE; break; case WM_CLOSE: DestroyWindow(hWnd); ret = TRUE; break; case WM_DESTROY: PostQuitMessage(0); ret = TRUE; break; } return ret; }
main.cpp
#include <Windows.h> #include "resource.h" #include <tchar.h> #include "CnuDlgModeless.h" class CnuDlgModeless_special : public CnuDlgModeless { //CnuDlgModalからオーバーライド。このために親クラスでvirtual指定をしている INT_PTR WndProcDlg( HWND hWnd, UINT msg, WPARAM wp, LPARAM lp ) { BOOL ret = FALSE; switch (msg) { case WM_INITDIALOG: ShowWindow(hWnd, SW_SHOW); ret = TRUE; break; case WM_CLOSE: DestroyWindow(hWnd); ret = TRUE; break; case WM_DESTROY: ret = TRUE; PostQuitMessage(0); return 0; } return ret; } }; /////////////////////////////////////////////////// //エントリーポイント int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow) { CnuDlgModeless_special modelesssp; modelesssp.nuCreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), nullptr); MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; }
CnuDlgModeless.zip
モーダルダイアログボックスを作成する関数には、DialogBoxの他にDialogBoxParamがある。
https://msdn.microsoft.com/ja-jp/library/cc410761.aspx
int DialogBoxParam( HINSTANCE hInstance, // アプリケーションのインスタンスのハンドル LPCTSTR lpTemplateName, // ダイアログボックステンプレートを指定します HWND hWndParent, // オーナーウィンドウのハンドル DLGPROC lpDialogFunc, // ダイアログボックスプロシージャへのポインタ LPARAM dwInitParam // 初期値 );
この初期値と呼ばれる第五引数dwInitParamは何かというと、ダイアログ初期化の際に呼ばれるWM_INITDIALOGのlParam値である。
オブジェクト指向ではないDialogBoxにとって、DialogBoxに渡せる、ユーザが任意に指定できるグローバル変数以外の唯一のパラメータがこれなのである。
以下はこのdwInitParamで初期値を渡す例である:
#include <Windows.h> #include "resource.h" #include <tchar.h> //ダイアログプロシージャ INT_PTR CALLBACK WndProcModal(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_INITDIALOG: if (lParam) { TCHAR* c = (TCHAR*)lParam; MessageBox(hWnd, c, 0, 0); } return TRUE; case WM_COMMAND: switch (wParam) { case IDOK: MessageBox(hWnd, _T("IDOK"), 0, 0); EndDialog(hWnd, 0); return TRUE; } return FALSE; } return FALSE; } //エントリーポイント int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR lpCmdLine,int nCmdShow) { DialogBoxParam( hInstance, MAKEINTRESOURCE(IDD_DIALOG1), nullptr, WndProcModal, (LPARAM)_T("鵺")//このパラメータがWM_INITDIALOGのlParamへ入る ); return 0; }
要はCreateWindow関数の第十一引数lpParam「ウィンドウ作成データ」と同じ性質の物だと思えばいい。
https://msdn.microsoft.com/ja-jp/library/cc410713.aspx
これを使えば、CreateWindow関数の時と同様に、DialogBoxをカプセル化できる。考え方はCreateWindowの時と同じだ。
CnuDlgModal.h
#pragma once #include <windows.h> class CnuDlgModal{ INT_PTR m_dlg;//DialogBoxの戻り値 HINSTANCE m_hInstance; //このクラスで作成したモーダルダイアログの全てのイベントが入ってくるダイアログプロシージャ static INT_PTR CALLBACK StaticWndProcDlg(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); public: HINSTANCE GetHInstance()const { return m_hInstance; } virtual ~CnuDlgModal() {} //DialogBoxParam関数の呼び出し INT_PTR nuDialogBox( const HINSTANCE hInst, LPCTSTR lpTemplate, HWND hWndParent ); //個別のウィンドウプロシージャ virtual INT_PTR WndProcDlg( HWND hWnd, UINT msg, WPARAM wp, LPARAM lp ); };
CnuDlgModal.cpp
#include "CnuDlgModal.h" //このクラスで作成したモーダルダイアログの全てのイベントが入ってくるダイアログプロシージャ INT_PTR CALLBACK CnuDlgModal::StaticWndProcDlg(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { CnuDlgModal* This = (CnuDlgModal*)GetWindowLongPtr(hWnd, GWLP_USERDATA); if (message == WM_INITDIALOG) { if (lParam) { This = (CnuDlgModal*)lParam; SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG_PTR)This); return This->WndProcDlg(hWnd, message, wParam, lParam); } } else if (This == 0) { return FALSE; } return This->WndProcDlg(hWnd, message, wParam, lParam); } ////////////////////////////////////////////////////// ////////////////////////////////////////////////////// ////////////////////////////////////////////////////// //DialogBoxParam関数の呼び出し INT_PTR CnuDlgModal::nuDialogBox( const HINSTANCE hInst, LPCTSTR lpTemplate, HWND hWndParent ) { m_hInstance = hInst; m_dlg = DialogBoxParam(GetHInstance(), lpTemplate, hWndParent, (DLGPROC)CnuDlgModal::StaticWndProcDlg, (LPARAM)this); return m_dlg; } //個別のウィンドウプロシージャ INT_PTR CnuDlgModal::WndProcDlg( HWND hWnd, UINT msg, WPARAM wp, LPARAM lp ) { switch (msg) { case WM_CLOSE: EndDialog(hWnd, 0); PostQuitMessage(0); return TRUE; } return FALSE; }
main.cpp
#include <Windows.h> #include "resource.h" #include <tchar.h> #include "CnuDlgModal.h" //モーダルダイアログを扱うクラス class CnuDlgModal_special :public CnuDlgModal { //CnuDlgModalからオーバーライド。このために親クラスでvirtual指定をしている INT_PTR WndProcDlg(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp) override{ switch (msg) { case WM_COMMAND: switch (wp) { case IDOK: EndDialog(hWnd, 100); return TRUE; } return FALSE; case WM_CLOSE: EndDialog(hWnd, 0); return TRUE; } return FALSE; } }; /////////////////////////////////////////////////////// //エントリーポイント//////////////////////////////////// int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow) { CnuDlgModal_special modalsp;//新たなモーダルダイアログを定義 modalsp.nuDialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), nullptr);//ダイアログ作成・待機 PostQuitMessage(0); return 0; }
CnuDlgModal.zip
OpenFileDialog,SaveFileDialogは共にSystem::Windows::Forms名前空間にある。
プロジェクトの初期設定によってはSystem.Windows.Forms.dllを明示的に#usingしなければならないかもしれない。
OKボタンが押されたかの判定はOK定数を使うが、System::Windows::Forms::DialogResult::OKでenum classされている。場所がわからないと詰まるので注意したい。
またこれらの関数はアプリケーションのカレントディレクトリを変更してしまうので、カレントディレクトリを維持したい場合はRestoreDirectory = trueを指定する。
using namespace System; //本来これが必要。コンソールプロジェクトの場合は明示する必要がある #using <System.Windows.Forms.dll> ///////////////////////////////////////////////// //ファイルを開くダイアログ void Open_File_Dialog(){ System::Windows::Forms::OpenFileDialog^ ofd = gcnew System::Windows::Forms::OpenFileDialog(); ofd->Filter = "テキストファイル(*.txt)|*.txt|すべてのファイル(*.*)|*.*"; ofd->FilterIndex = 1;//初期状態でtxtが選択される ofd->Title = "テキストファイルを開く";//ダイアログのタイトル ofd->RestoreDirectory = true;//ダイアログの使用によってカレントディレクトリが変更されないようにする if (ofd->ShowDialog() == System::Windows::Forms::DialogResult::OK){ Console::WriteLine( ofd->FileName ); } } ///////////////////////////////////////////////////////////////////////// //ファイルを保存ダイアログ void Save_FileDialog(){ System::Windows::Forms::SaveFileDialog^ sfd = gcnew System::Windows::Forms::SaveFileDialog(); sfd->FileName = "default.jpg"; sfd->InitialDirectory = "C:\\"; sfd->Filter = "PNGファイル(*.png)|*.png|JPGファイル(*.jpeg;*.jpg)|*.jpeg;*.jpg|すべてのファイル(*.*)|*.*"; sfd->FilterIndex = 2;//初期状態でjpgが選択される sfd->Title = "画像ファイルを保存";//ダイアログのタイトルを設定する sfd->RestoreDirectory = true;//ダイアログの使用によってカレントディレクトリが変更されないようにする //ダイアログを表示する if (sfd->ShowDialog() == System::Windows::Forms::DialogResult::OK) { //OKボタンがクリックされたとき、選択されたファイル名を表示する Console::WriteLine(sfd->FileName); } } /////////////////////////////////////////////////// //エントリーポイント [STAThread] int main(array<System::String ^> ^args) { Open_File_Dialog(); Save_FileDialog(); Console::Read();//待機 return 0; }
・三人称
・~た
・推理小説風のファンタジー系
・ページ数:254
・小林泰三
本作は推理小説風のファンタジーである。現実からは飛躍した世界観で行われる犯罪には、科学や常識の知識は全く役に立たない。
主な舞台は「不思議の国のアリス」の不思議の国で、それ及びそれに類する物語の登場人物も多く登場する。不思議の国のアリスの兎や帽子屋は割と有名だと思うが、有名どころから少し外れたキャラクターに関しても押さえておくとなお良い。特にハンプティーダンプティーだけは知っておいた方がいい。知らなくても何の支障も無いが知っておいた方がイメージしやすい。
小林泰三なのでグロテスクな描写が所々にある。常識の範囲内だとは思うが、もし臓物の描写が全くだめなら注意する必要がある。
そしてこの作品の魅力は世界観、トリックももちろんなのだが、論理的でありながら前提が間違っている会話だ。しかし完全に混沌としているわけではなく、そして一見哲学的でありながら全くそうではない。
P79 - P80
「わたしはあの場所にいなかった」
「そんなに言うのなら、証明して見せてくれ」
「確信があるのなら、今すぐわたしを逮捕しないのはなぜ?」
「泳がせてるのさ」三月兎が言った。「余罪の証拠が摑めるかもしれないし」
「余罪って?」
「取り調べ中の罪とは別の罪のことだよ」
「単語の意味を知りたいんじゃなくて、余罪ってグリフォン殺しのことかって訊いているの」
「えっ。あんた、グリフォンを殺ったのか?!」
三月兎の目が飛び出した
「だから、殺ってないって」
「でも、いま確かに余罪はグリフォン殺しだって言ったよ」三月兎が食い下がった。
「えっ?自白したのか?!」頭のおかしい帽子屋が歓声を上げた。「これで見事事件解決だ!!」
「そんなこと言ってないわ。私はハンプティ・ダンプティもグリフォンも殺してない!」
「これじゃあ、堂々巡りだ。もう観念したら?」三月兎がぼやいた。
「やってもいない罪を告白するなんてまっぴらごめんよ」
「事態を打開しなくちゃ」ビルが言った。
「難しい言葉を使っちゃった? かっこいい? それからいまの使い方合ってた?」
「合ってるけど、言うだけじゃ何も進展しないわ」
ダイアログを作った後、呼び出し元に処理が戻るモーダレスダイアログ(モードレスダイアログ)を作成する。
プロジェクトを右クリック→[追加]→[リソース...]を選択し、リソースの種類(T)で[Dialog]を選択し、[新規作成]ボタンを押すことでリソースを追加する。
#include "resource.h"//IDD_DIALOG1の定義が入っている
ダイアログプロシージャは普通のウィンドウプロシージャと似ているが、戻り値がINT_PTRとなっている。
この関数では、メッセージを処理した場合はTRUEを、処理しなかった場合はFALSEを返す必要がある。
注意:DefWindowProcで返してはならない。挙動がおかしくなる。
モーダルダイアログの時と概ね同じだが、ウィンドウの破棄には(EndDialogではなく)DestroyWindowを使う。下コードではPostQuitMessageもしているが、これはこのサンプルの都合である。
INT_PTR CALLBACK DlgWndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { INT_PTR ret = FALSE; switch (msg) { case WM_COMMAND: switch (wp) { case IDOK: MessageBox(hWnd, _T("IDOK"), 0, 0); DestroyWindow(hWnd); PostQuitMessage(0); ret = TRUE; break; case IDCANCEL: MessageBox(hWnd, _T("IDCANCEL"), 0, 0); DestroyWindow(hWnd); PostQuitMessage(0); ret = TRUE; break; } break; case WM_CLOSE: DestroyWindow(hWnd); PostQuitMessage(0); ret = TRUE; break; } return ret; }
CreateDialog関数 https://msdn.microsoft.com/ja-jp/library/cc410690.aspx
第二引数は「ダイアログボックステンプレートの名前(文字列)」か「リソース識別子(数値)」を渡す。後者の場合、MAKEINTRESOURCEで変換する。
第三引数はダイアログを呼び出す親ウィンドウのハンドル(HWND)を渡す。この例では親ウィンドウを作っていないのでNULLを渡す。
CreateDialog関数は、DialogBox関数と違い、ダイアログを表示した後すぐにウィンドウハンドルを返しに戻ってくる。
そのため、すぐにプログラムが終了しないようにメッセージループに入っている。上記ダイアログプロシージャの中でPostQuitMessageをしているのは、ダイアログが閉じたときに本体も終了させないと、終了させる手段がなくなってしまうからだ。
ちなみにこの関数で作成したダイアログは初期状態で非表示なので、ShowWindowを使って表示させる必要がある。
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow) { HWND hDlg = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), nullptr, (DLGPROC)DlgWndProc); ShowWindow(hDlg, SW_SHOW); MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; }
#include <Windows.h> #include "resource.h" //IDD_DIALOG1の定義が入っている #include <tchar.h> //ダイアログプロシージャ INT_PTR CALLBACK DlgWndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { INT_PTR ret = FALSE; switch (msg) { case WM_COMMAND://ボタンが押された場合、WM_COMMANDのwParamにボタンのIDが入っている switch (wp) { case IDOK://IDOK(値1),IDCANCEL(値2)は初めから定義されている(WinUser.h) MessageBox(hWnd, _T("IDOK"), 0, 0); DestroyWindow(hWnd);//ダイアログを閉じる。(プログラム終了ではない。それは下のPostQuitMessageがやっている) PostQuitMessage(0); ret = TRUE; break; case IDCANCEL: MessageBox(hWnd, _T("IDCANCEL"), 0, 0); DestroyWindow(hWnd); PostQuitMessage(0);//プログラム終了 ret = TRUE; break; } break; case WM_CLOSE: DestroyWindow(hWnd); PostQuitMessage(0); ret = TRUE; break; } return ret; } //エントリーポイント int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow) { HWND hDlg = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), nullptr, (DLGPROC)DlgWndProc); ShowWindow(hDlg, SW_SHOW); MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; }
呼び出したら、OKやキャンセルボタンを押すまで処理が返ってこないウィンドウをモーダルダイアログと言う。
プロジェクトを右クリック→[追加]→[リソース...]を選択し、リソースの種類(T)で[Dialog]を選択し、[新規作成]ボタンを押すことでリソースを追加する。
#include "resource.h" //IDD_DIALOG1の定義が入っている
ダイアログプロシージャは普通のウィンドウプロシージャと似ているが、戻り値がINT_PTRとなっている。
この関数では、メッセージを処理した場合はTRUEを、処理しなかった場合はFALSEを返す必要がある。
注意:DefWindowProcで返してはならない。挙動がおかしくなる。
また、モーダルダイアログ呼出中は呼出元は停止しているので、この関数のどこかでEndDialogをしてダイアログを終了しなければならない。
INT_PTR CALLBACK DlgWndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp){ INT_PTR ret = FALSE; switch (msg) { case WM_COMMAND: switch(wp){ case IDOK: EndDialog( hWnd , (INT_PTR)IDOK ); ret = TRUE; break; case IDCANCEL: EndDialog( hWnd , (INT_PTR)IDCANCEL ); ret =TRUE; break; } break; case WM_CLOSE: EndDialog( hWnd , (INT_PTR)WM_CLOSE ); ret =TRUE; break; } return ret; }
DialogBox関数:https://msdn.microsoft.com/ja-jp/library/cc410759.aspx
第二引数は「ダイアログボックステンプレートの名前(文字列)」か「リソース識別子(数値)」を渡す。後者の場合、MAKEINTRESOURCEで変換する。
第三引数はダイアログを呼び出す親ウィンドウのハンドル(HWND)を渡す。この例では親ウィンドウを作っていないのでNULLを渡す。
INT_PTR d = DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),nullptr,(DLGPROC)DlgWndProc );
DialogBox関数の戻り値は、EndDialog関数の第二引数である。INT_PTRにキャストして正常に返せるのならどんな値でもいいが、用途としてはどのボタンで閉じられたかが思いつく。あるいはダイアログ側で設定したデータを収めた構造体のインスタンスへのポインタなどが良いかもしれない。
switch(d){ case IDOK: MessageBox(nullptr,_T("IDOK"),0,0); break; case IDCANCEL: MessageBox(nullptr,_T("IDCANCEL"),0,0); break; case WM_CLOSE: MessageBox(nullptr,_T("WM_CLOSE"),0,0); break; } PostQuitMessage(0);
#include <Windows.h> #include "resource.h" //IDD_DIALOG1の定義が入っている #include <tchar.h> //ウィンドウプロシージャ INT_PTR CALLBACK DlgWndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { INT_PTR ret = FALSE; switch (msg) { case WM_COMMAND://ボタンが押された場合、WM_COMMANDのwParamにボタンのIDが入っている switch (wp) { case IDOK://IDOK(値1),IDCANCEL(値2)は初めから定義されている(WinUser.h) EndDialog(hWnd, (INT_PTR)IDOK); ret = TRUE; break; case IDCANCEL: EndDialog(hWnd, (INT_PTR)IDCANCEL);//ダイアログを閉じる。IDOK,IDCANCELはそれぞれ1と2なので、INT_PTRへキャストできる ret = TRUE; break; } break; case WM_CLOSE: EndDialog(hWnd, (INT_PTR)WM_CLOSE); ret = TRUE;//このメッセージを処理したのでTRUEを返す break; } return ret; } //エントリーポイント int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow) { //ダイアログ表示 INT_PTR d = DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), nullptr, (DLGPROC)DlgWndProc); switch (d) { //ダイアログの戻り値の確認 case IDOK: MessageBox(nullptr, _T("IDOK"), 0, 0); break; case IDCANCEL: MessageBox(nullptr, _T("IDCANCEL"), 0, 0); break; case WM_CLOSE: MessageBox(nullptr, _T("WM_CLOSE"), 0, 0); break; } PostQuitMessage(0); return 0; }
第1部 コンピュータグラフィックスの基礎
第1章 プログラミングの準備
1.1 Visual Studioを用いたプログラム開発
1.1.1 コンソールアプリケーションの作成
1.1.2 設定の変更
1.2 glutとOpenGLの利用
1.3 freeglutのインストール
1.4 freeglutを利用したプログラミング
この章で学んだOpenGLとglut関数
第2章 OpenGLとglutを用いた2次元コンピュータグラフィックス
2.1 2次元コンピュータグラフィックスのプログラミング
2.1.1 図形の指示
2.1.2 座標の指示
2.1.3 図形の色分け
2.2 座標の投影とビューポート変換
2.2.1 正投影の導入による表示範囲の拡大
2.2.2 ウィンドウとビューポート変換
2.2.3 アスペクト比の変更
2.2.4 図形中心の表示
参考文献
この章で学んだOpenGLとglut関数
第3章 3次元コンピュータグラフィックスへの拡張
3.1 正投影
3.1.1 視点の変更
3.1.2 視体積の範囲決め
3.1.3 方位角と仰角の利用
3.1.4 マウス操作による視点の変更
3.2 ポリゴンの描画
3.2.1 隠面消去
3.2.2 シェーディング
この章で学んだOpenGLとglut関数
第二部 OpenGLを用いた並列図形処理
第4章 ボロノイ図の生成
4.1 ボロノイ図とは
4.2 ボロノイ図の画像生成
4.3 実装の準備
4.4 円錐形状の描画
4.5 画像の取得と利用
参考文献
この章で学んだOpenGLとglut関数
第5章 オフセット平面の生成
5.1 デプスバッファを用いたオフセット面の計算
5.2 STLフォーマット
5.3 STLファイルの読み込み用関数
5.4 ポリゴンモデルの表示用関数
5.5 オフセットプログラムの準備
5.6 オフセット処理の実現
5.6.1 球、円筒形、スラブ形状の描画
5.6.2 オフセット面の取得
5.6.3 オフセット面の描画
5.7 プログラムの完成
参考文献
この章で学んだOpenGL関数
第3部 CUDAの導入とOpenGLとの併用
第6章 CUDAの導入
6.1 CUDAのインストール
6.2 Visual StudioによるCUDAプログラムの開発
6.3 CUDA処理の基本的な考え方
6.3.1 典型的な処理の流れ
6.3.2 GPUの並列処理アーキテクチャ
6.3.3 スレッドによる並列処理
6.3.4 ブロックとグリッド
6.4 CUDA関数の紹介
6.4.1 メモリ管理
6.4.2 データ転送
6.4.3 ブロックとグリッドの定義
6.4.4 カーネル関数
6.4.5 デバイス関数
6.5 プログラム例
6.5.1 CPU処理の実装例
6.5.2 CUDAによる実装
6.5.3 シェアードメモリの利用
参考文献
この章で学んだCUDA関数
第7章 粒子解析とアニメーション表示
7.1 粒子解析法
7.2 粒子解析法アルゴリズムの実装
7.2.1 CPU処理による実装
7.2.2 GPU処理による実装
7.3 VBOの導入
7.3.1 VBOを用いた図形描画
7.3.2 VBOによる粒子群の表示
7.4 CUDAとVBOの併用
参考文献
この章で学んだOpenGL関数
この章で学んだCUDA関数
第8章 拡散方程式の数値解法とアニメーション表示
8.1 差分法による拡散方程式の数値解法
8.2 差分法アルゴリズムの実装
8.2.1 CPU処理による実装
8.2.2 GPU処理による実装
8.2.3 シェアードメモリの利用
8.2.4 テクスチャメモリの利用
8.3 PBOの導入
参考文献
この章で学んだOpenGL関数
この章で学んだCUDA関数
第4部 CUDAによる複雑な図形処理
第9章 メタボール法
9.1 粒子群の濃度場
9.2 ソートによる粒子群のセルへの割り当て
9.3 実装の準備
9.4 基本的なデバイス関数の定義
9.5 カーネル関数の定義
9.6 thrustライブラリ
参考文献
この章で学んだglut関数
この章で学んだCUDA関数
第10章 マーチングキューブ法
10.1 マーチングキューブ法
10.2 アルゴリズムの概要
10.3 実装の準備
10.4 テクスチャメモリの利用
10.5 カーネル関数の定義
10.6 Metaball.cppの修正
参考文献
この章で学んだOpenGL関数
第11章 包含立体の利用
11.1 包含ボックス
11.2 ボックス定義の準備
11.3 AABBとOBBの定義
11.3.1 AABBの定義
11.3.2 OBBの定義
11.4 包含ボックスに関する計算
11.4.1 点と包含ボックス間の距離
11.4.2 包含ボックス間の交差判定
11.5 階層的な包含ボックス
11.6 プログラムの利用法
参考文献
第12章 立体間の衝突検出
12.1 階層的な包含ボックスによる絞り込み
12.2 ポリゴン間の並列交差判定
12.3 撃力ベース法
12.4 実装の準備
12.5 階層的な包含ボックスによる絞り込み
12.6 撃力ベース法による衝突の解消
12.7 衝突判定
12.8 デバイス関数
12.9 カーネル関数
12.10 プログラムの利用法
参考文献
この章で学んだOpenGL関数
あとがき
サンプルプログラムの使い方
索引
第1部、第2部はOpenGLの導入となっている。
例えば第2章の「この章で学んだOpenGLとglut関数」は、
・glMatrixMode
・glOrtho
・glViewport
・glBegin
・glEnd
・glColor3f
・glVertex3*
・glutInitWindowSize
・glutInitWindowPosition
・glutReshapeFunc
となっている。本のタイトルに忠実ではあるが、この辺りは読み飛ばしてもおおむね問題ない人が多いだろう。
全部読んだわけではないが、印象として○○アルゴリズムをCとCUDAで実装しながら勉強するタイプの本。なのでCUDA文法やGPUの構造に関してはあまり踏み込んでいる印象がない。
作りながら覚えるならちょうどいい印象を受けたが、CUDAの辞書として使いたいならお薦めできない。あくまで画像処理の本である。
huluに来ていたので久しぶりに見た。
※ちなみに私は原作を知らない。原作派からすれば存在自体が許せない作品なのかもしれないが、ここでは考慮しない。というかできない。
私は日本のドラマ・映画はあまり見ない。そんな中、この作品がなぜ面白いのか。
それはそもそもの題材が、どうやってもシリアス展開にしようが無いふざけた作品であり、故にギャグに割り切った一直線な作品で、そしてそう作ることが完全に自然だからだろう。
例えば別の作品では、「GANTZ」の冒頭で電車に轢かれるシーンで、ホームに降りて(はいけないのはこの際許すが)暢気に酔っ払いを起こしているシーンを見ると「危機感なさ過ぎて冷め」てしまう。
しかしHKは違う。脚本や役者や映像に強烈な多少の無理違和感を覚えても、「まあギャグだし」と思えば全てが許せてしまう。演出や品質以前に設定がぶっ壊れているのだ。何が来ようとかまわん。
ただ私は「登場人物が変な格好をしている」事で面白みを感じることがほぼ皆無で、だから顔芸で売っている芸人とかは悉くだめだ。多分そういうので笑える人ならさらに面白いだろう。
注意点は二つ。まずいわゆる学芸会系の作品で、全編通してコントとか漫才のノリなので、割り切れないなら拷問である。約二時間の映画風長編コントと思えばいい。
※余談だが、いま見ていてラバーガールの大水洋介が出ていたことを初めて知った。多分他のキャラも何かしら役者以外の背景があるのだろう。ラバーガールはとても落ち着いたコントを見せてくれるので、本作を見る前に一本見ておくといいかもしれない
次に表現がいささか過激なことだ。いまGoogleアドセンスの導入ができないか考えているのだが、女性の水着写真がグレーゾーンだというので、変態仮面なんか確実にアウト間違いない。だから画像が貼れない(著作権はまた別)。
なんせことあるごとに男性の股間がアップされる映像作品である。ヒロインが思わず目を背けるシーン。気持ちわかるぞ。これ女性でやったら放映できないだろ。