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モデルに貼り付けると地形成り立ちや土地の歴史を知るための有用な資料とすることができます。

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

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


2023年5月12日金曜日

3Dモデルとしての土器復元(予定)

 Restoration of pottery as a 3D model (planned)


I am planning to restore the overall image of pottery No. 395 that I photographed at the Morimiya Branch of the Chiba Prefectural Board of Education as a 3D model. Photogrammetry has created a material, so I'm going to enjoy working on it.


千葉県教育委員会森宮分室で有吉北貝塚北斜面貝層出土395番土器(加曽利EⅡ式有孔鍔付土器)を撮影させていただきました。この土器は二つのブロックとして復元していますが、全体の復元が行われていません。そこでフォトグラメトリによる3Dモデルを素材に、自分で全体像を3Dモデルとして復元して楽しむことにしました。

1 周回撮影と素3Dモデル作成

2つのブロックをそれぞれ外面、内面について周回撮影し、それぞれ素3Dモデルを作成しました。

2 復元3Dモデルの作成(予定)

素3Dモデルから2つのブロックを切り取り、それぞれ内面と外面を統合します。さらに2つのブロックを3D空間で配置し、欠けている部分をメッシュで補完作画して、土器全体像を復元する予定です。自分が頭に描いたように作業が進み、それなりの復元3Dモデルが予定調和的にできるという保証はありませんが、作業をじっくり行い、そのプロセスを楽しむことにします。


395番土器の3Dモデルとしての復元


2023年5月9日火曜日

有吉北貝塚北斜面貝層学習のためのBlender3D空間

 Blender 3D space for learning the northern slope shell layer of Ariyoshi Kita Shell Mound


A 3D mesh system (2m x 2m x 2m) was introduced to the entire Blender3D space for learning the north slope shell layer of the Ariyoshi Kita Shell Mound. This training 3D space uses Blender global coordinates. Relics are represented by CUBE.


有吉北貝塚北斜面貝層学習のためのBlender3D空間全体に3Dメッシュ(2m×2m×2m)を導入しました。この学習用3D空間はBlenderグローバル座標を利用しています。遺物はCUBEで表現します。

1 北斜面貝層空間とBlenderグローバル座標原点との対応関係

北斜面貝層空間とBlenderグローバル座標原点との対応関係を次のように設定しています。


北斜面貝層平面図とBlenderグローバル座標原点との対応


北斜面貝層立面図とBlenderグローバル座標原点との対応

2 有吉北貝塚北斜面貝層学習のためのBlender3D空間の様子


Blenderグローバル座標の様子


平面図、断面線、土器破片の表示


3Dメッシュ(2m×2m×2m)の表示


3Dメッシュ(2m×2m×2m)の表示


3Dメッシュ(2m×2m×2m)の表示

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

 Script to generate CUBE at multiple coordinates in Blender


ChatGPT taught me a simple BlenderPython script that batch-generates CUBEs in multiple coordinates in Blender. I had a great time using ChatGPT to help me get started with Python.


Blenderで多数座標にCUBEを一括生成する簡潔なBlenderPythonスクリプトをChatGPTに教えてもらいました。ChatGPTにPython入門の第1歩をサポートしてもらい、楽しい一時を過ごしました。

1 やりたいことがら

資料を読み取り、有吉北貝塚北斜面貝層出土土器破片や遺物の3D座標を大量に入手し、Blender3D空間にプロットする作業が生まれそうです。その際、遺物3D座標(Excel情報)を効率的にBlenderに投入して3D空間表示する方法を知りたいのです。

2 Blenderで多数座標にCUBEを生成するBlenderPythonスクリプト

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

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

Blender(バージョン3.5)で、次の多数座標(X,Y,Z)にprimitive_cube(size=0.1)を生成するbpyスクリプトを教えてください。


(2, 2, 2)

(9, 6, 7)

(6, 3, 10)

(7, 10, 7)

(3, 9, 8)

(10, 7, 2)

(7, 2, 0)

(1, 8, 10)

(6, 7, 8)

(7, 9, 5)

(3, 4, 8)

(0, 2, 8)

