2023年6月6日火曜日

2023年5月ブログ活動のふりかえり

 May 2023 blog activity retrospective


I looked back on the May 2023 activities of the blog “Walking in the Hanami River Basin”.

May 2023 was a landmark month for the following two points.

・By using ChatGPT-linked Python, troublesome work begins to be streamlined

・Browse the original materials of the Ariyoshi Kita Shell Mound and restore the 3D coordinates of the relics.


ブログ「花見川流域を歩く」の2023年5月活動をふりかえりました。

2023年5月は次の2点で画期的な月となりました。

・ChatGPT連携Pythonにより、面倒な作業の効率化が始まる

・有吉北貝塚の原資料を閲覧して、遺物3D座標を復元する

1 ブログ「花見川流域を歩く」

・2023年5月の記事数は14です。

・ChatGPTと連携してPythonスクリプトを作成し、趣味活動における面倒な作業を効率化する活動が定型化しました。

・有吉北貝塚北斜面貝層の遺物分布図と遺物台帳を閲覧し、それらから遺物3D座標を得る方法、手順を確認することができました。

2 ブログ「花見川流域を歩く 自然・風景編」

・早朝散歩記事を4編書きました。

3 2023年5月活動の特徴

・Pythonスクリプトを自力で記述する実力は自分はほとんど無いのですが、ChatGPTに質問すれば適切な回答を教えてくれます。自分が得たい機能をPythonスクリプトで得られるようになり、趣味学習活動における「革命」が始まったような感覚を覚えます。

・有吉北貝塚北斜面貝層の遺物分布図と遺物台帳は精細な3D座標の測量成果簿であるといえます。この資料から全ての遺物について3D座標を復元出来ます。遺物3D座標復元が進めば、北斜面貝層の可視化が進み、貝層発達史・貝層利用史の検討が進むと考えられます。

4 2023年6月趣味学習活動の展望

・ChatGPT連携Pythonスクリプト活用による趣味活動の効率化・精度向上に貪欲に取り組むことにします。趣味活動歴10数年ではじめて遭遇した本格的技術革新の流れです。

・有吉北貝塚北斜面貝層学習のBlenderファイルに関連する各種操作をPythonスクリプトで記述して、作業の効率化・正確化だけでなく、情報管理の体系化・簡素化にも資することにします。

・有吉北貝塚北斜面貝層における早期土器・前期土器3D分布の特徴検討や加曽利EⅡ式土器新分類による3D分布図作成などに取り組みます。

参考

ブログ「花見川流域を歩く」2023年5月記事 〇は特に閲覧の多いもの

ブログ「花見川流域を歩く 自然・風景編」2023年5月記事


2023年5月にブログ「花見川流域を歩く」投稿記事に掲載された全画像


2023年6月4日日曜日

Blenderでメッシュ平面図を表現するPythonスクリプト

 Python script to represent mesh floor plan in Blender


When examining the 3D distribution of archaeological artifacts in Blender, it becomes necessary to create a related 2D distribution map (mesh diagram). So I made a Python script to express the mesh plan in Blender with the help of ChatGPT. Convenient.


Blenderで考古遺物の3D分布を検討する際に、関連して2D分布図(メッシュ図)を作成する必要が生まれます。そこでBlenderでメッシュ平面図を表現するPythonスクリプトをChatGPTの助けを借りて作りました。便利です。

1 2D分布図(メッシュ図)をBlenderで作成する必要性

有吉北貝塚北斜面貝層では全ての遺物についてそれが出土した2m×2mメッシュ番号が記録されていて、土器以外の遺物はすべて出土メッシュ番号が発掘調査報告書に記載されています。従って出土遺物のメッシュ別分布図を作成することができます。これまでの作業では遺物のメッシュ別分布図はデータをExcelで集計してQGISで表現してきています。


QGISで表現したメッシュ別分布図を使った資料

しかし、3D分布検討はBlenderで行い、2D分布検討はQGISで行うという作業は複雑であり好ましくありません。全遺物の3D分布検討を視野にいれたとき、ぜひとも2D分布図(メッシュ図)もBlenderで作成し、3D分布検討と2D分布検討を同じBlenderで行うことが大切になります。

2 2D分布図(メッシュ図)をBlenderで作成するPythonスクリプト

2-1 ChatGPTに質問

ChatGPTに次の質問をしました。

……………………………………………………………………

次の操作を行うBlenderPythonスクリプトを教えてください。

1 Blenderで既に選択してあるメッシュオブジェクトが1つあります。

2 そのメッシュオブジェクトを最初に多数コピーして、それを別の座標に次々に配置します。

メッシュオブジェクトを配置したい座標は、テキストファイル'C:/tmp/XYZData.txt'に(任意記号,x,y,z)の順番で書かれています。

3 アウトライナーのシーンコレクションに新しいコレクションを作成します。

4 新しく作成したコレクションに、先ほど座標に配置した多数メッシュオブジェクトを格納します。

……………………………………………………………………

2-1 ChatGPTからの回答

ChatGPTから次の回答をもらいました。

……………………………………………………………………

import bpy

# テキストファイルのパス

