ChatGPT 感動するけど解決しない
最近、ChatGPT が話題になっている(もう最近でもないか)遅ればせながら、後期高齢者の小生もやってみることにしたww昨日の cv2.VideoCapture(filename) の件を質問してみたところ、見事な解答が返ってきた(昨日書いた内容とほぼ同じ)これはすごいなということで、懸案の質問をしてみた以前イワシの群れを blender でシミュレーションしたときに、イワシの向きを自由に回転させても必ず背びれを上に向ける方法が分からなかったそれについて下のように質問してみた【質問】blender で3つの頂点a,b,cを持つオブジェクトを想定する今頂点aを固定して頂点bを自由に動かすスクリプトをpythonで書いたこのとき頂点cを必ずz軸方向に向けるための方法は?【回答】以下は、BlenderのPython APIを使用して頂点bを自由に移動し、同時に頂点cをz軸方向に向ける方法の例です。import bpyimport mathutils# オブジェクトを取得obj = bpy.context.object# 頂点座標を取得verts = obj.data.vertices# 頂点aのインデックスを取得a_idx = 0# 頂点bのインデックスを取得b_idx = 1# 頂点cのインデックスを取得c_idx = 2# 頂点aの座標を取得a_pos = obj.matrix_world @ verts[a_idx].co# 頂点bの座標を取得b_pos = obj.matrix_world @ verts[b_idx].co# 頂点cの座標を取得c_pos = obj.matrix_world @ verts[c_idx].co# 頂点bを自由に移動b_pos += mathutils.Vector((0.1, 0.2, 0.3))# 頂点bの座標を設定verts[b_idx].co = obj.matrix_world.inverted() @ b_pos# 頂点cをz軸方向に向けるc_dir = mathutils.Vector((0, 0, 1))c_local_dir = obj.matrix_world.inverted().to_3x3() @ c_dirc_normal = (b_pos - a_pos).cross(c_local_dir).normalized()verts[c_idx].normal = c_normalこの例では、obj変数でオブジェクトを取得し、頂点の座標をverts変数で取得しています。a_idx、b_idx、c_idx変数を使用して、各頂点のインデックスを取得し、a_pos、b_pos、c_pos変数を使用して各頂点の座標を計算します。次に、頂点bを自由に移動させ、verts[b_idx].coを更新します。最後に、頂点cをz軸方向に向けるために、頂点aから頂点bに向かう方向とz軸方向の外積を計算し、正規化したベクトルを頂点cの法線ベクトルに設定します。c_local_dirは、グローバル座標系でのz軸方向をオブジェクトのローカル座標系に変換したものです。@演算子は、ベクトルの座標系を変換するために使用されます。-------------------------------------------------------移動というところは質問が悪かった実際は回転だったよな bpy.ops.tranceform.rotate(value=0.1, orient_axis='X')とか?(ま、テストなので)なるほど、と思ったけど・・やってみると最後の行で verts.normal は readonlyだよというエラーが返ってきた感動するとともに、勉強の必要性を感じる質問を上手くやらないと、良い回答は得られない