問題1:コードから作っているのでデザイナやプロパティは使えない
問題2:検索してもC#の情報しか出ない(そして大抵は名前空間がわからない)
ベースは以下
C++CLI でコードで作成したフォームにコードでコントロールを配置
まずこの状態のフォームがある。
ref class MyForm :public System::Windows::Forms::Form { /* 省略 */ public: MyForm() { /* 省略 */ } virtual ~MyForm() { } /* 省略 */ }
ソースコードの自動補完で戻り値と引数を確認する。
void OnFormClosing(System::Windows::Forms::FormClosingEventArgs^ e)override { if( m_f_c == false) if (e->CloseReason == CloseReason::UserClosing) e->Cancel = true; }
ref class MyForm :public System::Windows::Forms::Form { System::Windows::Forms::Button^ m_button; bool m_f_c = false; public: MyForm() { m_button = gcnew System::Windows::Forms::Button; m_button->Text = "close"; m_button->Click += gcnew EventHandler(this, &MyForm::ClickEvent);//イベントハンドラ追加 this->Controls->Add(m_button);//フォームに配置 } virtual ~MyForm() { } void ClickEvent(Object^ source, EventArgs^ e) { System::Windows::Forms::MessageBox::Show("Close"); m_f_c = true; this->Close(); }void OnFormClosing(System::Windows::Forms::FormClosingEventArgs^ e)override { if( m_f_c == false) if (e->CloseReason == CloseReason::UserClosing) e->Cancel = true; }};
続き
1.Planeに黒のマテリアルを追加し、以下のように設定
2.Planeに青のマテリアルを追加し、以下のように設定
3.Wireframeモディファイアの設定で、Material Offsetを2に設定
4.動画にはないが、Context.RenderでBloomをOnにする
レンダリングの結果を確認するには、[Z]キーを押し、[Render]を選択する。
Worldの設定から背景を黒にする。

HDRI Haven https://hdrihaven.com/ へ行く
HDRIs > Skies > Kiara 1 Dawn の 4k 24MBのファイルをダウンロードする

5.World→ ColorをEnvironment Textureに設定し、ダウンロードしたHDRファイルを選択する。
6.この際、明るすぎるのでStrengthを0.3に変更する(下図では0.1にしているが0.3が正解。動画では一度0.1にした後でやっぱり0.3にしている・・・・・・)
Shadingタブに切り替えノードを表示する
対象をWorldに切り替え、
・[Shift+A]→[Vector]→Mappingを追加
・[Shift+A]→[Input]→Texture Coordinateを追加

[Shift+A]→[Hue/Saturation]を追加しBackgroundの前に置き、Hue=0.6などして紫に近づける

Layoutへ行き、6頂点ほどを選択し、Proportional EditingのRandomであることを確認しZ方向に僅かに動かし地形にノイズを加える。

Planeの黒いマテリアルの方を選択し、Shadingへ移動する。


[Shift+A]→[Vector]→Bump を追加
[Shift+A]→[Texture]→Noise Texture を追加
以下のように設定

[Shift+A]→[Mesh]→UV Sphere で球を追加
UV Sphereを右クリック→Object Context Menu→Shade Smooth
UV Sphereをカメラ方向にPlaneの端まで移動する

[S]で球を拡大する

なお球がカメラから見えなくなったらカメラの設定のEndを伸ばす

EditモードでSphereを右クリックし[Subdivide]
オプションで
・Number of Cuts = 2
・Smoothness=1.0



動画ではStrength=1.5だがなぜか光量が足りないので15程度にしている。

・Sphereを選択→Cameraを選択→[Ctrl+P] でカメラを親、太陽を子にする
1.[Shift+A]→[Mesh]→Plane で面を追加
2.Planeを[S]→[8]で8倍にする
3.Subdivideで30分割する。
Blender 2.8のSubdivideは、キーバインドをBlender 2.79以下にしているなら[W]→Subdivideだが、そうでないなら
で見つけることができる。
https://blender.stackexchange.com/questions/130717/subdivide-button-in-blender-2-8
Proportional EditingでConnectedを選択し、 Proportional Editing FalloffをRandomに設定する。
Editモードで約8頂点選択し、[G][Z]でZ方向に引き上げて山を作る。なおBlender 2.8の頂点複数選択はShift+マウス左ボタン。
このままだと一番高い山頂が全て同じ高さになってしまうので、微調整し、山らしくする。
4.MirrorモディファイアのためのEmptyを追加する。[Shift+A]→[Empty]→Plain Axes
5.Ctrlキーを押しながらオブジェクトをMoveすることでグリッドにスナップして移動できる。これを利用してX方向にPlaneの端まで移動する。
6.Mirrorモディファイアを追加し、以下のように設定
[Shift+A]→Camera でカメラを追加する。元々カメラがある場合はそれを使えばいい。
7.カメラの設定を以下のようにし、その上でZ方向に僅かに移動する。
8.Context.Outputへ行き、Frame Rateを24fpsへ変更
9.Animationのタブへ行き、End:120に設定
10.[Edit]→[Preference]→Animation→Default InterpolationをLinearに設定
11.カメラをクリックし選択し、Animate Propertyをクリックしキーフレームに設定する(※Frame 1に移動しておく)

12.カメラをPlaneの反対側まで移動し、キーフレームを打つ

PlaneにArrayモディファイアを追加し、以下のように設定。

※なお、シームレスにつながらない場合は、Planeの頂点のY座標が-8~8の空間からはみ出ているので修正する
カメラの焦点距離と角度を以下のように設定する


PlaneにWireframeモディファイアを追加し、以下のように設定


using namespace System; using namespace System::Windows::Forms;ref class MyForm :public System::Windows::Forms::Form { System::Windows::Forms::Button^ m_button; public: MyForm() { m_button = gcnew System::Windows::Forms::Button; m_button->Text = "hello"; m_button->Location = System::Drawing::Point(10, 10);//位置変更 m_button->Size = System::Drawing::Size(70, 30);//サイズ変更 m_button->Click += gcnew EventHandler(this,&MyForm::ClickEvent);//イベントハンドラ追加 this->Controls->Add(m_button);//フォームに配置 } virtual ~MyForm() { } void ClickEvent(Object^ source, EventArgs^ e) { System::Windows::Forms::MessageBox::Show("hello pushed"); } };[STAThread] int main(array<String^>^ args) { MyForm m; Application::Run(% m); }
1.空のCLRプロジェクトを作成
3.プロジェクト→
プロパティページ→リンカー→
システム→サブシステム =
Windows (/SUBSYSTEM:WINDOWS)

4.プロジェクト→
ソースファイル→右クリック→
追加→新しい項目 (cppファイル追加)

5.プロジェクトを右クリック→
追加→参照→アセンブリ→
✔System
✔System.Windows.Forms
✔System.Drawing
の三つをチェック

6.コード記述
続き。
key particleを使ってfluid等のparticleも移動させる。
1.次のレイヤーに移動し、3Dカーソルが原点にあることを確認し、新たに[Shift+A]→[Mesh]→Cubeを追加する

2.[Num 5]で平行投影、[Num 1]でXZのビューにし、[S]で少しだけ拡大し、[S][X]でさらに少しだけX方向にキューブを拡大。その後底面がXY平面につくくらいの位置までキューブをZ方向に移動する。

3.[Shift+A]→[Mesh]→Planeで面を追加し、90° Y軸回転後、Cubeの内側、左に配置する。
※動画では-90°になっているが後で間違えて修正しているので90°が正解

4.CubeにCollisionを追加し、Factor=0.8を設定する。
5.PlaneにParticleを追加し、名前をFluidに設定する。
Number=5000
Lifetime=250 (最後のフレームまでParticleが存在するように)
End=100 (100フレーム目でParticleの流出が止まるように)
PhysicsをFluidに設定し、Interaction Radius=1.6
に設定。

6.[Num 1]を押し、XZ面表示にし、[Shift+A]→[Mesh]→UV Sphereを追加。
Z方向に移動し、Cubeの上に配置する
7.UV SphereにParticleを追加し、
Number = 5000 (Cube側と同じ)
Lifetime=250
End=1


8.[Shift+A]→[Mesh]→CubeでCubeをもう一つ追加し(Cube.003)、Particle Systemを追加し、以下のように設定をする。
最初のCubeも使って、三つのプリミティブを準備する。
CubeにParticle Systemを追加し、以下のように設定。
[Shift]を押しながら右ボタンクリックで各モデルを選択する。
Particle Systemを追加したCubeを一番最後に選択し、[Ctrl+L]→[Modifiers]でParticleを他のモデルにコピーする
またこの後でParticleのLifetimeを250にしておく(消えないようにするため)

Cubeをもう一つ追加し、後ろの方に配置する。
このCubeにもParticle Systemを追加し、EmissionのNumberを5000(他と同じ値)に設定、Endも1.0に設定する
Physicsへ行き、Keyedに設定し、keyを追加する
ここまでの設定で、アニメーションをするとParticleがCube→Sphere→Cylinderの順に移動する。

後から追加したCube.001のParticleのLifetimeを変更するとParticleの移動速度を変更できる。

より細かい速度設定のためには、Use Timingをチェックする。
そしてTimeとDurationを設定する。
Time ... Particleがその図形に完全に移動する、タイムライン上の時間
Duration ... Particleがその図形で何フレーム待機するか
例えば、「Frame 0 でCubeからスタートし、Sphereに到着するのがFrame 40,そこで15 Frame待機し、Frame 200 でCylinderに到着」
という設定の場合、




なおParticleが表示されているのはLifetimeの時間内だけなので途中で消える場合はLifetimeが短い可能性がある。
Windows API Code Packを追加して使えるCommonSaveFileDialogを使う。
VC++の[表示]→[その他のウィンドウ]→[パッケージマネージャーコンソール]を開き、以下のコマンドを入力


using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;using Microsoft.WindowsAPICodePack; using Microsoft.WindowsAPICodePack.Dialogs; using Microsoft.WindowsAPICodePack.Dialogs.Controls;namespace WindowsFormsApp1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_MouseClick(object sender, MouseEventArgs e) { CommonSaveFileDialog dialog = new CommonSaveFileDialog(); CommonFileDialogCheckBox check = new CommonFileDialogCheckBox("check"); dialog.Controls.Add(check); if (dialog.ShowDialog() == CommonFileDialogResult.Ok) { if (check.IsChecked == true) { MessageBox.Show("Checked"); } else { MessageBox.Show("unChecked"); } } } } }
投稿日は以下の方法で出力できる
<time><?php echo get_the_time('Y年n月j日'); ?></time>
記事が編集された日が更新日となる。
記事を書き、そのまま予約投稿した場合は、「予約投稿」ボタンを押した日が更新日となる。
更新日は以下の方法で出力できる
<time><?php echo the_modified_date('Y/m/d'); ?></time>
予約投稿ボタンを押した日=更新日なので、
予約投稿すると、
のような状態になる。ここで問題になるのは更新日のほうなので、get_mtimeで「更新日の方が古ければ、投稿日を表示」という分岐を行う。
http://www.keni-customize.net/update-date-573/
ちなみにこのget_mtime、ユーザ定義の関数なのにget_mtimeで検索するとすぐ出てくる。もう標準化しちゃえよ・・・
約八分、Tissueアドオンを使うので、Blender 2.79が必要。
Editモードで[w]→Subdivideで、 もともとあったCubeを7回再分割する。
[Shift+A]→[Ico Sphere]でICO球を追加し、Cubeの端の方へ移動する。

CubeのEditモードへ行き、 Cubeのすべての頂点を選択し、全ての頂点をVertex Groupへ追加する。
Cubeを選択し、Vertex Weight Proximityモディファイアを追加する
Weight Paintモードに切り替える

モディファイアを以下のように設定

ICO Sphereを非表示にする。
Decimateモディファイアを追加し、以下のように設定。ワイヤフレーム表示は[Z]キーで切り替えられる。

この状態で、上から各モディファイアをApplyする。

Tissue ToolsのDual Meshをクリックする。


Wireframeモディファイアを追加し以下のように設定。
その後Subdivision Surfaceモディファイアを追加する。

1.土台と背景用にそれぞれPlaneを追加し配置
2.Cyclesで、BackgroundのColorを黒にして環境光を消す
3.Point Lightを追加し、オブジェクトの中に配置

C++11以上、Visual C++15 以降(?)での時間計測。
#include <time.h>
time.h内でstruct timespecが定義されている。
struct timespec { time_t tv_sec; // Seconds - >= 0 long tv_nsec; // Nanoseconds - [0, 999999999] };
1)
https://ja.cppreference.com/w/c/chrono/timespec_gettsの指す timespec オブジェクトにタイムベースbaseにおける現在のカレンダー時刻を格納します。
2)timespec_getの引数baseとして使用するのに適した値に展開されます。
timespec tspec; timespec_get(&tspec, TIME_UTC); printf(" %lld.%ld\n", tspec.tv_sec, tspec.tv_nsec);
timespec_get関数で、tv_secに秒、tv_nsecにナノ秒の値が、それぞれtime_t型とlong型で入る。
time_t型は環境にもよるがVC++2019,x64では__int64なのでprintfではlldを使用している。
要はtimespec_get関数である時点から数えた現在時刻の秒を整数部分と小数部分(ナノ秒を表す整数値)を分けて取得できる。
開始時刻、終了時刻を記録して引き算をすればいいのだが、整数部分と小数部分が分かれているためそのまま引き算できない。例えば、
開始・・・10.5秒
終了・・・11.2秒
だった場合、
整数部・・・11-10
小数部・・・2-5
となり、 10.5秒~11.2秒までの間は 1.-3
となってしまう。要は繰り下がりも考慮しなければならない。
//Sleepに必要 #include <Windows.h> //printf等 #include <cstdio> //std::int64_tに必要 #include <cstdint> //time.hでも可 #include <ctime> int main() { struct timespec f,t; // from ~ to timespec_get(&f, TIME_UTC);// 計測開始時刻 Sleep(3000); //処理 timespec_get(&t, TIME_UTC);// 計測終了時刻 ////////////////////////////////// // to - from の計算
long nsec; std::int64_t tsec;
if (f.tv_nsec < t.tv_nsec) { nsec = t.tv_nsec - f.tv_nsec; tsec = t.tv_sec - f.tv_sec; } else {//繰り下がり必要 nsec = 1000000000 + t.tv_nsec - f.tv_nsec; tsec = t.tv_sec - f.tv_sec - 1; } ///////////////////////////////// // 表示 printf("経過時間:%lld.%ld\n", tsec, nsec); getchar(); }
cppreference.com
https://ja.cppreference.com/w/c/chrono/timespec_get