まず、私はこれがモダンなC++の標準機能なのかは知らない。ただ、VC++2017で以下のようにやって動いた、という話。
例えば以下はエラー。
template< class Container, class Type > struct MyVector { Container<Type> o; };
int main() { MyVector<std::vector, int> mv; mv.o.push_back(1); }
あるクラスに、コンテナとその内容の型を別々に渡したいときは、以下のようにする。
template< class Type , template<class, class ___ALLCATOR = std::allocator<Type> > class Container > struct MyVector { Container<Type> o; };
int main() { MyVector<int, std::vector> mv; mv.o.push_back(1); }
ここで、template<class,class>は相手がvectorならよいが、unordered_mapなどを入れると互換性がないといわれる。
template< class Type, template<class, class ___ALLCATOR = std::allocator<Type> > class Container > struct MyVector { Container<Type> o; };
int main() { MyVector<int, std::unordered_map> mv; mv.o.push_back(1); }
クラス テンプレート 'std::unordered_map' 用テンプレート パラメーター リストがテンプレート パラメーター 'Container' 用テンプレート パラメーター リストと一致しません。
そこで、テンプレートテンプレートパラメータのほうのパラメータリストをパックする
template< template<class ...Args> class Container, class Type> struct MyVector { Container<Type> o; };
int main() { MyVector<std::vector,int> mv; mv.o.push_back(1); }
テンプレートテンプレートパラメータをパックできるので、コンテナに与える型もパックしてやると、色々なコンテナに対応したテンプレートクラスを作成できる。
template< template<class ...Args> class Container, class ...Type> struct MyVector { Container<Type...> o; };
int main() { MyVector< std::unordered_map, int, float> cm; MyVector< std::vector, float> cv; cm.o[100] = 50.3f; cv.o.push_back(30.0f); std::cout << "map " << cm.o[100] << std::endl; std::cout << "vec " << cv.o[0] << std::endl; int i; std::cin >> i; }
以下はG3F のMika 7を変換した結果。なお全て平行投影。
※あと、G7Fとあるけど実際にはG3Fです。Genesis 3 Femaleです。間違えました
好みの差が出てくるくらいの違いは確認できる。
以下、正面から見た場合のシルエット。初期の姿勢が変わっているのは仕方が無い。
横から見た図
むしろこういう特殊なキャラクタこそちゃんと変換して欲しい気がするのだが、とにかく時間がかかった割に黒い線が入ったりしている。

Character Converter G3F to G8Fの使い方について。日本語の情報があまりなかったので。
Character Converter G3F to G8F
https://www.daz3d.com/character-converter-from-genesis-3-female-to-genesis-8-female
1.DAZ Install ManagerからインストールするとCharacter Converterの中に入っている。
2.Output Directoryに変換後のデータを入れるディレクトリを指定。上書を避けるためにMy Daz 3D Library以外が推奨されている。