filepath = 'C:/tmp/XYZData.txt'

# メッシュオブジェクトの名前

object_name = bpy.context.active_object.name

# テキストファイルを読み込む

with open(filepath, 'r') as file:

    lines = file.readlines()

# アクティブなシーンを取得する

scene = bpy.context.scene

# 新しいコレクションを作成する

new_collection = bpy.data.collections.new('NewCollection')

scene.collection.children.link(new_collection)

# 行ごとに処理

for line in lines:

    # カンマで分割してデータを取得

    data = line.strip().split(',')

    symbol, x, y, z = data[0], float(data[1]), float(data[2]), float(data[3])

   # メッシュオブジェクトをコピーする

    bpy.ops.object.select_all(action='DESELECT')

    bpy.data.objects[object_name].select_set(True)

    bpy.context.view_layer.objects.active = bpy.data.objects[object_name]

    bpy.ops.object.duplicate(linked=False)

    new_object = bpy.context.active_object

   # コピーしたオブジェクトの座標を設定する

    new_object.location = (x, y, z)

    # コピーしたオブジェクトを新しいコレクションに追加する

    new_collection.objects.link(new_object)

    # オブジェクトの名前を設定する

    new_object.name = symbol

……………………………………………………………………

このスクリプトでは、指定されたテキストファイルのパスをfilepath変数に、Blenderのアクティブなオブジェクトの名前をobject_name変数に指定してください。

スクリプトを実行すると、指定されたテキストファイルから座標データを読み取り、メッシュオブジェクトをコピーして指定された座標に配置します。コピーされたオブジェクトの名前は、テキストファイルの記号と対応付けられます。

また、スクリプトでは新しいコレクションを作成し、コピーしたオブジェクトをそのコレクションに格納します。新しいコレクションの名前は"NewCollection"ですが、必要に応じて変更してください。

同様に、このスクリプトもBlender内で実行する必要があります。BlenderのPythonスクリプトエディタやPythonコンソールなどから実行してください。また、スクリプトを実行する前に、Blender内でメッシュオブジェクトを選択しておく必要があります。

……………………………………………………………………


ChatGPTの回答

2-3 ChatGPT回答のPythonスクリプトの結果

次のようなメッシュ番号と3D座標位置を書いたテキストを用意しました。


用意した座標テキスト

次に、2m×2mメッシュの大きさの平面メッシュオブジェクト(マテリアルは青色)を事前にBlender画面内に作成して選択しました。

次にChatGPT教授のPythonスクリプトをScripting画面に貼り付けて走らせました。

その結果所定のメッシュに青色平面が貼り付きました。この例は前期土器出土メッシュ分布図です。


作成された2D分布図(メッシュ図)


作成された2D分布図(メッシュ図)斜め表示

Blenderのアウトライナーを見ると、新たに配置された平面メッシュオブジェクトにメッシュ番号が付き、それらが新コレクションに格納されています。


アウトライナーの様子

自分が望んだPythonスクリプトを入手することができました。

3 今後の展開

このPythonスクリプトでは平面メッシュだけでなく、厚さのある立方体オブジェクトや枠型形状オブジェクトでも同じ操作が出来ました。(土器や遺物そのもののオブジェクトでも出来ると思います。)

このPythonスクリプトを工夫すればメッシュ別に数量を立方体の高さで表現することも可能になります。つぎのようなメッシュ別数量の立体表現もPythonスクリプトで時間をかけないで作成するところまで射程に入りました。


過去に手作業で作成したメッシュ別数量の立体表現

Blenderで3D分布分析、2D分布分析を統合的に行うための大きな基礎が出来ました。もうQGISの助けを借りる必要はありません。

4 感想

4-1 感想 1

Pythonスクリプト作成で、ChatGPTに質問して適切な回答を得るコツが少し判ってきたような気がします。自分はそのスクリプトを書けないけれども、論理的な展開はこれこれだと判った上でそれを丁寧に説明すれば、正解を得られる確率が高まるようです。

4-2 感想 2

ChatGPTから自分ができない(判らない)ことを即座に教えてもらって、大いに助かっているのですが、そのChatGPTは無料で、24時間営業であることに一抹で虚弱な違和感・不安定感を感じます。そしてなによりもChatGPTに気遣いする必要がないことに不思議と戸惑いを感じます。通常、先生・指導者とか同僚・友人知人に物事を教えてもらうときは、教えてもらったことが役立っても役立たなくても何らかのお礼を、少なくても言葉レベルでは、します。

4-3 感想 3

人から何かを教えてもらうときは、「こんなレベルの低いことを教わるのは恥ずかしい」とか「自分が調べもしないで、相手に教わるのは相手に失礼だ」とか、自分と相手の人間関係に起因する様々な感情が自分に生起します。だれでもそうした感情をどれだけ意識するかは別にして必ず持ちます。そうした感情がChatGPT利用時にふと脳裏をよぎりました。それがお門違いであることはよくわかります。ChatGPTと自分との感情的関係が自分にはまだ整理されていません。


2023年6月1日木曜日

