1

次のスクリプトがあります。

import bpy
import os

print("Starter")

selection = bpy.context.selected_objects

for obj in selection:

    print("Obj selected")

    me = obj.data

    for edge in me.edges:

        vert1 = me.vertices[edge.vertices[0]]
       vert2 = me.vertices[edge.vertices[1]]
       print("<boundingLine p1=\"{0}f,0.0f,{1}f,1.0f\" p2=\"{2}f,0.0f,{3}f,1.0f\" />".format(vert1.co.x, vert1.co.y, vert2.co.x, vert2.co.y))       

かなり基本的ですよね?すべてのエッジをコンソールに出力するだけで、コピーして xml ドキュメントに貼り付けることができます。オブジェクトをスケーリングし、オブジェクトでこのスクリプトを実行すると、スケーリングされる前に、コンソールに出力されたオブジェクトの古いスケーリングされていない値が取得されます。オブジェクトのすべての頂点をすべての軸で移動しようとしました。その結果、出力される値はスケールアウトされ、動きに応じて変換されます。

n を押して頂点のグローバル値を確認すると、適切にスケーリングされます。

正しい値が得られないのはなぜですか?!?

このスクリプトは時間を節約するはずでしたが、Blender で何かを動作させるのは雑用です! 彼らがAPIを更新したばかりであることは役に立たないので、そこにあるすべてのサンプルコードは古くなっています!

4

3 に答える 3

2

Blender でオブジェクトをスケーリング、平行移動、回転、またはその他の方法で変換を実行すると、その変換は何らかの形で「保存」されます。必要な作業 変換を適用したオブジェクトを選択し、ショートカット CTRL + A を使用して、変換を適用します。

...

したがって、blender api を介してアクセスできる内部データと実際に表示される値の間に不測の事態が発生することはありませんでした (私はこの言葉を正しく使用していますか? 定義を確認したところ、正しいようです)。

このデザインは理にかなっていると確信していますが、今、私はそれを思いついた男の喉を殴りたいと思っています. 何かをスケーリングする場合、スケーリングされたものをスケーリングするつもりです。

とにかく、奇妙な値が得られたのは、オブジェクトモードでスケーリングしたオブジェクトを選択した後、CTRL + A で行うスケーリングが適用されなかったためです。

于 2012-10-01T07:46:51.010 に答える
0

私は実際には Blender のユーザーではありませんが (Maya のユーザーです)、別の方法を試すことができると思います (もっと遅いと思います...)。頂点位置に移動し、その x、y、z 座標を取得します。私はマヤと作品でそれをやった。

次のように言いましょう。

data_list = []

selection = #selection code here#

for v in selection:

    loc = locator()
    pointconstraint(v, loc)
    data_list.append(loc.translation_attributes)
于 2012-09-30T21:58:37.057 に答える
0

メッシュ オブジェクトには、頂点の内部座標系と、オブジェクト全体に適用されるグローバルな移動、スケーリング、および回転変換があります。次のように、グローバル スケーリング マトリックスをメッシュ データに適用し、頂点座標をグローバル座標系に変換できます。

bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.transform_apply(scale=True)
bpy.ops.object.select_all(action='DESELECT')

transform_apply()回転行列と平行移動行列を適用できるようにするその他のオプション。

于 2015-02-09T22:59:30.423 に答える