(5, 0, 7)

(7, 7, 3)

(0, 6, 8)

(7, 2, 8)

(3, 2, 7)

(2, 0, 10)

(8, 5, 3)

(3, 5, 3)

(9, 10, 4)

(1, 9, 0)


以上

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

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

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

import bpy


# 多数の座標をリストで定義

positions = [(2, 2, 2), (9, 6, 7), (6, 3, 10), (7, 10, 7), (3, 9, 8), (10, 7, 2), (7, 2, 0), (1, 8, 10), (6, 7, 8), (7, 9, 5), (3, 4, 8), (0, 2, 8), (5, 0, 7), (7, 7, 3), (0, 6, 8), (7, 2, 8), (3, 2, 7), (2, 0, 10), (8, 5, 3), (3, 5, 3), (9, 10, 4), (1, 9, 0)]


# 各座標に対してprimitive_cubeを生成

for pos in positions:

    bpy.ops.mesh.primitive_cube_add(size=0.1, location=pos)

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


ChatGPTとのやりとり画面

このBlenderPythonスクリプトをBlenderで実行すると、期待どおりにCUBEが生成しました。


Blender画面

Blenderで得られたCUBEの面を一括で三角化し、さらに一括でマテリアルに赤色テクスチャ画像を貼り付けてからWabefront(.obj)ファイルとして書き出し、3DF Zephyr Liteに投入すると次のような画面となります。動画撮影や各種表現が可能です。


3DF Zephyr Lite画面

3 縦長数列をカンマで区切る横長式に変換するPythonスクリプト

遺物の3D座標はExcelで整理します。Excelから得られた座標値を取り出すと縦長数列になるのですが、それを横長式に変換するPythonスクリプトをChatGPTに問い、教えてもらいました。

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

改行で縦に長いAの数列を、「,」で区切られて横に長いBの式に変換する方法、あるいはPythonスクリプトを教えてください。


Aの数列

(2, 2, 2)

(9, 6, 7)

(6, 3, 10)

(7, 10, 7)

(3, 9, 8)

(10, 7, 2)

(7, 2, 0)

(1, 8, 10)

(6, 7, 8)

(7, 9, 5)

(3, 4, 8)

(0, 2, 8)

(5, 0, 7)

(7, 7, 3)

(0, 6, 8)

(7, 2, 8)

(3, 2, 7)

(2, 0, 10)

(8, 5, 3)

(3, 5, 3)

(9, 10, 4)

(1, 9, 0)



Bの式

[(2, 2, 2), (9, 6, 7), (6, 3, 10), (7, 10, 7), (3, 9, 8), (10, 7, 2), (7, 2, 0), (1, 8, 10), (6, 7, 8), (7, 9, 5), (3, 4, 8), (0, 2, 8), (5, 0, 7), (7, 7, 3), (0, 6, 8), (7, 2, 8), (3, 2, 7), (2, 0, 10), (8, 5, 3), (3, 5, 3), (9, 10, 4), (1, 9, 0)]


以上

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

ChatGPTの回答

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

A = [(2, 2, 2),

     (9, 6, 7),

     (6, 3, 10),

     (7, 10, 7),

     (3, 9, 8),

     (10, 7, 2),

     (7, 2, 0),

     (1, 8, 10),

     (6, 7, 8),

     (7, 9, 5),

     (3, 4, 8),

     (0, 2, 8),

     (5, 0, 7),

     (7, 7, 3),

     (0, 6, 8),

     (7, 2, 8),

     (3, 2, 7),

     (2, 0, 10),

     (8, 5, 3),

     (3, 5, 3),

     (9, 10, 4),

     (1, 9, 0)]


B = [a for a in A]

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

この回答を全部コピーしてPythonインタプリタにCtrl+Vで一括貼り付けして、Bをタイプすると、求める結果が表示されました。


Pythonインタプリタ画面

Excelで文字列結合により座標情報に「()」や「,」を加え、最初と最後に「[]」を加えた縦長情報をつくることができます。それを一括コピーしてPythonインタプリタに貼り付ければ、横長式に変換できることを知りました。

