新しいプロジェクトの作成→『 空のプロジェクト 』でプロジェクトを作った後、WinMain関数をエントリポイントにコンパイルしようとすると、mainが見つからないというエラーになる。
MSVCRTD.lib(exe_main.obj) : error LNK2019: 未解決の外部シンボル _main が関数 "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ) で参照されました。
構成プロパティ→リンカー→システム→サブシステム→
に設定
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頂点の矢印が新規オブジェクトとして生成される
avec = get_coord_as_global(obj,1) - get_coord_as_global(obj,0) aveclen = avec.length avec.normalize()
※get_coord_as_globalは自作関数
zvec = Vector([ 0.0 , 0.0 , 1.0]) zvec.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))
※rotate_objectは自作関数
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())
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))
同じ結果が出力できた
とても単純だけれど形状が面白いので紹介。
Extra Object add-onを有効にする
[Shift+A]→[Mesh]→[Single Vert]→Add Single Vertを追加し、
[E][G]で押し出しながら木の形を作る
Skinモディファイアを適用する
[Shift+A]→[Mesh]→UV Sphereで球を追加し、[Ctrl+J]で全て一つのオブジェクトにする
葉と幹にMaterialを追加し、それぞれ色を設定する
葉にDisplaceモディファイアを追加し、Cloudsテクスチャを割り当てる
Remeshモディファイアを追加し、ModeをBlockにする
結果
RemeshのOctree Depthを変更するとブロックの細かさが変わる
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にし、以下のように設定。
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]を押して、上から花びらの幅を調整する
根元を調整し、茎に接続できるまで縮小する
1.Cubeを削除する
2.[7]キーでTopからのビューに変更する
3.Grease Pencilを使用し、バラの花びらの曲線を描く
4.Convert to Geometry → Polygon Curve でカーブに変換する
変換したのち、Pencilのレイヤーを不可視にし、Curveだけが見えるようにする
5.Simplify Curvesアドオンを使用し、Distance Error=0.015を設定する
※Simplify Curvesが見つからない場合はアドオンを有効にする
6.[Object]→[Convert to]→[Mesh from Curve]でカーブをエッジオブジェクトに変更する
7.Editモード、Edge選択モードで不要な連結を削除する
時々使うと忘れるので。
#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の内容から重複を削除するには、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; }
下記ブログから。詳細・注意点などは転載元を確認
C++ std::vector同士の連結方法
https://qiita.com/D-3/items/b19b7acb439ed0e3deee
#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; } }
#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; } }