ぬの部屋(仮)
nu-no-he-ya
  •      12
    3456789
    10111213141516
    17181920212223
    242526272829 
           
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031     
        123
    45678910
    11121314151617
    18192021222324
    252627282930 
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    30      
       1234
    567891011
    12131415161718
    19202122232425
    262728293031 
           
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
           
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
    1234567
    891011121314
    15161718192021
    22232425262728
    2930     
           
        123
    45678910
    11121314151617
    18192021222324
    25262728293031
           
        123
    45678910
    11121314151617
    18192021222324
    25262728   
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
    31      
       1234
    567891011
    12131415161718
    19202122232425
    2627282930  
           
    1234567
    15161718192021
    293031    
           
         12
    3456789
    10111213141516
           
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031     
        123
    45678910
    11121314151617
    18192021222324
    252627282930 
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    30      
       1234
    567891011
    12131415161718
    19202122232425
    262728293031 
           
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    
           
        123
    45678910
    11121314151617
    18192021222324
    25262728293031
           
      12345
    6789101112
    13141516171819
    20212223242526
    27282930   
           
        123
    45678910
    11121314151617
    18192021222324
    252627282930 
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
       1234
    567891011
    12131415161718
    19202122232425
    2627282930  
           
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
           
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
      12345
    6789101112
    13141516171819
    20212223242526
    2728     
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031     
     123456
    78910111213
    14151617181920
    21222324252627
    282930    
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
    31      
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    
           
        123
    45678910
    11121314151617
    18192021222324
    252627282930 
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
       1234
    567891011
    12131415161718
    19202122232425
    262728293031 
           
     123456
    78910111213
    14151617181920
    21222324252627
    282930    
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
    31      
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
    1234567
    891011121314
    15161718192021
    22232425262728
    2930     
           
        123
    45678910
    11121314151617
    18192021222324
    25262728293031
           
      12345
    6789101112
    13141516171819
    20212223242526
    27282930   
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031     
          1
    2345678
    9101112131415
    16171819202122
    232425262728 
           
       1234
    567891011
    12131415161718
    19202122232425
    262728293031 
           
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
           
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
    1234567
    891011121314
    15161718192021
    22232425262728
    2930     
           
        123
    45678910
    11121314151617
    18192021222324
    25262728293031
           
  • VC++で空のプロジェクトから作成したコードでWinMainを使う

    空のプロジェクトでWinMainできない

    新しいプロジェクトの作成→『 空のプロジェクト 』でプロジェクトを作った後、WinMain関数をエントリポイントにコンパイルしようとすると、mainが見つからないというエラーになる。

    MSVCRTD.lib(exe_main.obj) : error LNK2019: 未解決の外部シンボル _main が関数 “int __cdecl invoke_main(void)” (?invoke_main@@YAHXZ) で参照されました。

    対処法

    構成プロパティ→リンカー→システム→サブシステム→

    Windows (/SUBSYSTEM:WINDOWS)

    に設定

    Blender 2.8 pythonで矢印を作る

    コード

    import bpy
    import math
    
    
    from mathutils import Vector
    
    from math import radians
    from mathutils import Matrix
    
    ####################################################################
    ####################################################################
    ####################################################################
    ####################################################################
    # rotate
    # targetobjに現在のアクティブなオブジェクトを指定する
    def rotate_object(targetobj,rot_mat):
        # decompose world_matrix's components, and from them assemble 4x4 matrices
        orig_loc, orig_rot, orig_scale = targetobj.matrix_world.decompose()
        #
        orig_loc_mat   = Matrix.Translation(orig_loc)
        orig_rot_mat   = orig_rot.to_matrix().to_4x4()
        orig_scale_mat = (Matrix.Scale(orig_scale[0],4,(1,0,0)) @ 
                          Matrix.Scale(orig_scale[1],4,(0,1,0)) @ 
                          Matrix.Scale(orig_scale[2],4,(0,0,1)))
        #
        # assemble the new matrix
        targetobj.matrix_world = orig_loc_mat @ rot_mat @ orig_rot_mat @ orig_scale_mat 
    
    ####################################################################
    ####################################################################
    ####################################################################
    ####################################################################
    ####################################################################
    
    #オブジェクトobjectのvid番目の頂点座標をグローバル座標で返す def get_coord_as_global(object,vid): v_local = object.data.vertices[vid].co # local vertex coordinate v_global = object.matrix_world @ v_local # global vertex coordinates return v_global
    #objで指定したオブジェクトを元に矢印を作成 def create_arrow(obj): #parameters thickness_ratio = 0.03 head_ratio = 0.4 body_ratio = 1.0-head_ratio head_root_ratio = 2; zvec = Vector([ 0.0 , 0.0 , 1.0]) zvec.normalize() avec = get_coord_as_global(obj,1) - get_coord_as_global(obj,0) aveclen = avec.length avec.normalize() rotvec = Vector.cross(zvec,avec) rotvec.normalize() rotang = math.acos(Vector.dot(zvec,avec) ) globalpos = get_coord_as_global(obj,0) #add a circle bpy.ops.mesh.primitive_circle_add(location=globalpos, radius=aveclen*thickness_ratio) mycircle = bpy.context.object rotate_object(mycircle,Matrix.Rotation(rotang,4,rotvec)) ######################################### # extrude bpy.ops.object.mode_set(mode='EDIT') bpy.ops.mesh.fill() # step 1 - oshidashi bpy.ops.mesh.extrude_region_move(TRANSFORM_OT_translate={"value":avec*aveclen*body_ratio} ) # step 2 -| oshidasi&scale bpy.ops.mesh.extrude_region_move(TRANSFORM_OT_translate={"value":(0,0,0)} ) bpy.ops.transform.resize(value=(head_root_ratio,head_root_ratio,head_root_ratio) ) # step 3 -|= oshidashi bpy.ops.mesh.extrude_region_move(TRANSFORM_OT_translate={"value":avec*aveclen*head_ratio} ) # step 4 -|> bpy.ops.transform.resize(value=(0,0,0) ) bpy.ops.mesh.remove_doubles() bpy.ops.object.mode_set(mode='OBJECT') #現在選択中のオブジェクトを取得 obj = bpy.context.active_object
    #objの第0頂点->第1頂点を示す矢印オブジェクトを新規作成 create_arrow(obj)

    使い方

    頂点が二つ以上あるオブジェクトを選択した状態でこのスクリプトを走らせると、第0頂点->第1頂点の矢印が新規オブジェクトとして生成される

    説明

    1.オブジェクトの2頂点を取得し、ベクトル化

        avec = get_coord_as_global(obj,1) - get_coord_as_global(obj,0)
        aveclen = avec.length
        avec.normalize()
    

    ※get_coord_as_globalは自作関数

    2.ベクトル(0,0,1)と、先に求めたベクトルの外積で回転軸を、内積のacosで回転角を求める

        zvec = Vector([ 0.0 , 0.0 , 1.0])
        zvec.normalize()
    
        rotvec = Vector.cross(zvec,avec)
        rotvec.normalize()
        rotang = math.acos(Vector.dot(zvec,avec) )
    

    3.第0頂点の位置にCircleを新規作成

        globalpos = get_coord_as_global(obj,0)
    
        #add a circle
        bpy.ops.mesh.primitive_circle_add(location=globalpos, radius=aveclen*thickness_ratio)
        mycircle = bpy.context.object
    

    4.Circleを2で求めた角度と回転軸で回転

        rotate_object(mycircle,Matrix.Rotation(rotang,4,rotvec))
    

    ※rotate_objectは自作関数

    5.Editモードに入り、Circleをメッシュ化

        bpy.ops.object.mode_set(mode='EDIT')
        bpy.ops.mesh.fill()
    

    5.Editモードに入り、Circleを押し出し

        # step 1 -    oshidashi
        bpy.ops.mesh.extrude_region_move(TRANSFORM_OT_translate={"value":avec*aveclen*body_ratio} )
    

    6.押し出した頂点をそのまま方向(0,0,0)で押し出し、やや拡大

        # step 2 -|   oshidasi&scale
        bpy.ops.mesh.extrude_region_move(TRANSFORM_OT_translate={"value":(0,0,0)} )
        bpy.ops.transform.resize(value=(head_root_ratio,head_root_ratio,head_root_ratio) )
    

    7.さらに押し出し

        # step 3 -|=  oshidashi
        bpy.ops.mesh.extrude_region_move(TRANSFORM_OT_translate={"value":avec*aveclen*head_ratio} )
    

    8.押し出した頂点をmerge at centerする

        # step 4 -|>
        bpy.ops.transform.resize(value=(0,0,0) )
    
        bpy.ops.mesh.remove_doubles())
    

    Blender 2.8 のPythonで Rotateする

    Blender 2.8のPythonで、オブジェクトを回転しようとして以下のようなコードを適当にコピペしたところ、

    import bpy
    
    bpy.ops.transform.rotate(value=0.4,axis=(1.0,1.0,0.0))
    

    TypeError: Converting py args to operator properties: : keyword “axis” unrecognized
    Error: Python script failed, check the message in the system console

    みたいな感じのエラーが出て修正できない。

    によると、どうやらaxisはなくなったようで、しかもシンプルな方法がない(?)らしい。

    上記記事では以下のようなrotate_object関数を自作して対応している。

    import bpy
    
    
    from math import radians
    from mathutils import Matrix
    
    # objに現在のアクティブなオブジェクトを指定する
    obj = bpy.context.active_object
    
    def rotate_object(rot_mat):
        # decompose world_matrix's components, and from them assemble 4x4 matrices
        orig_loc, orig_rot, orig_scale = obj.matrix_world.decompose()
        #
        orig_loc_mat   = Matrix.Translation(orig_loc)
        orig_rot_mat   = orig_rot.to_matrix().to_4x4()
        orig_scale_mat = (Matrix.Scale(orig_scale[0],4,(1,0,0)) @ 
                          Matrix.Scale(orig_scale[1],4,(0,1,0)) @ 
                          Matrix.Scale(orig_scale[2],4,(0,0,1)))
        #
        # assemble the new matrix
        obj.matrix_world = orig_loc_mat @ rot_mat @ orig_rot_mat @ orig_scale_mat 
    
    # Matrix.Rotationで回転行列を作成
    # Matrix.Rotation( ラジアンの回転角 , 4 , 回転軸 )
    # 4 は4x4行列の意味
    # 回転軸は(x,y,z)形式の他に 'X' や 'Y' や'Z' のように軸名を指定することもできる
    rotate_object( Matrix.Rotation( radians(45), 4, (1,1,1) ) )
    

    実行例

    比較

    Blender 2.8で以下を実行

    rotate_object( Matrix.Rotation( 0.349, 4, (1.0,1.0,0.0) ) )
    

    Blende 2.79で以下を実行

    bpy.ops.transform.rotate(value=0.349,axis=(1.0,1.0,0.0))
    
    元のモデル

    Blender 2.8
    Blender 2.79

    同じ結果が出力できた

    チュートリアル Daily Blender Tip 217 – Make a Low-Poly Tree in One Minuteを試す

    とても単純だけれど形状が面白いので紹介。

    1.幹の作成

    Extra Object add-onを有効にする

    [Shift+A]→[Mesh]→[Single Vert]→Add Single Vertを追加し、

    [E][G]で押し出しながら木の形を作る

    Skinモディファイアを適用する

    2.葉の作成

    [Shift+A]→[Mesh]→UV Sphereで球を追加し、[Ctrl+J]で全て一つのオブジェクトにする

    [Ctrl+J]後

    葉と幹にMaterialを追加し、それぞれ色を設定する

    葉にDisplaceモディファイアを追加し、Cloudsテクスチャを割り当てる

    Remeshモディファイアを追加し、ModeをBlockにする

    結果

    RemeshのOctree Depthを変更するとブロックの細かさが変わる

    Fast Technique to Model a Rose flower in Blenderのチュートリアルを試す(3)

    4:00~

    1.茎を作成

    [Shift+A]→[Mesh]→Circle で円を追加

    CircleのVerticesを10にする。Radiusに関しては、花の直径が最初に描いた線に依存するので、適切な値を指定する

    茎の根元のエッジを押しだし、萼を五つ作る

    Subdivision SurfaceモディファイアとSmoothシェーディングを適用する

    2.葉を作成

    [1]を押してXZ平面表示に、[5]で平行投影にする

    [Shift+A]→[Mesh]→CubeでCubeを作成

    直方体状に編集し、上下の面を削除する

    CubeのEditモードのまま、[Shift+A]→[Mesh]→Plane でPlaneを追加

    X軸に90度回転し、横に三分割、縦に二分割する

    さらに以下の形に編集。茎の部分との太さを調整する。また茎はCtrl+RでLoopCutで三分割する

    Subdivison Surfaceモディファイアを設定する

    Editモードで、originが茎の根元にくるように移動する

    葉を移動し、茎につなげる。[Shift+D]で複製し、反対側にも付ける。

    Propotional Editingを使って葉の形を整える

    また、Environment Lightingを有効にする

    ライトをAreaにし、以下のように設定。

    Fast Technique to Model a Rose flower in Blenderのチュートリアルを試す(2)

    1.[5]で平行投影に切り替え、[1]でXZビューにする。

    Editモードに入り、[E][Z][S]で押し出し、拡大を二回行う

    2.[Ctrl+I(アイ)]で選択範囲を反転し、[H]で一時的に不可視にする。

    ※Hideの切り替えは[H] 及び[Alt+H]で行う

    3.proportional editingをSmoothに設定し、バラの花びらの先頭部分を盛り上げる

    4.[Alt + H]で全体を表示させ、内部、中央付近のエッジを選択し、Proportional editingのSmoothを使用して膨らませる

    5.花びら上部を選択し、中央から外側に押し出しを行う。その後Z方向に若干移動する

    Subdivide Surfaceモディファイアを追加したうえでShadingをSmoothにする

    花びらの端を内側に織り込むように修正する

    全ての花弁の端を織り込むと以下のような形になる

    [7]を押して、上から花びらの幅を調整する

    根元を調整し、茎に接続できるまで縮小する

    Fast Technique to Model a Rose flower in Blenderのチュートリアルを試す(1)

    1.Cubeを削除する

    2.[7]キーでTopからのビューに変更する

    3.Grease Pencilを使用し、バラの花びらの曲線を描く

    4.Convert to Geometry → Polygon Curve でカーブに変換する

    変換したのち、Pencilのレイヤーを不可視にし、Curveだけが見えるようにする

    5.Simplify Curvesアドオンを使用し、Distance Error=0.015を設定する

    [Space]でアドオンの検索

    ※Simplify Curvesが見つからない場合はアドオンを有効にする

    6.[Object]→[Convert to]→[Mesh from Curve]でカーブをエッジオブジェクトに変更する

    7.Editモード、Edge選択モードで不要な連結を削除する

    std::eraseで消す範囲を図解

    時々使うと忘れるので。

    テストコード

    #include <iostream>
    
    #include <vector>
    
    int main()
    {
    
      std::vector<int> v{ 0,1,2,3,4,5,6 };
    
      v.erase(v.begin()+1, v.begin() + 4);
    
      for (size_t i = 0; i < v.size(); i++) {
        printf("%d\n", v[i]);
      }
    
      getchar();
    }
    

    実行結果

    0
    4
    5
    6

    削除範囲の図解

    vectorの内容から重複を削除する

    vectorの内容から重複を削除するには、sort→unique→eraseの順に実行する。

    この時、sortはコンテナごとに違う関数を使用しなければいけなかったりするので、vector意外にも使いたいなら多少の工夫が必要となる。

    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <list>
    
    ///////////////////////////////
    // ソート関数
    template<class T>
    inline void container_sort(std::vector<T>& v) {
      std::sort(v.begin(), v.end());
    }
    template<class T>
    inline void container_sort(std::list<T>& v) {
      v.sort();
    }
    
    ////////////////////////////// // 重複削除関数 template<class T> void vec_unique(T& v) { container_sort(v); v.erase( std::unique( v.begin(), v.end()), v.end() ); }
    int main() { std::vector<int> v{ 4,8,2,5, 4,8,2,5, 9,9,9,5, 5,2,3,3 }; //重複削除 vec_unique(v); for (auto it = std::begin(v); it != std::end(v);++it) { std::cout << *it << std::endl; } int i; std::cin >>i; }

    std::vectorの結合

    下記ブログから。詳細・注意点などは転載元を確認

    C++ std::vector同士の連結方法
    https://qiita.com/D-3/items/b19b7acb439ed0e3deee

    insertを使う

    #include <iostream>
    #include <vector>
    
    int main()
    {
      std::vector<int> v123{ 1,2,3 };
      std::vector<int> v456{ 4,5,6 };
    
    //v123にv456を結合 v123.insert(v123.end(), v456.begin(), v456.end()); for (size_t i = 0; i < v123.size(); i++) { std::cout << v123[i] << std::endl; } }

    copyを使う

    #include <iostream>
    #include <vector>
    
    int main()
    {
      
      std::vector<int> v123{ 1,2,3 };
      std::vector<int> v456{ 4,5,6 };
    
    //v123にv456を結合 std::copy(v456.begin(), v456.end(), std::back_inserter(v123)); for (size_t i = 0; i < v123.size(); i++) { std::cout << v123[i] << std::endl; } }

    結果