ぬの部屋(仮)
nu-no-he-ya
  • 1234567
    891011121314
    15161718192021
    22232425262728
    2930     
           
        123
    45678910
    11121314151617
    18192021222324
    25262728293031
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    30      
       1234
    567891011
    12131415161718
    19202122232425
    262728293031 
           
     123456
    78910111213
    14151617181920
    21222324252627
    282930    
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
    31      
         12
    3456789
    10111213141516
    17181920212223
    2425262728  
           
      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
           
       1234
    567891011
    12131415161718
    19202122232425
    26272829   
           
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    
           
        123
    45678910
    11121314151617
    18192021222324
    25262728293031
           
      12345
    6789101112
    13141516171819
    20212223242526
    27282930   
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031     
        123
    45678910
    11121314151617
    18192021222324
    252627282930 
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
    31      
       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     
       1234
    567891011
    12131415161718
    19202122232425
    262728293031 
           
     123456
    78910111213
    14151617181920
    21222324252627
    282930    
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
    31      
       1234
    567891011
    12131415161718
    19202122232425
    2627282930  
           
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    
           
        123
    45678910
    11121314151617
    18192021222324
    25262728293031
           
      12345
    6789101112
    13141516171819
    20212223242526
    27282930   
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031     
        123
    45678910
    11121314151617
    18192021222324
    252627282930 
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
     123456
    78910111213
    14151617181920
    21222324252627
    28      
           
         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     
       1234
    567891011
    12131415161718
    19202122232425
    262728293031 
           
     123456
    78910111213
    14151617181920
    21222324252627
    282930    
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
    31      
       1234
    567891011
    12131415161718
    19202122232425
    2627282930  
           
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    
           
    1234567
    891011121314
    15161718192021
    22232425262728
           
           
        123
    45678910
    11121314151617
    18192021222324
    25262728293031
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    30      
       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     
         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
           
  • 全て未選択のラジオボタンの実装

     

    こんな風にラジオボタンがある時

    allunsetradio1

     

    radioButton1をクリックしたら、そのチェックが消えてほしい。

    allunsetradio2

     

    という上司の要求にこたえるべく以下のように実装

     まずラジオボタンがクリックされる直前の状態を記憶するメンバ変数を定義。

    bool checkwhendown;
    

     

    次にマウスダウンとクリックのイベントで呼び出す関数を以下に定義。

     

    void RadioMouseDown(System::Object^ sender,System::Windows::Forms::MouseEventArgs^  e){
        if (e->Button == System::Windows::Forms::MouseButtons::Left) {
            checkwhendown = dynamic_cast<RadioButton^>(sender)->Checked;
        }
    }
    void RadioMouseClick(System::Object^ sender,System::EventArgs^  e){
        if (dynamic_cast<System::Windows::Forms::MouseEventArgs^>(e)->Button == System::Windows::Forms::MouseButtons::Left) {
            if( checkwhendown ) dynamic_cast<RadioButton^>(sender)->Checked = false;
        }
    }
    

     

     各ラジオボタンの各メンバ関数から上記関数を呼び出す

    _MouseDownがあったときに現在のラジオボタンの状態を保存。

    その後「普通の」ラジオボタンの挙動が走ってしまい、クリックされたラジオボタンにチェックが入ってしまう

    そこでそのあとに飛んでくる_Clickイベントで保存していた状態を調べ、元々trueだったラジオボタンがクリックされていたら、falseをセットする

     

    System::Void radioButton1_MouseDown(System::Object^  sender, System::Windows::Forms::MouseEventArgs^  e) {
        RadioMouseDown(sender,e);
    }
    System::Void radioButton2_MouseDown(System::Object^  sender, System::Windows::Forms::MouseEventArgs^  e) {
        RadioMouseDown(sender,e);
    }
    System::Void radioButton3_MouseDown(System::Object^  sender, System::Windows::Forms::MouseEventArgs^  e) {
        RadioMouseDown(sender,e);
    }
    System::Void radioButton4_MouseDown(System::Object^  sender, System::Windows::Forms::MouseEventArgs^  e) {
        RadioMouseDown(sender,e);
    }
    System::Void radioButton5_MouseDown(System::Object^  sender, System::Windows::Forms::MouseEventArgs^  e) {
        RadioMouseDown(sender,e);
    }
    System::Void radioButton1_Click(System::Object^  sender, System::EventArgs^  e) {
        RadioMouseClick(sender,e);
    }
    System::Void radioButton2_Click(System::Object^  sender, System::EventArgs^  e) {
        RadioMouseClick(sender,e);
    }
    System::Void radioButton3_Click(System::Object^  sender, System::EventArgs^  e) {
        RadioMouseClick(sender,e);
    }
    System::Void radioButton4_Click(System::Object^  sender, System::EventArgs^  e) {
        RadioMouseClick(sender,e);
    }
    System::Void radioButton5_Click(System::Object^  sender, System::EventArgs^  e) {
        RadioMouseClick(sender,e);
    }
    

     

    .NETでチェックボックスのサイズが変えられない時

     

    VC++.NET 2012で、ラジオボタンおよびチェックボックスのサイズが変わらなくて困った。リソースエディタのプロパティいじっても、ソースから直接SizeやWidth,Heightを入れても変わってくれない。

    下記ではAppearanceをButtonにしているので普通のボタンのように見えている。

    この状態だとプッシュボタンとサイズが異なってしまい不格好になる。

    radio_btn_size2

     

     AutoSizeプロパティをFalseにする事で、サイズの問題は解決する。

    加えて、TextAlignもMiddleCenterにしておくと、文字がセンタリングされてプッシュボタンと雰囲気が同じになる。

     radio_btn_size3

     

    [簡易メモ]OpenGLでのテクスチャ

     

    ずっと、有名なOpenGL入門の記事をコピペコピペで来ていたが、最近はこれだけではテクスチャを貼れなくなっている。

    下記、赤下線太字で示した二行を加える必要がある。

    それ以外は上記サイトと全く同じ。

     

    #include <windows.h>
    #include <GL/gl.h>
    #include <GL/glut.h>
    #define TEXSIZE 64
    GLubyte bits[TEXSIZE][TEXSIZE][3];
    GLuint texName;
    void disp(void) {
        glClear(GL_COLOR_BUFFER_BIT);
        glBindTexture(GL_TEXTURE_2D, texName);
    
        glBegin(GL_POLYGON);
        glTexCoord2f(0, 0); glVertex2f(-0.9, -0.9);
        glTexCoord2f(0, 1); glVertex2f(-0.9, 0.9);
        glTexCoord2f(1, 1); glVertex2f(0.9, 0.9);
        glTexCoord2f(1, 0); glVertex2f(0.9, -0.9);
        glEnd();
        glFlush();
    }
    void timer(int value) {
        glRotatef(1, 0.5, 1, 0.25);
        glutPostRedisplay();
        glutTimerFunc(50, timer, 0);
    }
    int main(int argc, char ** argv) {
        unsigned int i, j;
    
        for (i = 0; i < TEXSIZE; i++) {
            int r = (i * 0xFF) / TEXSIZE;
            for (j = 0; j < TEXSIZE; j++) {
                bits[i][j][0] = (GLubyte)r;
                bits[i][j][1] = (GLubyte)((j * 0xFF) / TEXSIZE);
                bits[i][j][2] = (GLubyte)~r;
            }
        }
    
        glutInit(&argc, argv);
        glutInitWindowSize(400, 300);
        glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA | GLUT_DEPTH);
    
        glutCreateWindow("Window Title");
        glutDisplayFunc(disp);
        glutTimerFunc(100, timer, 0);
    
        glEnable(GL_TEXTURE_2D);
        glGenTextures(1, &texName);
        glBindTexture(GL_TEXTURE_2D, texName);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    
        glTexImage2D(
            GL_TEXTURE_2D, 0, 3, TEXSIZE, TEXSIZE,
            0, GL_RGB, GL_UNSIGNED_BYTE, bits
            );
    
        glutMainLoop();
        return 0;
    }

     

     

     

    ngPlantで木を作る (4) (Blenderでレンダリング)

    ngPlantで木を作り、それをBlenderでレンダリングする。

    ngPlantで貼り付けたテクスチャがそのまま持って行けるので、少し設定をいじるだけで簡単にレンダリングできる。

    まずngPlant側で木を作る。 76_toBlender_create

    [File]-

    [Export to]-

    [Alias-Wavefront
    (.OJB)]

    77_toBlender_export
    Parametersウィンドウが出る。
    Scale to heightは、
    大きいとBlender側で巨大に
    なってしまうので、
    1などにしておいた方が無難
    78_toBlender_parameters
    フォルダ選択ウィンドウで
    保存したいフォルダを指定。
    次に右図のウィンドウが出る。
    ファイル名を入力してOK
    79_toBlender_choosename

    Blenderへ行き、
    [Files]-[Import]
    -[Wavefront(.obj)]
    を選択

    80_toBlender_import
    読み込んだ直後。
    見えないがテクスチャも
    ちゃんと貼り付けられている。
    81_toBlender_view1
    葉を選択し、
    マテリアルへ行き、
    ・SpecularのIntensityを0に
    ・Transparencyをチェックし
    ・Alpha,Specularを0に
    設定する
    82_toBlender_alpha1
    テクスチャへ行き、
    ・Influenceにチェックを入れる
    ・ついでにInterpolationの
    チェックを外す
    設定する。

    Interpolationのチェックを
    外すと、テクスチャのぼけが
    少しだけ改善する

    83_toBlender_alpha2

    光源等々設定し、レンダリングする。

    84_toBlender_result

     

     

     

     

     

     

     

     

    石割桜

    KONICA MINOLTA DIGITAL CAMERA

     

    2015/04/19 岩手県盛岡市 石割桜。

    見る機会は10回以上あったきがするが、ちょうどいい満開に遭遇したのはこれが初めてかもしれない。

    花自体はとても見事に咲いているのだが、支えの棒がこうもたくさんあっては、老体を無理矢理酷使させられているように見えて哀れに思えてくる。いい加減休ませてやったらどうか。

     

     

    ngPlantで木を作る(3)

     

    ngPlantで木を作る作業の続きで、今日は枝に葉っぱをつける。

    葉はテクスチャでつけるので、まずは葉の画像を用意する。gimpなどで葉っぱっぽい何かを描いて、.tga .jpg .pngのいずれかの形式で保存する。別にペイントでもいいが、背景を透明にできないのでせめてアルファを使えるソフトがいい。

     

    早速やってみよう。

     

     

     

     

     

    ・・・できただろうか。

    leaf

     

     

    まずngPlantを起動し、葉っぱが生える枝を用意する。

    今回は説明のために主幹をそのまま使用。

    ① 葉っぱをつけたいBranchを右クリック→[append branch]→[New branch]で枝を追加する。
    74_leaf_addbranch

    ② 追加されたBranchを右クリック→[Stem model]→[Quad]を選択。
    75_leaf_quad

    ③ 見づらいので、まず[Stem]のLengthを大きくする。

    ④ このままWidthを大きくすると重なってしまうので、[Branching]へ行きLimit maxをOnし、Max. numberを3程度にする。これで枝から生えている葉っぱは三枚となる(はず)。

    ⑤ [Stem]に戻りWidthを大きくする。少し細長い四角形にする。

    ⑥ [Material]タブへ移動

    62_Branch3_Material

     

     

    Base color
    葉の色。テクスチャを使う場合は
    あまり関係がないが、そうでない場合は
    ここの色を緑色などにするだけでも
    葉ができてしまう。

    63_Material_BaseColor1

    Dif ... diffuse(拡散光)
    細かいことは気にせず、
    葉のテクスチャはここに設定する
    Nor ... Normal(法線)
    光が反射する時の計算に使う
    法線マップを設定する。なくてもいい
    Aux ... 不明

    このボタンは、③の?をクリックしたときに、
    Difを設定するか、Norを設定するか ...
    を指定するので、クリックしただけでは
    何も起こらない

    Texture
    テクスチャの設定ボタン兼プレビュー。
    大きな赤い?をクリックすると、
    ファイル読み込みダイアログが表示
    されるので、テクスチャファイルを
    読み込む。
    読み込んだ後小さな×印をクリック
    すると、テクスチャを解除できる
    右図は、
    左が自作した葉を設定した例
    右はngPlantが用意したfernleaf.tga
    を設定した例
    背景は黒く表示されているが、
    実際には透過色。

    65_Material_Texture1 66_Material_Texture2

    注意:テクスチャファイルは、
    [File]-[Preferences]の[Tex. locations]
    で設定したディレクトリ内のファイルしか
    扱えない

    double-sided
    ngPlantのデフォルトでは、
    ポリゴンの片面しか表示されない。
    (見る方向によって葉が消える)
    葉の時は大抵はこれでは困るので、
    チェックを入れてどちらから見ても
    葉が表示されるようにする。
    右図は左がチェックなし、
    右がチェックあり。
    67_Material_DoubleSide1 68_Material_DoubleSide2
    Transparent
    葉の透明色を反映させるかどうか。
    透明色を使用している場合、
    チェックを入れる
    右図は左がチェックなし
    右がチェックあり
    69_Material_Transparent1 70_Material_Transparent2
    Billboard mode
    葉をビルボード状態にする。
    Disabledでoff。
    Disabled以外では、
    どの方角から見ても
    面が正面を向いている状態を保つ
    右図は左がDisabled
    中央がSpherical
    右がCylindrical
    71_Material_Billboard1 72_Material_Billboard2 73_Material_Billboard3

    Control enabled
    調査中

     
    Fade-in
    調査中
     
    Fade-out
    調査中
     

     

     

     

    手品のタネ的な何か(C++)

    解説:

    ① Sampleはメンバ変数A,Bを持つ
    ② SampleのインスタンスはA=1,B=2で初期化される
    ③ showA,showBはA,Bを画面に表示する
    ④ A,Bはprivateで、setもfriend関数も用意していない。従ってA,Bを書き換える方法は存在しない

     

    class Sample{
    int A;
    int B;
    public:
    	Sample(){
    		A=1;
    		B=2;
    }
    void showA(){	std::cout << "A = " << A << std::endl;	}
    void showB(){	std::cout << "B = " << B << std::endl;	}
    };
    int _tmain(int argc, _TCHAR* argv[])
    {
    	Sample instance;
    
    	instance.showA();
    	instance.showB();
    int k;
    	std::cin >> k;
    return 0;
    }
    

     

    はずなんだが、Sampleに一切手を加えないでA,Bを編集することができる。

     

    int _tmain(int argc, _TCHAR* argv[])
    {
    	Sample instance;
    int* magicA = (int*)(&instance);
    int* magicB = magicA + 1;
    *magicA = 10;
    *magicB = 20;
    	instance.showA();
    	instance.showB();
    int k;
    	std::cin >> k;
    return 0;
    }
    

    意図してこれをやる人間はそうそういないと思うが、間違ってこうなっしまうケースは結構頻繁にある。そして謎の理屈でポインタがだめなやつだという烙印を押されるのである。

     

     

     

    ngPlantで木を作る(2)

    というわけでngPlantの続き。主幹に枝を追加した後、枝振りを作っていく。

     26_Branch2_Branching

     

     

     ①

    Density
    枝が生える密度を指定。
    例えば、
    Dencityが大きいと、
    Length=15の幹から10本の枝、
    Dencityが小さいと、
    Length=15の幹から5本の枝、
    というように変化する。
    本数で指定したい場合は
    ③,④,⑤で設定する。

    右図はそれぞれDensity=
    0.3 , 1.0 , 2.5

     26_density_0.3 27_density_1.0  28_density_2.5  
     ②  Variation
    不明
     
     ③  Min.number
    枝の最小の本数。
    Densityが小さかったり、
    元の幹が短かったりすると、
    どう設定しても枝が表示されないことがある。
    ここで設定すると、必ずこの本数だけは
    枝が生成される
    右図はDensity=0.01における
    Min.Number=
    0 , 3 , 10
     29_min.number1_density0.01 30_min.number3_density0.01 31_min.number10_density0.01
     ④  Limit max
    ⑤Max.numberを有効にするかどうか。
    無効の場合Densityなどの設定によって
    枝がいくらでも増えるようになる。
    右図はMax.number=3でLimit maxを
    Off(左)及びOn(右)
    Offの状態では、Max.numberより多くの
    枝が生えてしまっている。
     32_Branch2_LmitmaxOff 33_Branch2_LmitmaxOn
     ⑤  Max.number
    幹の長さやDensityによっては、
    枝がもの凄く多くなることがある。
    この値を設定しておくと、最大でも
    この数しか枝が増えなくなる。
     ④ ↑ 参照
     ⑥  Multiplicity
    同じ場所から枝が指定した本数だけ生える。
    枝を各方向に伸ばす場合、
    大抵は沢山生やしてRevAngleで
    巻くように生やすが、それでは同じ場所から
    枝が出てこない。
    右図は左からそれぞれMultiplicity=
    1,3,7
     34_Branch2_Multiplicity1 35_Branch2_Multiplicity3 36_Branch2_Multiplicity7
     ⑦  Min. offset
    枝が生え始める、根元側の位置を指定。
    右図は左からMin.offset=
    0.00 , 0.50 , 0.90
     37_Branch2_minoffset000 38_Branch2_minoffset050  39_Branch2_minoffset090
     ⑧  Max offset
    枝が生え終わる、先端側の位置を指定。
    右図は左からMax.offset=
    1.00 , 0.50 , 0.10
     40_Branch2_maxoffset100 41_Branch2_maxoffset050 42_Branch2_maxoffset010
     ⑨

     Start RevAngle
    RevAngleを指定するときの初期位置。
    RevAngleは一番下(地面側)の枝から
    何度回転という計算をするので、
    一番下の枝が幹のどの方向に
    ついているのかを決定する。

    いわゆる「正面」が変わる。

     43_Branch2_Start_RevAngle_044_Branch2_Start_RevAngle_45

    45_Branch2_Start_RevAngle_0_top46_Branch2_Start_RevAngle_45_top   

     ⑩  RevAngle
    枝が生える方向を角度で指定。
    特にこだわりがなければ137.5度(黄金角)
    にしておくと自然に見える。
    右図はRevAngleを137度にした例。
    ngPlantのRevAngleは小数点以下を
    指定できない点に注意。
     47_Branch2_RevAngle_137 48_Branch2_RevAngle_137_top
     ⑪  Variation
    (予測)RevAngleが機械的すぎるので、
    枝が生える方向にばらつきを持たせる(?)
    右図は
    Variation=0.0(左)と
    Variation=0.9(右)
     49_Branch2_Variation_0.0 50_Branch2_Variation_0.9
     ⑫  RotAngle
    枝そのものが回転する。
    枝に対してStemのAxis variationなどを
    指定しているとわかりやすい。
     51_Branch2_RotAngle_0 52_Branch2_RotAngle_15 53_Branch2_RotAngle_45 54_Branch2_RotAngle_200
     ⑬  Declination
    枝が生える上下方向の角度を指定。
    左右の赤点を上下に動かして指定する。

    55_Branch2_Declination_156_Branch2_Declination_258_Branch2_Declination_4

    57_Branch2_Declination_359_Branch2_Declination_560_Branch2_Declination_6

     Variation
    枝が上に伸びるか、下に伸びるかに
    ばらつきを持たせる
    右図は
    Variation=0.0(左)
    Variation=0.5(右)
     61_Branch2_Variation_0.0 61_Branch2_Variation_0.5

     

     

     

    ngPlantで木を作る(1)

    で、ngPlantは、木をポリゴンで作成するツールだ。

    1_first_status

    初期状態の画面はこうなっている。左側がビューで、円筒がこれから作成する木のべーすとなる。

    この画面での右側の上の方は使わない。

    重要なのは、右下の、図の赤枠で囲った部分。ここから、どの幹や枝を編集対象にするかを選択する。

    まず、最初は[Plant]が選択されているので、[Branch-1]をクリックし選択する。選択された枝は太文字になる。

    2_Branch-1_selected     3_Branch_Edit_number

    枝が選択されると、右上の画面がその枝の編集画面に変わる。ここからその枝の調整をしていく。

    ちなみに以下、サムネイル画像を貼り付けたところ本来の画像から上下が切れてしまった。クリックするとフルで見られる。意外と上下を見ないと理解できない画像があったりする。遠い未来に直すかもしれない。

    Length: 幹・枝の長さを調節。
    数字が大きくなるほど高く(長く)なる

    図は
    左がLength=15 ,
    右がLength=30

    4_Branch1_Length15 5_Branch1_Length30

    Variation:

    今、枝(幹)が一本しかない。
    こういうときは意味をなさないので
    後回しにする。

     

    Offset influence:

    これも一本しかないときは
    意味がないので後回し。

     

    Resolution:
    枝の長さ方向の分割数を指定。
    Altキーを押すと、ビューにポリゴン
    (三角形)を示す線が現れる。
    これで分割状態が変化することが
    確認できる。
    右図では左から20,5,1。
    枝が曲がる関節となるので、
    この値が小さいと思った形に
    ならないことがある

    8_Branch1_Resolution20 6_Branch1_Resolution5 7_Branch1_Resolution1

    Axis variation:

    枝をぐねぐね曲げる。
    (他に良い表現が思いつかない)。
    Resolutionが1だと変化がないので
    注意。
    右図はResolution=10で
    Axis variation=0.40のとき。

    10_Branch1_AxVar_R10A040_ue 9_Branch1_AxVar_R10A040_yoko

    Radius:枝の太さを指定。
    数字が大きくなるほど太くなる。

    右図はRadius=4とRadius=1

    12_Branch1_Radius4 11_Branch1_Radius1

    Profile:枝の太さの細かい指定

    右側の赤い点を小さくすると、
    頭頂部の径が小さくなる。
    左側の赤い点を小さくすると、
    根元が細くなる。
    右図
    右側の点を中間に置いた場合と、
    そこに点を一つ追加した場合。
    点の追加は線の上をクリックして行う

    14_Branch1_profile2 13_Branch1_profile1

    Resolution:枝の幅方向の分割数
    この値が小さいと角錐に近く、
    大きいと円錐に近くなる。
    小さい方がデータ量が小さくなる。

    右図はResolution=20及び8

     16_Branch1_Resolution20 15_Branch1_Resolution8
     Distribution
    枝を曲げる。あるいは垂れさせる。
    Axis variationと違って、一方向にしか曲がらない。
    右の赤い点を小さくすると頭頂部から垂れ、
    左の赤い点を小さくすると根本から垂れる。
    右図はLength=30で、各点を指定した場合。
    この曲がり具合もResolutionに依存するので注意。
     18_Branch1_Distribution2 19_Branch1_Distribution3 17_Branch1_Distribution1

     

    次に、枝を追加してみる。

     20_Branch1_next 21_Branch2_all

     [Branch-1]を右クリックし、[Append branch]→[New branch]を選択。

    くしのように新しい枝が生える。右下に表示されている新しい枝[Branch-1-1]が選択(強調表示)されていることを確認して、右上をもう一度見てみる。

    大体は同じで、違いは、主幹一本の時と違い、枝がたくさんあるときは各パラメータが影響を与えるのはその階層の枝全てだと言うこと。例えば、Axis Variationの数字をあげると、横に伸びている枝全てが複雑に折れ曲がる。

     22_Branch2_test

     

    Axis Variationは0にしておくとして、この状態で、先ほど飛ばしたVariationとOffset influenceについてみてみる。

    Variation
    枝が複数あるとき、長さにばらつきを与える
    23_Branch2_variation
    Offset influence
    枝が複数あるとき、長さを
    曲線的に変化させる
    24_Branch2_influence1 25_Branch2_influence2 

     

     

     

     

     

     

     

     

     

     

    std::removeの挙動

    俺がstd::removeを理解できないのはどう考えても仕様が悪い。

    というわけで、std::removeの挙動の再確認。

    std::removeは、第一引数から第二引数までのコンテナ内の、第三引数で指定された値を削除する(嘘)、STLの関数だ。

     

    今回使うのは以下。removeのためにalgorithm。iteratorはstd::beginを気分で使う。

    #include <vector>
    #include <iostream>
    #include <algorithm>
    #include <iterator>

     

     

     

    まず配列を用意して初期化する。

    std::vector<int> vec = { 1, 2, 3, 2 , 4, 2 , 5 };
    
    for (auto i = std::begin(vec); i != std::end(vec); i++){
    	std::cout << *i << std::endl;
    }

    結果は、

    1
    2
    3
    2
    4
    2
    5

     

     

     

     次に、この配列の値2に対してstd::removeをかける

    auto end = std::remove(std::begin(vec), std::end(vec), 2);
    
    for (auto i = std::begin(vec); i != std::end(vec); i++){
    	std::cout << *i << std::endl;
    }
    

     結果は、

    1
    3
    4
    5
    4
    2
    5

     

     

     

    さあ、もう訳がわからない。消えたはずの2は残っていてその割に個数は減っていてその上位置まで変わっていて、さらにいじったつもりのない4と5が増えている。

     

     

    Erase-Removeエディオムというのがあり、eraseと併用すれば消える。

    vec.erase(
    	std::remove(
    		std::begin(vec),
    		std::end(vec),
    		2
    	),
    	std::end(vec)
    );
    
    for (auto i = std::begin(vec); i != std::end(vec); i++){
    	std::cout << *i << std::endl;
    }

     

     

     

    これはつまりこういうことだ。

     

    std::removeは、指定した削除対象の値以外のものを配列の左側に再配置する。

    そして戻り値として、必要なデータが入っている領域の次の値へのイテレータを返す。

    std::removeが行うのはコンテナの中の値の書き換えだけなので、高速だが、そのままではいわば「破棄推奨領域」が生じてしまう

    (※) end2 = std::remove(begin,end,value);というようにして、以後の処理を begin~end2の範囲に対して行うようにすれば、消えたものとして処理できる。

    この破棄推奨領域を削除する行為は、確保されているメモリ領域の変更なのでstd::eraseを用いる必要がある。

    removeerase