Re: ボーンの位置座標取得
10件表示
すべてのコメント一覧へ
投稿ツリー
-
ボーンの位置座標取得 (sorabou, 2015/9/7 11:13)
-
Re: ボーンの位置座標取得 (完全無欠猫, 2015/9/7 12:43)
«
-
Re: ボーンの位置座標取得 (Shige, 2015/9/7 21:18)
-
Re: ボーンの位置座標取得 (完全無欠猫, 2015/9/8 10:44)
-
Re: ボーンの位置座標取得 (Shige, 2015/9/9 21:05)
- Re: ボーンの位置座標取得 (完全無欠猫, 2015/9/10 7:56)
-
Re: ボーンの位置座標取得 (Shige, 2015/9/9 21:05)
-
Re: ボーンの位置座標取得 (完全無欠猫, 2015/9/8 10:44)
-
Re: ボーンの位置座標取得 (sorabou, 2015/9/8 1:15)
-
Re: ボーンの位置座標取得 (完全無欠猫, 2015/9/8 10:40)
-
Re: ボーンの位置座標取得 (sorabou, 2015/9/8 15:25)
- Re: ボーンの位置座標取得 (完全無欠猫, 2015/9/8 17:29)
-
Re: ボーンの位置座標取得 (sorabou, 2015/9/8 15:25)
-
Re: ボーンの位置座標取得 (完全無欠猫, 2015/9/8 10:40)
-
Re: ボーンの位置座標取得 (Shige, 2015/9/7 21:18)
-
Re: ボーンの位置座標取得 (完全無欠猫, 2015/9/7 12:43)
«
完全無欠猫
居住地: 兵庫
投稿数: 750
3D座標がビュー内に投影された時の2D座標が知りたいということでしょうか・・・。
その前提で書いています。
以下はPose boneでの話です。
子Boneは親Boneの座標空間にあります。
従って親Boneを遡ってObject空間の座標を取得して、それをObjectのmatrix_worldでワールド座標に変換します。
この部分は知らなくても・・・と、いうかいろいろ考えすぎて分からなくなるかもしれないので・・・削除。
例えば、bone1>bone2>bone3という構造の場合(bone1が最初のboneでbone2はbone1の子供という図式です)
obj = bpy.data.objects['AAAAAA']
算出方法に誤りがあったので訂正。matrixは最終的なBoneのmatrixだったので・・・
bone1mat = obj.pose.bones['bone1'].matrix
bone2mat = obj.pose.bones['bone2'].matrix
bone3mat = obj.pose.bones['bone3'].matrix
bone3loc = obj.pose.bones['bone3'].location
Lbone3mat = bone3mat * bone2mat.transposed() * bone1mat.transposed()
worldBone3Loc = obj.matrix_world * Lbone3mat * bone3loc
正しくは、こうです。
bone3loc = obj.pose.bones['bone3'].head
worldBone3Loc = obj.matrix_world * bone3loc
これを該当ビュー内の2D座標に変換するにはbpy_extrasパッケージを使います。
bpy_extras.view3d_utils.location_3d_to_region_2d(region, rv3d, coord, default=None)という関数があります。
coordが上記で求めた3D座標です。
regionとrv3dは該当スクリーンから求めます。
これは各データのtypeを比較して取得した方がいいと思います。
scr = bpy.context.screen
scr.areas[5].typeが'VIEW3D'になります。
scr.areas[5].regions[4].typeが'WINDOW'になります。
scr.areas[5].spaces[0].typeが'VIEW_3D'になります。
ですので、ワールド座標のVector((0,0,0))を該当ビューで求める場合
ar = scr.areas[5]
rLoc = bpy_extras.view3d_utils.location_3d_to_region_2d(ar.regions[4], ar.spaces[0].region_3d, Vector((0,0,0)))
rLocが該当ビュー内の相対座標になるはずです。
しかし、確認していないので間違っているかもしれませんが・・・・。
== 追記 ==
あぁぁぁ・・・・カメラビューかなぁ・・。
カメラビューの場合はこっちの関数を・・・。
bpy_extras.object_utils.world_to_camera_view(scene, obj, coord)
objはCamera objectです。
== 追記の追記 ==
書かなくても分かるかな?と思ったので書かなかったのですが・・・初心者の方という事だったのでもう少し書きます。
scene = bpy.context.scene
camera = scene.camera
rLoc = bpy_extras.object_utils.world_to_camera_view(scene, camera, worldBone3Loc)
renderSetting = scene.render
imagePosX = renderSetting.resolution_x * rLoc.x
imagePosY = renderSetting.resolution_y * rLoc.y
imagePosX, imagePosYがレンダリングイメージ内の座標になると思います。
その前提で書いています。
以下はPose boneでの話です。
従って親Boneを遡ってObject空間の座標を取得して、それをObjectのmatrix_worldでワールド座標に変換します。
この部分は知らなくても・・・と、いうかいろいろ考えすぎて分からなくなるかもしれないので・・・削除。
例えば、bone1>bone2>bone3という構造の場合(bone1が最初のboneでbone2はbone1の子供という図式です)
obj = bpy.data.objects['AAAAAA']
算出方法に誤りがあったので訂正。matrixは最終的なBoneのmatrixだったので・・・
bone2mat = obj.pose.bones['bone2'].matrix
bone3mat = obj.pose.bones['bone3'].matrix
bone3loc = obj.pose.bones['bone3'].location
Lbone3mat = bone3mat * bone2mat.transposed() * bone1mat.transposed()
worldBone3Loc = obj.matrix_world * Lbone3mat * bone3loc
正しくは、こうです。
bone3loc = obj.pose.bones['bone3'].head
worldBone3Loc = obj.matrix_world * bone3loc
これを該当ビュー内の2D座標に変換するにはbpy_extrasパッケージを使います。
bpy_extras.view3d_utils.location_3d_to_region_2d(region, rv3d, coord, default=None)という関数があります。
coordが上記で求めた3D座標です。
regionとrv3dは該当スクリーンから求めます。
これは各データのtypeを比較して取得した方がいいと思います。
scr = bpy.context.screen
scr.areas[5].typeが'VIEW3D'になります。
scr.areas[5].regions[4].typeが'WINDOW'になります。
scr.areas[5].spaces[0].typeが'VIEW_3D'になります。
ですので、ワールド座標のVector((0,0,0))を該当ビューで求める場合
ar = scr.areas[5]
rLoc = bpy_extras.view3d_utils.location_3d_to_region_2d(ar.regions[4], ar.spaces[0].region_3d, Vector((0,0,0)))
rLocが該当ビュー内の相対座標になるはずです。
しかし、確認していないので間違っているかもしれませんが・・・・。
== 追記 ==
あぁぁぁ・・・・カメラビューかなぁ・・。
カメラビューの場合はこっちの関数を・・・。
bpy_extras.object_utils.world_to_camera_view(scene, obj, coord)
objはCamera objectです。
== 追記の追記 ==
書かなくても分かるかな?と思ったので書かなかったのですが・・・初心者の方という事だったのでもう少し書きます。
scene = bpy.context.scene
camera = scene.camera
rLoc = bpy_extras.object_utils.world_to_camera_view(scene, camera, worldBone3Loc)
renderSetting = scene.render
imagePosX = renderSetting.resolution_x * rLoc.x
imagePosY = renderSetting.resolution_y * rLoc.y
imagePosX, imagePosYがレンダリングイメージ内の座標になると思います。
投票数:8
平均点:6.25
ログイン
クイックリンク
2021/07/01版
●Blender.org
BlenderFoundation
- Blenderのダウンロード
- 公式チュート等
- 公式マニュアル(和訳)
●ニュース(英文)
BlenderNation
●Blenderコミュニティ
blenderartists.org
●Blender Q&A
- Blender Stack Exchange
●テストビルド
Buildbot(自動生成)
●開発関連
公式開発サイト
Blender開発blog
Blender Wiki
●Blender.org
BlenderFoundation
- Blenderのダウンロード
- 公式チュート等
- 公式マニュアル(和訳)
●ニュース(英文)
BlenderNation
●Blenderコミュニティ
blenderartists.org
●Blender Q&A
- Blender Stack Exchange
●テストビルド
Buildbot(自動生成)
●開発関連
公式開発サイト
Blender開発blog
Blender Wiki