1986年発掘調査原簿を閲覧して出土遺物の3D空間座標を復元する

 Reconstructing the 3D spatial coordinates of excavated artifacts by browsing the original records created during the excavation in 1986


The 3D spatial coordinates of excavated artifacts (early stage pottery) were reconstructed by browsing the artifact distribution map and artifact inventory of the northern slope shell layer of the Ariyoshi Kita Shell Mound (1986 excavation survey). This method enables 3D spatial analysis of artifacts.


有吉北貝塚北斜面貝層(1986年発掘調査)の遺物分布図と遺物台帳を閲覧して、出土遺物(前期土器)の3D空間座標を復元しました。この方法により遺物3D空間分析が可能になります。

1 問題意識

有吉北貝塚発掘調査報告書には中期土器の3D空間座標を復元できるグラフが掲載されています。そのグラフから中期土器の3D空間座標を復元して、3D空間において貝層断面との関係など3D空間分析を行いました。その結果、きわめて有用な情報を得ています。

一方中期土器以外の土器や、土器以外の遺物について、発掘調査報告書では3D空間座標がわかる資料は掲載されていません。しかし、発掘調査報告書原簿(遺物分布図、遺物台帳)を閲覧すれば中期土器以外の土器・遺物について3D空間座標が判ることを知りました。中期土器以外の土器・遺物について3D空間座標が判れば、その3D空間分析により北斜面貝層に関する有用情報が飛躍的に増え、貝塚の発達や利用について新しい考え方や仮説が生まれる可能性もあり得ます。

そこで、今回早期土器(全4点)・前期土器(全24点)を事例として、遺物分布図と遺物台帳を閲覧して、3D空間座標を取得する方法、手順、課題などを確認するテスト作業を実施しました。

2 遺物分布図と遺物台帳の閲覧

北斜面貝層出土の早期土器(全4点)、前期土器(全24点)について、関連する遺物分布図と遺物台帳の閲覧を千葉県教育委員会に申請し、許可を得て、2023年5月29日に閲覧しました。


遺物分布図・遺物台帳閲覧対象土器リスト

閲覧では持参したA3スキャナー・パソコンにより関連紙資料をスキャンしました。


持参したフラットベッド式A3スキャナー(サンワサプライ、PSC-12UF)

遺物分布図は600dpiで、遺物台帳は300dpiでスキャンすることにより十分な解像画像を得ることができました。

遺物分布図はB3紙資料で、スキャンが必要な実測図部分はA3画角に入りますが実測図外に注記があるものもあるため、それらを全部スキャンするために2回スキャンしました。またスキャン毎に画像を確認して画像が求める状況になっているかチェックしました。

3 3D空間座標復元の方法


3D空間座標復元の様子(Ⅲ-75メッシュ出土遺物番号33の前期土器の例)

北斜面貝層から出土した中期土器以外の土器及び土器以外の遺物はすべて出土メッシュと遺物番号が紐づけられています。

Ⅲ-75メッシュ出土遺物番号33の前期土器の場合、Ⅲ-75メッシュ遺物分布図(現場で記録された1/10実測図)から記号33を探し、その場所の座標を読み取ります。座標の読み取りはパソコンの中で、自作Pythonスクリプトで遺物分布図画像(pngファイル)を3点クリックして行います。こうして読み取ったメッシュ内位置座標とメッシュ位置座標からBlender3D空間におけるx,y座標を求めることができます。

遺物台帳には掲載遺物の標高が原則として全て掲載されています。この標高数値からBlender3D空間におけるz座標を求めることができます。

結果として遺物分布図及び遺物台帳からBlender3D空間座標(x,y,z)を求めることが出来ます。


Ⅲ-75メッシュ出土遺物番号33の前期土器をBlender3D空間にプロットした様子

4 メモ

4-1 A3スキャナー持参により遺物分布図・遺物台帳から情報を汲み取ることができることの確認

A3スキャナーとパソコンを持参することにより、閲覧申請した遺物分布図・遺物台帳から3D空間座標に関する情報を確実に汲み取ることができることを確かめ、確認できたことはよかったことです。今後の活動の展望が開けました。

4-2 メッシュ内位置座標読み取りPythonスクリプトの活用

遺物分布図における位置座標読み取りPythonスクリプトは、読み取り作業効率を飛躍的に高めるものです。このスクリプトはChatGPTから教えてもらいました。

2023.05.30記事「遺物分布図から平面座標を取得するPythonスクリプト

……………………………………………………………………

import cv2


# クリック座標を保存するリスト

click_points = []


def onMouse(event, x, y, flags, params):

    if event == cv2.EVENT_LBUTTONDOWN:

        click_points.append((x, y))

        if len(click_points) >= 3:

            # 計算式の値を求める

            x1, y1 = click_points[0]

            x2, y2 = click_points[1]

            x3, y3 = click_points[2]

            result1 = 2 * (y3 - y1) / (y2 - y1)

            result2 = 2 * (x3 - x1) / (x2 - x1)

            print("2*(y3-y1)/(y2-y1):", result1)

            print("2*(x3-x1)/(x2-x1):", result2)


img = cv2.imread('b6i.png')

cv2.namedWindow('keisokuh22', cv2.WINDOW_NORMAL)