この操作の後、エディターで改行記号を一括削除すればもっと簡単であることに気が付きました。Pythonを使うまでもないことです。しかし、Pythonに親しむことが出来て、楽しい一時となりました。

4 感想

多数3D座標値にCUBEを一括生成する効率的な方法をChatGPTに教えてもらいました。200~300程度までの情報なら今までの手作業でなんとかなると思います。しかし、1000単位、あるいは10000単位の情報を扱うとなると、その効率的方法が必須です。その効率的方法開発の第1歩を踏み出すことができました。BlenderPython理解が趣味学習活動に必須であることと、ChatGPTがBlenderPython入門者の自分にとっての良きアドバイザーになることを体験しました。


2023年5月8日月曜日

Blender3D分析空間の視認性向上

 Improved visibility of Blender3D analysis space


I'm doing a spatial analysis of a shell mound in Blender3D space. I introduced a 3D mesh made by arranging empty (CUBE) to improve the visibility. Spatial positions of shell layers and relics become easier to understand. No 3D mesh gets in the way.


Blender3D空間を有吉北貝塚北斜面貝層の分析空間として活用していますが、その視認性向上のために2m×2m×2mの3Dメッシュを一部空間に導入してその効果を確かめました。貝層や土器破片の空間関係に関する視認性が向上します。

1 3Dメッシュ


3Dメッシュの有無


3Dメッシュの有無


3Dメッシュの有無


3Dメッシュの有無

2 メモ

3DメッシュはBlenderオブジェクトのエンプティ(CUBE)を並べて作成しました。

エンプティの線が太さや面積をもたないという虚特性によりその存在の主張が弱く、対象物観察の邪魔になりません。しかし、3D位置関係を指示しますので、3D空間の視認性がとても向上します。

線の太さや面積のあるオブジェクト(MESH)で同じ3Dメッシュを作成しましたが、それ自身の主張が強すぎてかえって3D空間視認性の邪魔になります。

このエンプティはBlenderの外に書き出すことはできないようです。

3 3Dメッシュ作成スクリプト

この3Dメッシュは見よう見まねで次のBlenderPythonスクリプトを書き、作成しました。(このスクリプトをパソコンで走らせると、20メッシュ×20メッシュ×20メッシュの作成に10分ほどかかりました。)

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

import bpy


NUM_X = 20

NUM_Y = 20

NUM_Z = 20


def make_empty(x,y,z):

  loc = (x,y,z)

  empty = bpy.ops.object.empty_add(type='CUBE',location=loc)


def make_empties(num_x,num_y,num_z):

  for x in range(num_x):

    for y in range(num_y):

        for z in range(num_z):

            make_empty(x*2-(num_x-1),y*2-(num_y-1),z*2-(num_z-1))


if __name__ == "__main__":

  delete_all()    

  make_empties(NUM_X,NUM_Y,NUM_Z)


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


2023年5月4日木曜日

有吉北貝塚北斜面貝層出土の全遺物に精細3D位置情報があることを知る

 Knowing that all relics excavated from the shell layer on the northern slope of the Ariyoshi Kita Shell Mound have detailed 3D positional information


I learned that all the relics excavated from the shell layer on the northern slope of the Ariyoshi Kita Shell Mound are associated with detailed 3D positional information (on-site in millimeters).

For me, who enjoys 3D analysis learning of excavated information in Blender 3D space, it is a great news to discover a surprising fact.

I forget my remaining life and get excited.


有吉北貝塚北斜面貝層出土の全遺物に精細3D位置情報があることを知りました。発掘調査報告書掲載情報を3D分析して学習を楽しんでいる自分にとって、驚愕の事実判明です。1980年代の発掘ですが、全出土物の平面座標(x,y)と高さ座標(z)が㎜単位の精度で紐づいています。発掘関係者にとっては常識なのかもしれませんが、一般市民の自分にとっては驚愕であるだけでなく、3D空間分析の新地平が確実に開けると考えられる超朗報です。

有吉北貝塚出土資料を保管している千葉県教育委員会森宮分室の担当官の方に資料現物をみせていただき、教えていただきました。感謝です。