3.Genesis 3 Femaleのキャラクタの入っているディレクトリを指定する。
各キャラクタのディレクトリが入っているディレクトリを指定。
変換したいキャラがチェックされている状態で、Execute from Selectedをクリック。
ものによってものすごく時間がかかることがある。Star 2.0とか、50分かかった。そのうえ失敗する。
次回へ続く。
import bpy node = bpy.data.node_groups["Material.001"] node.nodes.new(type='VRayNodeMetaStandardMaterial')
| Material Output | VRayNodeOutputMaterial |
| Standard Material | VRayNodeMetaStandardMaterial |
| Two Sided | VRayNodeMtl2Sided |
| Angle Blend | VRayNodeMtlAngleBlend |
| Diffuse | VRayNodeMtlDiffuse |
| Double Sided | VRayNodeMtlDoubleSided |
| GLSL | VRayNodeMtlGLSL |
| Material ID | VRayNodeMtlMaterialID |
| Object Bounding | VRayNodeMtlObjBBox |
| Override | VRayNodeMtlOverride |
| Render Stats | VRayNodeMtlRenderStats |
| Rounded Corners | VRayNodeMtlRoundEdges |
| Single | VRayNodeMtlSingleBRDF |
| Streak Fade | VRayNodeMtlStreakFade |
| Toon | VRayNodeMtlToon |
| VRmat | VRayNodeMtlVRmat |
| Wrapper | VRayNodeMtlWrapper |
| Multi ID | VRayNodeMtlMulti |
| OSL Material | VRayNodeMtlOSL |
| AlHair | VRayNodeBRDFAlHair |
| Material Output | VRayNodeOutputMaterial |
| AlSurface | VRayNodeBRDFAlSurface |
| Blinn | VRayNodeBRDFBlinn |
| Bump | VRayNodeBRDFBump |
| CSV | VRayNodeBRDFCSV |
| Car Paint | VRayNodeBRDFCarPaint |
| Cook Torrance | VRayNodeBRDFCookTorrance |
| Diffuse | VRayNodeBRDFDiffuse |
| Diffuse For SSS | VRayNodeBRDFDiffuse_forSSS |
| Flakes | VRayNodeBRDFFlakes |
| GGX | VRayNodeBRDFGGX |
| Glass | VRayNodeBRDFGlass |
| Glass Glossy | VRayNodeBRDFGlassGlossy |
| HOPS | VRayNodeBRDFHOPS |
| Hair | VRayNodeBRDFHair |
| Hair 2 | VRayNodeBRDFHair2 |
| Hair 3 | VRayNodeBRDFHair3 |
| Hair 4 | VRayNodeBRDFHair4 |
| Light | VRayNodeBRDFLight |
| Mirror | VRayNodeBRDFMirror |
| Multi Bump | VRayNodeBRDFMultiBump |
| Phong | VRayNodeBRDFPhong |
| Reflection | VRayNodeBRDFReflection |
| Refraction | VRayNodeBRDFRefraction |
| SSS | VRayNodeBRDFSSS |
| SSS 2 | VRayNodeBRDFSSS2 |
| SSS 2 Complex | VRayNodeBRDFSSS2Complex |
| Sampled | VRayNodeBRDFSampled |
| Skin | VRayNodeBRDFSkinComplex |
| Stochastic Flakes | VRayNodeBRDFStochasticFlakes |
| VRayMtl | VRayNodeBRDFVRayMtl |
| Ward | VRayNodeBRDFWard |
| Point Particle | VRayNodeBSDFPointParticle |
| Layered | VRayNodeBRDFLayered |
| Image File | VRayNodeMetaImageTexture |
| Color | VRayNodeTexAColor |
| Bercon Distortion | VRayNodeTexBerconDistortion |
| Bercon Grad | VRayNodeTexBerconGrad |
| Bercon Noise | VRayNodeTexBerconNoise |
| Bercon Tile | VRayNodeTexBerconTile |
| Bercon Wood | VRayNodeTexBerconWood |
| Bifrost VV Mix | VRayNodeTexBifrostVVMix |
| Bulge | VRayNodeTexBulge |
| Cellular | VRayNodeTexCellular |
| Checker | VRayNodeTexChecker |
| Cloth | VRayNodeTexCloth |
| Curvature | VRayNodeTexCurvature |
| Dirt | VRayNodeTexDirt |
| Distance | VRayNodeTexDistance |
| Distance Between | VRayNodeTexDistanceBetween |
| Edges | VRayNodeTexEdges |
| Falloff | VRayNodeTexFalloff |
| Float | VRayNodeTexFloat |
| Fresnel | VRayNodeTexFresnel |
| Gradient Ramp | VRayNodeTexGradRamp |
| Gradient | VRayNodeTexGradient |
| Granite | VRayNodeTexGranite |
| Grid | VRayNodeTexGrid |
| HSV To RGB | VRayNodeTexHSVToRGB |
| Hair Sampler | VRayNodeTexHairSampler |
| ICC | VRayNodeTexICC |
| Int | VRayNodeTexInt |
| Leather | VRayNodeTexLeather |
| Luminance | VRayNodeTexLuminance |
| Lut | VRayNodeTexLut |
| Marble | VRayNodeTexMarble |
| Mesh Map Channel | VRayNodeTexMeshVertexColorChannel |
| Motion Occlusion | VRayNodeTexMotionOcclusion |
| Multi Float | VRayNodeTexMultiFloat |
| Noise | VRayNodeTexNoise |
| Noise (3ds Max) | VRayNodeTexNoiseMax |
| Noise (Maya) | VRayNodeTexNoiseMaya |
| OCIO | VRayNodeTexOCIO |
| OpenVDB | VRayNodeTexOpenVDB |
| Ptex | VRayNodeTexPtex |
| Ray Switch | VRayNodeTexRaySwitch |
| Rock | VRayNodeTexRock |
| Sampler | VRayNodeTexSampler |
| Noise (Simplex) | VRayNodeTexSimplexNoise |
| Sky | VRayNodeTexSky |
| Smoke | VRayNodeTexSmoke |
| Snow | VRayNodeTexSnow |
| Soft Box | VRayNodeTexSoftbox |
| Speckle | VRayNodeTexSpeckle |
| Splat | VRayNodeTexSplat |
| Stencil | VRayNodeTexStencil |
| Stucco | VRayNodeTexStucco |
| Surface Luminance | VRayNodeTexSurfaceLuminance |
| Swirl | VRayNodeTexSwirl |
| Temperature | VRayNodeTexTemperature |
| Thickness | VRayNodeTexThickness |
| Tiles | VRayNodeTexTiles |
| TriPlanar | VRayNodeTexTriPlanar |
| UVW | VRayNodeTexUVW |
| User Color | VRayNodeTexUserColor |
| User Scalar | VRayNodeTexUserScalar |
| Voxel Data | VRayNodeTexVoxelData |
| Water | VRayNodeTexWater |
| Wood | VRayNodeTexWood |
| Layered | VRayNodeTexLayered |
| Multi ID | VRayNodeTexMulti |
| OSL Texture | VRayNodeTexOSL |
ノードを手動で追加し、以下のスクリプトで表示させている。
import bpy node = bpy.data.node_groups["Material.001"] for n in node.nodes: print(n)
Windowsの圧縮フォルダはZipcryptoという暗号化方式を利用しているらしいが、LIBZIPで指定できるのはRES-128等で、Windows標準に対応できない(圧縮フォルダを解凍できない)(らしい)。
従って動作を確認するには他のフリーソフトなどを使う必要がある。Lhaplusではとりあえず読み込めた。
※本当は展開もやるつもりだった(本当だ)のだけれどこの事実に気づくのに半日かかって気力が尽きたのでとりあえず圧縮だけやる。
#include <zip.h> #include <iostream> #pragma comment(lib,"zip.lib") //ファイルを圧縮 int main(int argc, char* argv[]) { int errorp; zip_t* zipper = zip_open(R"(C:\test\out.zip)", ZIP_CREATE | ZIP_EXCL, &errorp); // パスワードの定義 const char* thePassWord = "j6KY4cwC"; zip_source_t* source; zip_int64_t iIndex; source = zip_source_file(zipper, R"(C:\test\data\snail1.png)", 0, 0); iIndex = zip_file_add(zipper, R"(snail1.png)", source, ZIP_FL_ENC_RAW); zip_file_set_encryption(zipper, iIndex, ZIP_EM_AES_128, thePassWord);//パスワードを指定 source = zip_source_file(zipper, R"(C:\test\data\snail2.png)", 0, 0); iIndex = zip_file_add(zipper, R"(snail2.png)", source, ZIP_FL_ENC_RAW); zip_file_set_encryption(zipper, iIndex, ZIP_EM_AES_128, thePassWord);//パスワードを指定 source = zip_source_file(zipper, R"(C:\test\data\snail5.png)", 0, 0); iIndex = zip_file_add(zipper, R"(snail5.png)", source, ZIP_FL_ENC_RAW); zip_file_set_encryption(zipper, iIndex, ZIP_EM_AES_128, thePassWord);//パスワードを指定 zip_close(zipper); int i; std::cin >> i; return 0; }
以下は、zipファイル内の三番目(index==2)のファイルを展開するプログラム。
#include <zip.h> #include <iostream> #pragma comment(lib,"zip.lib") int main(int argc, char* argv[]) { // ZIPファイルを読み取り専用で開く int errorp;
zip_t* zipper = zip_open(R"(C:\test\zipdata.zip)", ZIP_RDONLY , &errorp); // ZIP内のファイルの個数を取得 zip_int64_t num_entries = zip_get_num_entries(zipper, 0); // ZIP内のファイルの各ファイル名を取得 std::cout << "count: " << num_entries << std::endl; for (zip_int64_t index = 0; index < num_entries; index++) { std::cout << "[" << index << "]" << zip_get_name(zipper, index, ZIP_FL_ENC_RAW) << std::endl; } // ZIP内の2番目のファイルに関する情報を取得する struct zip_stat sb; zip_int64_t index = 2; zip_stat_index(zipper, index, 0, &sb); // 2番目のファイルのファイルサイズと同じメモリを確保する char* contents = new char[sb.size]; // 2番目のファイルの内容をメモリに読み込む zip_file* zf = zip_fopen(zipper, sb.name, 0); zip_fread(zf, contents, sb.size); zip_fclose(zf); zip_close(zipper);
////////////////// // ファイル名を出力できる形に変更 // ファイル一覧は階層構造をしておらず、ディレクトリ区切りは'/'で直接出力できないので // ファイル名中の'/'を'-'に置き換える。 // 本来なら再帰的にディレクトリを作るなどすべき。 std::string target = sb.name; for (size_t i = 0; i < target.size(); i++) { if (target[i] == '/') { target[i] = '-'; } } // //////////////////
// 解凍したファイルを作成 std::string outname = R"(C:\test\)" + target; FILE* of = fopen(outname.c_str(), "wb"); fwrite(contents, 1, sb.size, of); fclose(of);
int i; std::cin >> i; }
#include <zip.h> #pragma comment(lib,"zip.lib") int main(int argc, char* argv[]) { int errorp; zip_t* zipper = zip_open(R"(C:\dev\out.zip)", ZIP_CREATE | ZIP_EXCL, &errorp); zip_source_t* source; try { ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// // ファイル追加 source = zip_source_file(zipper, R"(C:\test\data\img1.jpg)", 0, 0); if (zip_file_add(zipper, R"(img1.jpg)", source, ZIP_FL_ENC_UTF_8) < 0) { //エラー処理 zip_source_free(source); throw 1; } source = zip_source_file(zipper, R"(C:\test\data\img2.jpg)", 0, 0); if (zip_file_add(zipper, R"(img2.jpg)", source, ZIP_FL_ENC_UTF_8) < 0) { //エラー処理 zip_source_free(source); throw 1; } source = zip_source_file(zipper, R"(C:\test\data\img3.jpg)", 0, 0); if (zip_file_add(zipper, R"(img3.jpg)", source, ZIP_FL_ENC_UTF_8) < 0) { //エラー処理 zip_source_free(source); throw 1; } ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// // ディレクトリ追加 if (zip_dir_add(zipper, "folder", ZIP_FL_ENC_UTF_8) < 0) { //エラー処理 zip_source_free(source); throw 1; } ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// // ファイル追加 source = zip_source_file(zipper, R"(C:\test\data\dir\img4.jpg)", 0, 0); if (zip_file_add(zipper, R"(folder\img4.jpg)", source, ZIP_FL_ENC_UTF_8) < 0) { //エラー処理 zip_source_free(source); throw 1; } source = zip_source_file(zipper, R"(C:\test\data\dir\img5.jpg)", 0, 0); if (zip_file_add(zipper, R"(folder\img5.jpg)", source, ZIP_FL_ENC_UTF_8) < 0) { //エラー処理 zip_source_free(source); throw 1; } source = zip_source_file(zipper, R"(C:\test\data\dir\img6.jpg)", 0, 0); if (zip_file_add(zipper, R"(folder\img6.jpg)", source, ZIP_FL_ENC_UTF_8) < 0) { //エラー処理 zip_source_free(source); throw 1; } zip_close(zipper); } catch (...) { zip_close(zipper); } return 0; }
libzipのビルドにはzlibが必要。
libpngをやったときのzlibを使いまわすのでこの点は省略する。
まずConfigureすると、以下のようにエラーが出る。
とりあえずzlibのパスとインストール先を指定する。