cv2.imshow('keisokuh22', img)

cv2.setMouseCallback('keisokuh22', onMouse)

cv2.waitKey(0)

……………………………………………………………………

4-3 早期土器・前期土器3D空間分析について

これから閲覧資料を整理して全ての早期土器・前期土器の3D空間座標を求める作業を行います。そして、その結果に基づいて、早期土器・前期土器が貝層断面とどのような空間関係にあるのか、加曽利EⅡ式土器などの中期土器とどのような空間関係にあるのか分析します。その分析により、早期土器・前期土器がどのような経緯で北斜面貝層にもちこまれたのか考える材料ができれば面白いと思ます。

4-4 各種遺物の3D空間分析について

北斜面貝層出土各種遺物(装飾品(貝製品)、装飾品(骨角歯牙背品)イノシシ頭骨、打製石斧、磨製石斧、石鏃、貝刃、散乱人骨、磨貝、土器片錘、…)は全て出土メッシュと遺物番号が紐づいていますから、資料閲覧(スキャン)という手間をかけさえすれば全て3D空間座標を得ることができます。全ての遺物について3D空間分析が可能なのです。3D空間分析により遺物がどのような経緯でこの貝層にもちこまれたのかなどの情報を得ることができそうです。貴重な考古情報(3D位置情報)が「未発掘」で収蔵庫に1986年から埋もれているのです。


参考 装飾品(貝製品)出土数のメッシュ分布


参考 イノシシ頭骨出土数のメッシュ分布


2023年5月30日火曜日

遺物分布図から平面座標を取得するPythonスクリプト

 Python script to get plane coordinates from relic distribution map


I created a Python script to obtain the plane coordinates from the relic distribution map (1/10 actual survey map) created at the site. I created a simple image coordinate acquisition script by asking ChatGPT. ChatGPT is useful for Python beginners.


現場で作成された遺物分布図(1/10実測図)から平面座標を取得するPythonスクリプトを作成しました。単純な画像座標取得スクリプトを素にChatGPTに質問して作成しました。Python初心者にとってChatGPTは有用です。

1 遺物分布図(1/10)から取得したい遺物平面座標

次のような画像に含まれる特定メッシュ遺物分布図に記録されている遺物ポイントの座標を取得したいのです。


遺物分布図の画像

2 画像の座標を取得するPythonスクリプト

これまでのPython学習で画像においてマウスをクリックした場所の座標取得Pythonスクリプトを作って使っています。

画像の座標を取得するPythonスクリプト

……………………………………………………………………

import cv2

def onMouse(event, x, y, flags, params):

    if event == cv2.EVENT_LBUTTONDOWN:

       print(x,y)

img = cv2.imread('b6i.png')

cv2.namedWindow('keisokuh22', cv2.WINDOW_NORMAL)

cv2.imshow('keisokuh22', img)

cv2.setMouseCallback('keisokuh22', onMouse)

cv2.waitKey(0)

……………………………………………………………………

3 平面座標取得Pythonスクリプトの作成

次図にあるように、遺物分布図メッシュの四隅の座標は既知ですから、知りたい座標と対向四隅2座標の3個所の画像座標がわかれば単純な計算で平面座標を取得できます。


画像座標3点(未知1点、既知2点)から未知点の平面座標を求める原理

2で作成した画像座標取得Pythonスクリプトを拡張すれば簡単に平面座標取得Pythonスクリプトをつくることができるはずです。

しかし、悲しいかな、そのPythonスクリプト拡張記述が判りません。丸1日web検索などで類似事例を探して試みましたが出来そうでできません。初心者のつらい状況です。その時、ChatGPTなら教えてくれるに違いないと気が付きました。そして、確かにその通りとなりました。次はその質問と回答の様子です。

……………………………………………………………………

【ChatGPTに質問】

次のPythonスクリプト(例1)では画像(b6i.png)の任意点をマウスでクリックするとその座標(x.y)を取得します。

……………………………………………………………………

#Pythonスクリプト(例1)

import cv2

def onMouse(event, x, y, flags, params):

    if event == cv2.EVENT_LBUTTONDOWN:

       print(x,y)

img = cv2.imread('b6i.png')

cv2.namedWindow('keisokuh22', cv2.WINDOW_NORMAL)

cv2.imshow('keisokuh22', img)

cv2.setMouseCallback('keisokuh22', onMouse)

cv2.waitKey(0)

……………………………………………………………………

このPythonスクリプト(例1)を使って、最初にマウスでクリックして取得した座標(x1,y1)と2番目にマウスでクリックして取得した座標(x2,y2)と3番目にマウスでクリックして取得した座標(x3,y3)について、2*(y3-y1)/(y2-y1)の値と 2*(x3-x1)/(x2-x1)の値を求めるPythonスクリプトを教えてください。


【ChatGPTからの回答】

次のようなPythonスクリプトを使用して、指定された計算を行うことができます。

……………………………………………………………………

import cv2


# クリック座標を保存するリスト

click_points = []


