BarkDecidious0107
https://www.textures.com/download/barkdecidious0107/17362?q=bark
[Shift+A]→[Image Texture]→TexturesCom_BarkDecidious0107_seamless_S.jpg
[Shift+A]→[Image Texture]→TexturesCom_Moss0177_1_seamless_S.jpg
[Shift+A]→[Color]→[MixRGB]でテクスチャをMixする
光源のタイプをSunに設定し、Strengthを5にする
テンキーの[7][5]でXY平面の平行投影に切り替える
・ライトの位置をデフォルトから(-6.93 , -9.809)だけ移動する。
・[R]で131.092°回転する。
・テンキーの[3]でYZ平面に移行し、ライトを現在の角度から-13.874°回転する
・[Shift+A]→[Texture]→[Noise Texture]
・[Shift+A]→[Converter]→[ColorRamp]
を追加
・[Shift+A]→[Color]→[Mix]
・[Shift+A]→[Shader]→[Glossy BSDF]
・[Shift+A]→[Shader]→[Mix Shader]
を追加
・[Shift+A]→[Vector]→[Bump]
を追加
・[Shift+A]→[Color]→[Mix]
を追加しMultiplyに設定
・[Shift+A]→[Vector]→[Mapping]
・[Shift+A]→[Input]→[Texture Coordinate]
を追加
マテリアル中心のチュートリアル。約23分
[0:25] レンダラがCyclesになっていることを確認する
1.[X]で最初のCubeを削除する
2.[Shift+A]→[Mesh]→Circle で円を作成
3.[R]→[Y]→[9][0] で90°回転
4.テンキー[1]→[5]でY方向の平行投影にする
5.Editモードへ移行し、[E]→[Esc]→で押し出し→[G][X]でX方向に限定し[Ctrl]を押しながらマウスを動かし押し出しを行う。これを二回行う。
6.[Z]を押してワイヤフレーム表示に切り替え、[B]で右辺を選択する。
7.5と同じ事を繰り返して、右側にも伸ばす
8.Loop Cutで一区画を8分割する
9.XY平面の端のあたりから右に5、上に5いったところの四角形を選択し、押し出して枝にする
10.枝の先端を[S]で0.710倍に縮小する
11.反対側から左に5、XY平面の直下の四角形4枚を押し出し枝にする。
12.[E]押し出しとS[拡大縮小]を使って木の両端を閉じる
※ 動画では単位系がcmになっている
13.Smoothシェーディングに切り替える
14.Subdivision Surfaceモディファイア追加
15.Displaceモディファイアを設定する。
16.UV展開する
17.マテリアルを作成し、マテリアル名を「Tree Bark」とする
以後、マテリアル設定
Blenderは頂点Colorを持つPLYには対応している。一方でFace ColorのPLYには対応していないらしい。ざっと調べた限りでは。
あたりから頂点色を持つPLYファイルを用意する。
Blenderで普通に[File]→[Import]→Stanford (.ply) で読み込む
Vertex Paintモードに移行すると、PLYから読み込んだ頂点色を確認できる。
[Shift+A]→[Input]→Attribute
のノードを追加し、Vertex Colorsの名前を設定する
Blender 2.8 の Eevee でも全く同じようにできる。
#pragma once //基本的なデータタイプ #include <vcg/complex/complex.h> class MyFace; class MyVertex; class MyEdge; struct MyUsedTypes : public vcg::UsedTypes< vcg::Use<MyVertex>::AsVertexType, vcg::Use<MyFace>::AsFaceType, vcg::Use<MyEdge>::AsEdgeType> {}; //頂点型 class MyVertex : public vcg::Vertex< MyUsedTypes, vcg::vertex::Coord3f, vcg::vertex::Color4b, vcg::vertex::Normal3f, vcg::vertex::VFAdj, vcg::vertex::VEAdj, vcg::vertex::Qualityf, vcg::vertex::BitFlags, vcg::vertex::Mark> { //ここにメンバ変数を追加できる }; //面型 class MyFace : public vcg::Face < MyUsedTypes, vcg::face::VertexRef, vcg::face::Normal3f, vcg::face::FFAdj, vcg::face::EFAdj, vcg::face::Mark, vcg::face::VFAdj, vcg::face::BitFlags > { }; //エッジ型 class MyEdge : public vcg::Edge< MyUsedTypes, vcg::edge::VertexRef, vcg::edge::BitFlags, vcg::edge::EVAdj, vcg::edge::EFAdj> { }; //3Dモデル型 class MyMesh : public vcg::tri::TriMesh< std::vector<MyVertex>, std::vector<MyFace>, std::vector<MyEdge> > { };
//メッシュ定義 MyMesh mesh; //PLYファイル読み込み vcg::tri::io::ImporterPLY<MyMesh>::Open(mesh, plypathname); //全てのfaceにDELETEDフラグを立てる for (int i = 0; i < mesh.face.size(); i++) { vcg::tri::Allocator<MyMesh>::DeleteFace(mesh, mesh.face[i]); } // DELETED フラグのついたMyFaceオブジェクトを削除する vcg::tri::Allocator<MyMesh>::CompactFaceVector(mesh);
VCGの三角形の削除は、MyFaceオブジェクトにDELETEDフラグを立てる事で行う。
DeleteFace staticメンバ関数でDELETEDフラグを立てるのだが、この時、対象の三角形(上ではmesh.face[i])に既にDELETEDフラグが立っているとassertで落ちる。まあ既に削除された事になっているモノを操作しようとしているのだから合理的ではあるのだが。
そして、本当の削除はその後CompactFaceVectorで行う。
この時注意は、CompactFaceVectorを使う前も、「内部的には三角形数==0 」 という扱いになっている。だから、
int fc = mesh.FN();
とした場合、fc == 0になる。
ところが
int fc = mesh.face.size()
とすると、削除する前の三角形の数を取得することになる。この
という状況がVCGできにはまずいので、一連の処理が終わったらCompactFaceVectorを必ず呼び出す必要がある。
VCG LibraryのBall Pivotingでメッシュ生成
VCG Library ターゲットの周辺のオブジェクトを取得
問題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プロジェクトを作成
2.プロジェクト→
プロパティページ→リンカー→
詳細設定→エントリーポイント = main
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が短い可能性がある。