1 発掘調査報告書掲載土器(中期土器)の3D位置情報

発掘調査報告書には掲載土器の精細平面分布図と精細立面図が掲載されています。


例 359番土器破片の平面分布図と立面分布図

このすばらしい資料から掲載土器の高精度3D空間分布データを作成し、分析してきました。


例 加曽利EⅡ式土器(第10・11群土器)3D分布図(部分)

しかし学習を進めれば進めるほど、欲が出てきます。掲載図から3D位置情報を読み取る作業で生まれたデータには各種誤差・錯誤・不明が入り込み、精度が落ちるデータもあります。またグラフに表現できる情報には限界がありますから、情報全体の2割程度は欠落しています。

ところが、今回教えていただいた保管原資料を使えば、手間はかかりますが、次の方法で全ての土器破片について現場㎜単位の精度で3D位置情報を知ることができます。

ア 復元土器破片の注記からメッシュ番号と遺物番号を読み取る


例 359番土器破片のメッシュ番号と遺物番号

イ 遺物分布図から平面座標を読み取る

メッシュ毎に1/10遺物分布図が作成されていて、遺物番号が平面図にプロットされています。方眼紙に描かれた遺物分布図上で0.1㎜程度精度の計測が可能ですから、情報としては現場における㎜単位の精度になります。遺物番号位置を図面上で計測することにより高精度の遺物出土平面座標を知ることができます。

具体的には、遺物分布図をスキャナーで電子化し、illustratorに取り込み、illustrator座標を読み取れば簡単な変換式で現場座標を知ることができます。


illustratorを使った座標読み取りのイメージ

ウ 遺物台帳から高さ情報を知る

遺物台帳には全出土物の高さ情報が㎜単位で記載されています。

2 早期土器・前期土器及び土器以外の全出土遺物の3D位置情報

中期土器は出土土器現物の注記を読み取らなければその3D座標にたどり着くことが出来ません。しかし、早期土器・前期土器及び土器以外の全出土遺物については、発掘調査報告書に遺物番号が記載されていますので、現物注記を読み取ることなく、その3D位置座標を知ることができます。

2-1 前期土器の例

前期土器は南斜面貝層出土土器と接合する土器もあり、その分布原理に強い興味を持っています。北斜面貝層出土前期土器には発掘調査報告書で出土メッシュ番号と遺物番号が記載されているので、現物確認することなく3D座標を知ることができます。


例 発掘調査報告書における前期土器(158番)の記載

これまで次のようなメッシュ単位分布図を作成してきましたが、これからは中期土器と同じく精細な3D空間分布を把握することが可能となります。


例 これまでの早期土器・前期土器の分布把握

早期土器や前期土器がその時期にこの場所に持ち込まれたのか、それとも加曽利EⅡ式土器と一緒に持ち込まれたものであるのか、3D分布分析の中で結論がでるかもしれません。

2-2 貝製品の例

貝製品に限らず中期土器以外の出土物は発掘調査報告書でメッシュ番号と遺物番号が記載されています。


例 貝製品(装飾品他)でメッシュ番号と遺物番号が記載されている様子

従って、これまで平面分布図のみ作成してきましたが、これからは3D分布図作成が可能となります。


例 これまで作成してきた貝製品のメッシュ単位分布図(棒グラフの立体表現)

貝製品(装飾品他)の分布について、識者の見立てでは、台地面存在の指導者竪穴住居がガリーに崩落して、その結果腰飾りが貝層に流れ込み埋もれたということになっています。しかし、3D分布分析ができるようになると遺物と貝層との関連も判るようになり、北斜面貝層で祭壇がつくられてたり、装飾品が埋納されるような活動存在が想定できるようになるかもしれません。

3 感想

Blender3D空間を舞台に北斜面貝層の貝層と遺物の3D分布分析が可能であることがわかりました。発掘作業が行われた1980年代には、作成した3D位置情報を有効活用する技術は十分ではありませんでした。しかし、2023年の今では、素人の自分でも貝層と遺物の精細3D分布分析が技術的に可能です。これからの有吉北貝塚北斜面貝層学習に、残寿命を忘れてワクワクします。