def onMouse(event, x, y, flags, params):

    if event == cv2.EVENT_LBUTTONDOWN:

        click_points.append((x, y))

        if len(click_points) >= 3:

            # 計算式の値を求める

            x1, y1 = click_points[0]

            x2, y2 = click_points[1]

            x3, y3 = click_points[2]

            result1 = 2 * (y3 - y1) / (y2 - y1)

            result2 = 2 * (x3 - x1) / (x2 - x1)

            print("2*(y3-y1)/(y2-y1):", result1)

            print("2*(x3-x1)/(x2-x1):", result2)


img = cv2.imread('b6i.png')

cv2.namedWindow('keisokuh22', cv2.WINDOW_NORMAL)

cv2.imshow('keisokuh22', img)

cv2.setMouseCallback('keisokuh22', onMouse)

cv2.waitKey(0)

……………………………………………………………………

このスクリプトでは、クリックされた座標を click_points リストに保存します。リストに3つ以上の座標が保存された時点で、指定された計算を実行し、結果を表示します。


ChatGPTやりとり画面

4 平面座標取得Pythonスクリプトの動作

ChatGPTに教えてもらったPythonスクリプトで求めたい平面座標を取得することができます。


平面座標を取得した様子(コマンドプロンプト画面)

今後このスクリプトを、小数点桁の表示など幾つかの点で、改良して自分好みに使い勝手をよくしていきたいと思います。

5 感想

判らないPythonスクリプトをChatGPTが教えてくれるという状況は、自分にとって「革命的」です。ChatGPTが存在しない過去では、一番の近道はPythonに詳しい人に聞くことです。それができないので自分は(あるいはほとんど全ての人が)苦労して延々と時間をかけて調べるしかないのです。ChatGPTを使うことにより、自分のPython学習・活用が急加速すると予感します。


2023年5月27日土曜日

オブジェクト(例 貝層断面図)をBlenderにインポートして正置させるBlenderPythonスクリプト

 A Blender Python script that imports an object (e.g. shell layer cross section) into Blender and orients it correctly


I created a BlenderPython script that imports an object (e.g. shell layer cross section) into Blender and orients it in 3D space. With this script and object files, I'm ready to build a Blender file. There is no need to use the Blender file as the original, which improves work efficiency.


オブジェクト(例 貝層断面図)をBlenderにインポートして3D空間に正置させるBlenderPythonスクリプトを作成しました。このスクリプトとオブジェクトファイルがあれば、いつでもBlenderファイルを構築できます。Blenderファイルを原簿とする必要がなく、作業効率が向上します。

1 例 第2貝層断面図


オブジェクト(第2貝層断面図)がBlender3D空間に配置されている様子


オブジェクト(第2貝層断面図)のBlender3D空間における位置・回転・スケール諸元

2 オブジェクト(第2貝層断面図)をインポート・正置させるスクリプト


オブジェクト(第2貝層断面図)をBlenderにインポートし正置させるスクリプト

……………………………………………………………………

# 平面画像オブジェクトをインポートして位置の移動、回転、拡大縮小させて、正置させる。

import bpy

import math

bpy.ops.wm.obj_import(filepath="I:\\20221214有吉北貝塚北斜面貝層プロジェクト\\■貝層断面図等Pythonによるプロット\\20230525Pythonスクリプト基礎検討\\2o4a-01eee.obj", directory="I:\\20221214有吉北貝塚北斜面貝層プロジェクト\\■貝層断面図等Pythonによるプロット\\20230525Pythonスクリプト基礎検討\\", files=[{"name":"2o4a-01eee.obj", "name":"2o4a-01eee.obj"}], forward_axis='X', up_axis='Z')

# 現在選択されているオブジェクトを取得します。

selected_objects = bpy.context.selected_objects

# 選択されたオブジェクトを拡大縮小します。

for obj in selected_objects:

obj.scale[0] = 0.1

obj.scale[1] = 0.1

# 選択されたオブジェクト(の原点)を移動します。

for obj in selected_objects:

obj.location[0] = 10.182

obj.location[1] = 4

obj.location[2] = 5.1797

# 選択されたオブジェクトを回転します。

for obj in selected_objects:

obj.rotation_euler[0] = math.radians(90)

obj.rotation_euler[2] = math.radians(0)

# オブジェクトを原点へ移動。(過去の操作でオブジェクトの原点が移動している場合があるので、それを補正するためのスクリプト。)

bpy.ops.object.origin_set(type='GEOMETRY_ORIGIN', center='MEDIAN')

……………………………………………………………………

3 オブジェクト(第2貝層断面図)のBlenderインポートと正置


オブジェクト(第2貝層断面図)のBlenderインポートと正置の様子

4 感想

4-1 情報パネルに表示されるPythonスクリプトの逆引き的活用

BlenderPythonスクリプトを書くために情報パネルに表示されるPythonスクリプトを逆引き的に利用できることに気が付きました。

Blenderで行う操作は全て情報パネル(Scripting画面におけるPythonコンソールの下)にPythonスクリプトとして記録されます。従って、書きたいスクリプトの操作をBlenderで行えば、そのスクリプトを得ることができます。とても便利です。これを利用することによりスクリプト作成の高い敷居がとても低くなりました。


