2019年12月22日日曜日

Blenderでオブジェクト原点はあまり変更しない方がいいかも?という話

Blenderには移動や回転の基準になる「ピボットポイント」を指定する機能がいくつか用意されています

そんな中でオブジェクトの回転操作をするのに
オブジェクトの原点を移動させてピボットポイントとして利用する話を見かけたので
「それはマズい操作なんじゃないのかな?」と思い、検証をしてみました

先にBlenderのオブジェクトとデータ(ジオメトリ)の関係を説明しておきます
Blenderのオブジェクトはメッシュのデータを収める透明な器のようなもので
オブジェクトモードでの移動は”器”の移動のデータが変化するだけで
中身のデータは変化しません。

中身であるジオメトリは オブジェクトの原点の位置からどれくらいの距離にあるか?という情報で決まっています。

では、 原点を移動させる操作はどういうことなのでしょうか?
実はオブジェクトモードでのオレンジの点が移動すると同時に
中のデータの位置にも逆方向に移動する操作が加わっているのです。

平行移動する程度では値は変化しませんが
オブジェクトに回転が加わっていたりすると計算の誤差が重なって値が変わってくることが想像できます

検証にオブジェクトの原点を-100mから100mの範囲でランダムに移動させて最初の位置に戻すスクリプトを作って値を見てみました

import bpy
import random
cursor = bpy.context.scene.cursor
obj = bpy.context.active_object
print()
print(obj.data.vertices[10].co)
for i in range(1000):
    cursor.location = (random.uniform(-100,100),random.uniform(-100,100),random.uniform(-100,100))
    bpy.ops.object.origin_set(type='ORIGIN_CURSOR', center='MEDIAN')

cursor.location = (0,0,0)
bpy.ops.object.origin_set(type='ORIGIN_CURSOR', center='MEDIAN')
print(obj.data.vertices[10].co)

これを傾きをかけたオブジェクトに実行すると座標に誤差が出ていました
緑の文字が特定の頂点の座標で
上の2行が2000回 下2行が1000回移動されてた時の前後になります
1000回で 0.1mmの単位なので問題にする必要がない といえばないのですが
意図しない値になることはあるので 注意が必要ですね。

オブジェクトを任意の位置で移動回転拡縮操作をしたい時には3Dカーソルをピボットポイントとして使った方が無難です。

1 件のコメント:

  1. 見ていらっしゃるかわかりませんがこちらで失礼します。
    以下のアドオンを購入し2.7の頃使っていましたが2.9では動作しないようです。
    対応の予定はありますでしょうか?

    Blender_LWS_Exporter【雪待夜】をダウンロード - メロンブックス DL
    https://www.melonbooks.com/index.php?main_page=product_info&products_id=IT0000189689

    返信削除