この状態でConfigureすると、以下のようにBZIP2とLIBLZMAでWarningが出るが、support disabledと言われているだけなので無視してGenerateしてOpen Projectする。

Open ProjectしたらReleaseにしてALL BUILDしてINSTALLする。
そもそもなんでlibzipをやろうと思ったかというと、今まで勝手にzlibがzipファイル作成ライブラリだと思い込んでいて、libpng関連でzlibについて調べて初めて真相を知ったから。
あと、次回はサンプルコードを書く。
DAZ のシーンを Blenderに読み込むアドオン。
今回使用した環境
Blender 2.82 , DAZ 4.12
http://diffeomorphic.blogspot.com/p/daz-importer-version-14.html
私はモデリングやレンダリングに関してはライト層なのでcatとsheepがとりあえず出てくればいいや程度の判断しかしておらず、他のアドオンより優れていると判断して扱っているわけではないのでその点を踏まえてください。
インストールマニュアルがもの凄く親切に画像を載せて書かれているので殆どここを読めばできる。
http://diffeomorphic.blogspot.com/p/daz-importer-version-14.html
0.zipをダウンロード・展開
1.Blender 側のアドオンをインストール・設定
2.DAZ Studio 側のアドオンをインストール
3.DAZ library pathの設定(いらない)
4.DAZで普通に.dufファイルを保存,アドオンで同名の.jsonファイルを出力
5.Blender側で読込
ダウンロードリンクをクリックした先はDropboxなのでその辺にあるダウンロードボタンを押してダウンロードする。
インストールはマニュアルそのままでいい。
http://diffeomorphic.blogspot.com/p/installing-blender-add-on.html
要約:「Edit->Preferenceからadd-onsのInstallでダウンロードしたzipをそのまま指定してチェックもいれちゃってください」
設定もおそらくは基本そのままでいいはずだがエラーが出たら下参照。
Blender側の設定で最も重要なことは「DAZのフィギュアデータが入っているディレクトリを指定する事」で、使ってみてファイルが見つかりませんのようなエラーが出た場合まずここを疑うべき。
これも公式そのままでいい。
http://diffeomorphic.blogspot.com/p/installing-daz-studio-plugin.html
基本やらなくていい。
DAZで普通にフィギュアを設定し、
で.dufファイルを保存
今回新しく入れたアドオンで、dufファイルと同じ場所に.jsonファイルを出力する。ファイル名部分はdufファイルと同じである必要がある。
[File]→[Import]→[DAZ Native]
または、以下Import DAZ Fileからdufファイルを読み込む
ファイルが見つからないとエラーが出る場合がある。以下エラーログ:
私の場合、フィギュアのフォルダ構成が
のような状態になっていたからで、特に赤字部分はDAZコネクトによりインストールすることで勝手に決められてしまう。Daz Importer 1.4ではディレクトリが9個しか(?)登録できないこともあり、これを全部登録するのは無理がある。
\data\ 以下の青時部分は共通しているので、\cloud\(数字)\ より下の内容を全部他の場所に固めてコピーし、そのディレクトリを指定すれば動くようにはなる。
今後のことも考えればDAZコネクト使用時のディレクトリをわかりやすいものにする方法を探すべき。
だが見つからなかったので、DAZ Install Managerからインストールしなおした。
DAZ Install Manager からダウンロードした場合、格納先はBasic Settings...から確認できる。そして多分デフォルトでインストールしたならこのパスはBlenderのaddon側に既に入っていると思うので変える必要はない(かもしれないが確認したほうがいい)
参考:(DAZ コネクトについて)
http://kotozone.blog55.fc2.com/blog-entry-392.html
公式の一番目立つダウンロードを押しても少なくともWindows版はよくわからないところに飛ばされるので以下からダウンロードする
https://graphviz.gitlab.io/_pages/Download/Download_windows.html
graph g{
node[
fontname="MS Gothic"
]
"いろは" -- "にほへと" -- "ちりぬるを";
}
日本語を表示する場合、fontnameに日本語フォントを指定する必要がある。
\release\bin\dot.exe をコマンドプロンプトから実行する
ここで赤字は出力形式。当然だが出力はカレントディレクトリなのでパスを通さず上記を実行するとdot.exeと同じ場所にa.pngが生成される。
出力形式一覧
https://graphviz.org/doc/info/output.html
矢印には digraphを使う
digraph g{
node[
fontname="MS Gothic"
]
"いろは" -> "にほへと" -> "ちりぬるを";
"いろは" -> "日本語";
"日本語" -> "いろは";
}
digraph g{
node[
fontname="MS Gothic"
]
//ノード定義
"いろは" [fillcolor=plum ,style=filled]
"にほへと" [fillcolor=cyan ,style=filled]
"ちりぬるを" [fillcolor=white,style=filled]
"いろは" -> "にほへと";
"いろは" -> "ちりぬるを";
}
色一覧
http://www.graphviz.org/doc/info/colors.html
digraph g{
node[ fontname="MS Gothic" ]
edge[ fontname="MS Gothic" ]
"いろは" -> "にほへと" [label="連続"];
"いろは" -> "ちりぬるを" [label="非連続"];
}
digraph g{
node[ fontname="MS Gothic" ]
//ノードの定義
"いろは" [shape=circle];
"にほへと" [shape=triangle];
"ちりぬるを" [shape=diamond]
"いろは" -> "にほへと";
"いろは" -> "ちりぬるを";
}
ノードの形状一覧:
https://graphviz.gitlab.io/_pages/doc/info/shapes.html