BlenderのScripting画面における情報パネル

4-2 オブジェクトのインポート・正置BlenderPythonスクリプトの意義

オブジェクト(例 貝層断面図)をBlenderにインポートして3D空間に正置させるBlenderPythonスクリプトを今回作成しました。このスクリプトとオブジェクトファイルがあれば、いつでもBlenderファイルを構築できます。従って、Blenderファイルを原簿とする必要がなくなります。有吉北貝塚北斜面貝層に関する学習活動では多数のBlenderファイルを作成してきていて、その管理が大変面倒になってきています。しかし今回のスクリプトとオブジェクトファイルがあればBlenderファイルを構築できることにより、原簿をオブジェクトファイルとすることができ、煩雑なBlenderファイル管理がなくなり、活動効率が向上します。

4-3 つかまり立ちレベル

自分のPython・BlenderPython学習レベルを幼児発達に例えると、ようやくつかまり立ちができるレベルに到達できたといううれしい状況です。まだヨチヨチ歩きは無理という感じですが、はやくそうなりたいです。



2023年5月24日水曜日

縄文土器平面・立面分布図からPythonを使って3D分布図を作成する

 Create a 3D distribution map using Python from the Jomon pottery plane/elevation distribution map


Jomon pottery excavated from the north slope shell layer of Ariyoshi Kita Shell Mound was plotted in Blender3D space with BlenderPython. I got the coordinates from the plane distribution map and the elevation distribution map with Python. By using Python, work became more efficient, accuracy improved, and information became easier to manage.


有吉北貝塚北斜面貝層から出土した縄文土器について、その平面分布図及び立面分布図からPythonで座標を取得して、BlenderPythonでBlender3D空間にプロットしました。Pythonを使うことにより作業が効率化、精度向上し、情報が管理しやすくなりました。


縄文土器出土位置を3D空間にプロットした方法

1 発掘調査報告書に掲載されている縄文土器分布図


平面分布図(上)と立面分布図(下)

有吉北貝塚発掘調査報告書から引用


平面分布図と立面分布図をBlender3D空間にプロットした様子


平面分布図・立面分布図にプロットされている土器数

2 座標取得方法


PythonスクリプトによるBlender3D空間座標の取得


Pythonスクリプト(V3立面分布図の例)

3 3D空間プロット方法


BlenderPythonスクリプトによるBlender3D空間プロットの様子(Blenderスクリプト画面)


座標をBlender3D空間にプロットするBlenderPythonスクリプト

このBlenderPythonスクリプトはChatGPTに教えてもらったものです。

4 感想

・これまで同じ作業をIllustratorを使った図学的方法とBlender手作業プロット法で行ってきました。今回、Python及びBlenderPythonを使う方法により、作業が著しく効率化し、作業精度が向上しています。

・Python、BlenderPythonを使うことにより、情報の基本が座標となり、オブジェクト(図像)ではなくなるので、情報管理がしやすく、利用の自由度が飛躍的に向上しています。これまでオブジェクト(CUBE)をアペンドでBlenderファイル間でやりとりしていたのですが、これからは座標からオブジェクトを生成することにします。

・情報を個別土器単位に作成できるので、土器分類が変化しても、あるいは別の視点での集計単位が生まれても今回の作業結果は柔軟に対応できます。情報が再利用しやすくなりました。


2023年5月20日土曜日

海外地形の干渉色標高図3Dモデルを作成する

 Creating a 3D model of interferometric color elevation map of overseas terrain


I created a 3D model of the terrain near the Richat Structure in Mauritania from the Geographical Survey Institute map using an interference color elevation map creation tool (Map Art Labo). It's nice to be able to create 3D models of the world's terrain in interference colors.


干渉色標高図作成ツール(地図アート研究所)を使って、地理院地図によりモーリタニアのリシャット構造付近地形の3Dモデルを作成しました。世界中の地形3Dモデルを干渉色で作成できることはうれしいことです。

1 モーリタニアのリシャット構造付近の干渉色標高図3Dモデル

モーリタニアのリシャット構造付近の干渉色標高図 3Dモデル

地理院地図で干渉色標高図と陰影起伏図(全球版)をオーバーレイして3Dモデル化。

垂直倍率:×10

干渉色標高図は「干渉色標高図作成ツール」(地図アート研究所)で作成。


干渉色標高図作成ツールの様子

Interference color elevation map near the Rishat structure in Mauritania

A 3D model is created by overlaying an interference color elevation map and a shaded relief map (global version) on the Geographical Survey Institute map.

Vertical Magnification: x10

The interference color elevation map is created with the "Interference color elevation map creation tool" (Map Art Labo).


モーリタニアのリシャット構造付近の干渉色標高図 3Dモデル画像


モーリタニアのリシャット構造付近の干渉色標高図 3Dモデル動画

2 作成方法

2-1 干渉色標高図作成ツール(地図アート研究所)による干渉色標高図作成

干渉色標高図作成ツール(地図アート研究所)で海外地形の干渉色標高図を作成します。


干渉色標高図作成ツール(地図アート研究所)の様子

2-2 地理院地図に移動

干渉色標高図作成ツール(地図アート研究所)画面の「全画面」ボタンをクリックすると、干渉色設定を保持したまま地理院地図に移動します。地理院地図で海外の当該場所に移動します。


地理院地図でモーリタニアのリシャット構造付近に移動した様子

干渉色標高図は地理院地図では「自分で作る色別標高図」として定義されています。

2-3 地理院地図による干渉色調整

地理院地図にデフォルトで備わっている陰影起伏図(全球版)を干渉色標高図(自分で作る色別標高図)とオーバーレイするとより干渉色らしい色合いになります。(この例では陰影起伏図(全球版)を50%濃度にして干渉色標高図(自分でつくる色別標高図)とオーバーレイしました。)


陰影起伏図(全球版)と干渉色標高図(自分で作る色別標高図)をオーバーレイした様子


参考 陰影起伏図(全球版)

2-4 地理院地図による3D作成

地理院地図3D機能により3Dモデルを作成します。


地理院地図3D機能により3Dモデルを作成した様子

3DモデルはWabefront(.obj)ファイルなどで出力して、他の3Dソフトで再利用できます。

3 感想

干渉色標高図を地球全域で作成できて、かつ干渉色標高図をテクスチャとする地形3Dモデル作成も地球全域でできることはすばらしいことです。地形に興味がある自分にとっては夢のような状況です。地球にある興味深い多数の地形について干渉色標高図を作成して楽しみたいとおもいます。

なお、少し残念ですが、地理院地図では海外地形の精度が国内とくらべて格段に落ちます。従って地図も拡大できません。別の方法(DEM-Net Elevation APIと干渉色変換ツール(地図アート研究所)の併用)を使えば、手間がかかるのが難点ですが、精度の高い干渉色標高図3Dモデルを作成することができます。

2022.01.10記事「やまだこーじさん開発干渉色変換フィルターの威力

Richat Structure Mauritania  Interference color elevation map


3Dモデルの動画


2023年5月18日木曜日

Pythonで自家用座標計測ツール作成

 Creating a home-use coordinate measurement tool with Python


I created a home-use coordinate measurement tool in Python. very convenient. Python utilization in hobby activities is getting on track.


Pythonで自家用座標計測ツールを作成しました。とても便利です。趣味活動におけるPython活用が軌道に乗りつつあります。

1 土器破片プロット図からBlender3D空間換算座標を計測するツール

1-1 ツールの趣旨

有吉北貝塚発掘調査報告書に北斜面貝層の土器破片平面分布図と土器破片立面図が掲載されています。それぞれの分布図は既にBlender3D空間に配置してあります。


土器破片分布図(平面、立面)のBlender3D空間配置

今回、それぞれの分布図について、マウスでクリックすると直接Blender3D空間の座標をコンソールに書き出すPythonスクリプトを作成しました。

1-2 ツール運用の様子


ツール運用の様子

1-3 Pythonスクリプト

……………………………………………………………………

import cv2

def onMouse(event, x, y, flags, params):

    if event == cv2.EVENT_LBUTTONDOWN:

        print('{:.03f}'.format((y-346)/379), '{:.03f}'.format((x-496)/379), 0)

img = cv2.imread('keisokuh22.png')

cv2.namedWindow('keisokuh22', cv2.WINDOW_NORMAL)

cv2.imshow('keisokuh22', img)

cv2.setMouseCallback('keisokuh22', onMouse)

cv2.waitKey(0)

……………………………………………………………………

2 メモ

画像の座標を読み取るPythonスクリプトの雛形は次のwebページを参考としました。今回はこの雛形を基本としました。同種スクリプトは他の多くのwebページで紹介されています。

座標読み取り 例

https://magazine.techacademy.jp/magazine/51035

この雛形に画像Windowの拡大縮小機能を次のweb例を参考に付加しました。

画像Window拡大縮小機能 例

https://rasp.hateblo.jp/entry/2016/01/22/230852

さらに、座標の少数桁数を限定する機能を次のweb例を参考に付加しました。

少数桁限定 例

https://magazine.techacademy.jp/magazine/23378

最後に、画像の座標からBlender3D空間座標を換算する式を書き込み、ツールを完成させました。

この記事では平面分布図からBlender3D空間座標を計測する例を示しましたが、同じ土器破片が掲載されている立面分布図からもBlender3D空間座標を読み取り、その二つを合成することにより、土器破片のBlender3D空間座標が完成します。Blender3D空間座標は別に作成したPythonスクリプトで、Blender3D空間にCUBE(土器破片)をプロットするのに使います。

2023.05.09記事「Blenderで多数座標にCUBEを一括生成するスクリプト

3 感想

見よう見まねのレベルですが、Pythonスクリプトを趣味活動で実用して、活動の効率化、高度化が図れることが判りました。今後より積極的に出来るだけ多くの場面でPython、BlenderPythonを活用していくことにします。


2023年5月15日月曜日

Illustratorから3Dモデルファイル出力が可能であることを知る

 Know that 3D model file output is possible from Illustrator


I learned that 3D models created in Illustrator can be output as files and reused in other 3D software. Having more options for 3D tools is a good thing. It may be useful in some situations.


Illustratorで作成した3Dモデルをファイル出力して、他の3Dソフトで再利用できることを知りました。3Dツールの選択肢が増えることは好ましいことです。場面によっては有用であるかもしれません。

1 Illustratorによる3D作成

Illustratorでは押出、面取り(ベベル)、回転により3Dモデルを作成することができます。Dimensionなどと共通したマテリアルを使えます。


Illustratorでの3Dモデル作成画面

土器実測図の断面をトレースして回転させて3Dモデルを作成しました。さらに実測図模様(グラフィック)を貼り付けました。グラフィックの貼り付けは簡単で(単純で)、この場合はBlenderモディファイアーのシュリンクラップやUV投影よりはるかに楽です。

3DモデルはWabefront(.obj)ファイル、gltfファイル、usdaファイル、usdzファイルで書き出すことができます。ただし、Wabefront(.obj)ファイル書き出しではテクスチャ貼り付けはできません。usdaファイルで書き出したテクスチャファイルを使えば(mtlファイルにテクスチャファイルに関する記述をくわえて、同じフォルダーに置けば)Wabefront(.obj)ファイルでもテクスチャが貼り付きます。


Blenderに3Dモデルをインポートした様子

2 感想

昨年からPhotoshopで3Dモデル機能が削除されだしていますが、その代替のようにIllustratorで3Dモデル機能が増強されたように感じます。簡易な3DモデルをIllustratorで作成する場面があるかもしれないので、Illustrator3Dモデル書き出し機能追加は良いことです。一般的3Dモデル作成はBlender操作に習熟して、それで行いたいと思います。


2023年5月14日日曜日

地図アート研究所(所長 やまだこーじ)提供の干渉色標高図作成ツールで遊ぶ

 Playing with the interference color elevation map creation tool provided by Map Art Labo (Director Koji Yamada)


I played with the interference color elevation map creation tool provided free of charge by the Map Art Labo (Director Koji Yamada). I created images that processed the interference color elevation map with various filters and pasted it as textures of the terrain 3D model.

With this tool, anyone can easily create an interference color elevation map on the Geographical Survey Institute map. The interference color elevation map is an excellent tool for visualizing the detailed appearance of terrain.


地図アート研究所(所長 やまだこーじ)が無償提供する干渉色標高図作成ツールで遊びました。干渉色標高図を各種フィルターで処理した画像をつくり、地形3Dモデルのテクスチャとしてはりつけました。

このツールでは地理院地図で干渉色標高図をだれでも気軽に作成できます。干渉色標高図は地形の精細な様子を可視化することができる秀逸なツールです。

1 干渉色標高図をテクスチャとした千葉市花見川区柏井付近の地形3Dモデル 6種

干渉色標高図をテクスチャとした千葉市花見川区柏井付近の地形3Dモデル 6種


1 干渉色標高図 原図

2 干渉色標高図 くっきりバージョン(Photoshopハイパスフィルター)

3 干渉色標高図 輪郭検出バージョン(Photoshop輪郭検出フィルター)

4 干渉色標高図 水彩画風バージョン(Photoshop水彩画フィルター)

5 干渉色標高図 パッチワークバージョン(Photoshopパッチワークフィルター)

6 干渉色標高図 創作バージョン(Photoshopニューラルフィルター→スタイルの適用→アーティストスタイル→北斎)

干渉色標高図は地図アート研究所(所長 やまだこーじ)の干渉色標高図作成ツールで作成。


https://ymd5022002.github.io/map-art-jp/

地形3Dモデルは地理院地図の3Dモデル機能で作成。

https://maps.gsi.go.jp/

Terrain 3D models near Kashiwai, Hanamigawa Ward, Chiba City, with interferometric color elevation maps as textures, 6 types

1 Interference color elevation map Original drawing

2 Interference color elevation map Clear version (Photoshop high-pass filter)

3 Interference color elevation map Contour detection version (Photoshop contour detection filter)

4 Interference color elevation map Watercolor style version (Photoshop watercolor filter)

5 Interference color elevation map Patchwork version (Photoshop patchwork filter)

6 Interference color elevation map Creative version (Photoshop neural filter → apply style → artist style → Hokusai)

The interference color elevation map was created with the interference color elevation map creation tool of Map Art Labo (Director Koji Yamada).

https://ymd5022002.github.io/map-art-en/

The terrain 3D model is created with the 3D model function of the Geographical Survey Institute map.

https://maps.gsi.go.jp/


3Dモデルの画像


3Dモデルの動画

2 感想

干渉色標高図作成ツールでは、色周期や階調数等を変更することで、対象とする地形の拡がりやスケールあるいは自分の問題意識に合わせた地形表現精細性を実現できます。

干渉色標高図作成ツールで作成した画像を地形3Dモデルに貼り付けると地形成り立ちや土地の歴史を知るための有用な資料とすることができます。

干渉色標高図作成ツールで作成した画像を画像ソフトの各種フィルターで処理することによって、地図アートをより深く楽しむことができます。

干渉色標高図作成ツールを公開したやまだこーじさんに感謝します。