2026年6月30日火曜日

技術メモ BlenderPythonスクリプト資産の効率活用策

 Technical Note: Strategies for Efficiently Utilizing Blender Python Script Assets


As part of an effort to efficiently utilize the library of Blender Python scripts I have built up over time, I have adopted the practice of making appropriate use of the File Browser panel within the Blender interface. This has facilitated the efficient use of existing scripts.


これまでの活動で貯めてきたBlenderPythonスクリプト資産の効率的活用策の一環としてBlender画面でファイルブラウザーパネルを適宜使うようにしました。これにより既存スクリプトの効率的活用が進んでいます。

1 Blender画面におけるファイルブラウザーパネルの設置とBlenderPythonスクリプト資産の表示


BlenderPythonスクリプト資産を表示したファイルブラウザーパネル設置Blender画面

パソコンに整理されているBlenderPythonフォルダーをブラウザパネルに表示して、BlenderPythonスクリプトを選びやすくしています。

2 Blender画面テキストエディターにおけるBlenderPythonスクリプト説明文書の表示


BlenderPythonスクリプト説明文書を表示しているBlender画面

BlenderテキストエディターはBlenderPythonスクリプトだけではなく、説明文書も表示できますから、BlenderPythonスクリプト資産活用の際にスクリプト内容についてより深く確認できます。

3 テキストエディターのBlenderPythonスクリプトを走らせた様子


テキストエディターでBlenderPythonスクリプトを走らせた画面

パソコンフォルダーに格納してあるBlenderPythonスクリプトをファイルブラウザー経由で取り出しテキストエディターで走らせることによって、エクスプローラー経由よりも効率的に作業が進みます。

4 メモ

これまでWindowsのエクスプローラーを使って既存資産を取り出し、Blenderに貼りつけていましたが、それより、ファイルブラウザーを使う方が効率的であることを実感しています。効率化実感の一因はウィンドウ数減少にあります。


自作BlenderアドオンBlenderChatGPTUI版の実装

 Implementation of "BlenderChatGPTUI": A Custom Blender Add-on


To streamline the process of generating Python scripts with ChatGPT and executing operations in Blender, I have created and begun testing a custom add-on called "BlenderChatGPTUI." My goal is to develop it into a function-calling add-on.


ChatGPTによるPythonスクリプト生成→Blender操作をより効率的に行うために、自作BlenderアドオンとしてBlenderChatGPTUI版を作成し、試用し始めました。Function Calling型アドオンを目指しています。

この記事は2026.01.22記事「ChatGPTそのものをBlenderのアドオンにする」の続きです。

1 自作BlenderアドオンBlenderChatGPTUI版

自作BlenderアドオンBlenderChatGPTUI版のパネル

2 自作BlenderアドオンBlenderChatGPTUI版の挙動


自作BlenderアドオンBlenderChatGPTUI版の挙動 1

メッセージ欄に「"G:\test\aaa.csv"を点群(メッシュ)でBlender4.4.3にインポートしてください。」を書き込みました。


自作BlenderアドオンBlenderChatGPTUI版の挙動 2

SendをクリックするとPythonスクリプトが生成されます。


自作BlenderアドオンBlenderChatGPTUI版の挙動 3

Run generated scriptをクリックすると3Dビューポートに点群(メッシュ)が生成し、アウトライナーにメッシュ名が表示されます。


自作BlenderアドオンBlenderChatGPTUI版の挙動 4

Open Chat Logをクリックするとテキストエディターにログが表示されます。

Pythonスクリプト、ログ共にテキストエディターに名称案が表示されていますので、テキストエディター機能を使って書き出すことが出来ます。

3 改善と目指す方向

ChatGPTでBlenderPythonスクリプトを作成する行為の効率化を目指してアドオンBlenderChatGPTUI版を作成しました。当面様々な実務にこのアドオンを使って、出来ること、出来ないこと、使い勝手など課題を抽出して改善します。当面はエラーが出た時や機能が実現出来なかった時の対処方法について検討、改善します。

UI版が安定したら、本命であるFunction Calling版作成に取り掛かります。最終的には考古学・実測図専用Agent型を目指します。


2026年6月28日日曜日

postgreSQL→Blender点群表示の準備とスクリプト概要

 Preparing to Display PostgreSQL Point Cloud Data in Blender: Overview of the Script


I have obtained a poster outlining the script and the preparations needed to stream data from PostgreSQL into Blender for point cloud visualization. From a technical standpoint, it looks like this could be implemented right away.


postgreSQLからデータをBlenderに流し点群表示する準備とスクリプト概要のポスターを入手しました。技術的にはすぐにでもできそうです。

1 postgreSQL→Blender点群表示の準備とスクリプト概要


postgreSQL→Blender点群表示の準備とスクリプト概要

ChatGPTに次の質問をしたところ、このポスターがかえってきました。

「postgreSQLのあるテーブルから多数レコードのID、3D座標、各種属性データをBlenderに渡して、Blender3Dビューポートに点群で表示させるとします。そのための準備と作成BlenderPythonスクリプトの概要について教えてください。その点群をgeometry nodesで絞り込みなど分析が可能となると考えてよいでしょうか。」

2 メモ

postgreSQLを単なるデータ保管場所ではなく、研究基盤として位置付け、Blenderをその基盤の上で動く3D可視化・解析フロントエンドと考えることにします。

postgreSQL操作技術の習熟を加速することにします。


遺物3Dデータの正本管理の失敗

 Failure in Managing Master 3D Artifact Data


I plotted 3D artifact data into Blender as a point cloud (or mesh) and performed a virtual CT scan using a Blender Python script. While the process worked fine with test data, it resulted in errors when using the actual production data.

I wasted about half a day investigating the cause, only to discover that the data I had treated as the "master" copy was actually an intermediate working file containing errors from before corrections were made. I realized I had failed to properly manage the master data. This experience made me keenly aware of the need for a master data management system designed to minimize the risk of such errors.


遺物3DデータをBlenderに点群(メッシュ)としてプロットして、そのCT撮影をBlenderPythonスクリプトで行いました。しかし、テストデータでは正常にできるのに、本番データではエラーになってしまいます。

半日ほどその原因追究に時間を浪費しました。結果は正本データと思って使ったデータが修正前の誤りを含む途中作業データだったのでした。正本データ管理に失敗していることに気が付きました。間違いの生まれにくい正本管理システムを作る必要性を痛感しました。

関連記事(正本データを使った記事)2026.06.26記事「Blender3D空間に分布する点群(メッシュ)のCT撮影用Pythonスクリプト

1 エラーの原因

点群(メッシュ)CT撮影用BlenderPythonスクリプトを走らせた時のエラー原因はデータ(csvファイル)の座標値に極端な異常値が含まれていたことです。


極端な異常値(Z値が桁間違いと未調整により、正常な値の約380倍になっている)


極端な異常値の可視化

1点のZ値が極端な異常値であるため、BlenderPythonスクリプトが画像枠をつくることが出来ず、エラーになりました。

2 エラー発生の重大性

このエラーそのものはデータを修正すればよいことであり、さして驚くべきことではありません。私が深刻にその重大性を感じたのは、正本データとされるもので、このようなエラーが発生したことです。1年以上前に、このデータエラーは既に気が付き、正本を訂正しているのです。それにもかかわらず正本データを使って、このエラーが発生したということは、正本管理が適切に行われていないということです。

使ったcsvファイル名称は「北斜面貝層プロット用調整」となっています。ファイル名称にいくら「調整」とか「最終」とか「正本」とか書いてもそれが本当に使えるものであるどうかはまた別問題です。

現在のデータ正本管理システムを抜本的に改善する必要を感じました。

3 データ正本管理システムの抜本的改善

現在のデータの流れは次のようになっています。

postgreSQL→csv出力→Blenderプロット用正本作成→Blender

このデータの流れを次のように変更することにします。

postgreSQL(正本)→csv出力→Blender

postgreSQLを正本とし、データ修正は全てpostgreSQLで行うことにします。出力したcsvファイルは単なるその場限りのBlender用データとします。csvファイルの格下げです。このようにすれば、正本管理が確実にできそうです。

postgreSQLが正本として完成して安定すれば、直ちにその次のシステムに移行することにします。

postgreSQL(正本)→Blender

csvファイルを経由することなく、postgreSQLから直接Blenderにデータを流すことにします。

【余談】なお、postgreSQLからQGISに直接データを流せることはQGISにpostgreSQLアイコンがあることから知っていましたので、こちらの方も同時に試してみることにします。


2026年6月27日土曜日

点群(メッシュ)CT撮影用BlenderPythonスクリプトの機能付加

 Adding Functionality to a Blender Python Script for CT-Style Imaging of Point Clouds (Meshes)


I have added a feature to a Blender Python script—designed for CT-style imaging of point clouds (meshes) distributed within the Blender 3D viewport—that allows the generated cross-sectional projections of the point cloud to be pasted directly into the Blender scene. This tool will be utilized for the 3D spatial analysis of artifacts.


Blender3Dビューポートに分布している点群(メッシュ)のCT撮影用BlenderPythonスクリプトに、生成した点群投影断面図をBlenderに貼りつける機能を追加しました。遺物3D分布分析の強力ツールとして活用します。

この記事は2026.06.26記事「Blender3D空間に分布する点群(メッシュ)のCT撮影用Pythonスクリプト」の続きです。

1 点群(メッシュ)CT撮影用BlenderPythonスクリプトの当初機能と付加機能


点群(メッシュ)CT撮影用BlenderPythonスクリプトの当初機能(点群投影断面図アウトプット)(有吉北貝塚北斜面貝層土器3D分布、2mピッチ)

点群(メッシュ)分布を指定したピッチ毎に配置された断面に投影した投影断面図を作成します。この例では2mピッチで投影断面図(pngファイル)22枚を作成して、パソコンフォルダーにアウトプットしています。


点群(メッシュ)CT撮影用BlenderPythonスクリプトの付加機能(点群投影断面図のBlender内配置)


点群(メッシュ)CT撮影用BlenderPythonスクリプトの付加機能(点群投影断面図のBlender内配置)


点群(メッシュ)CT撮影用BlenderPythonスクリプトの付加機能(点群投影断面図のBlender内配置)

作成した投影断面図をBlender3Dビューポートに配置します。これによりBlender空間の外に出て使われる投影断面図の正確な位置を知ることができるとともに、Blender空間に配置された他の情報と点群との関係理解をより一層深めることができます。

2 メモ

作成した投影断面図の位置が判るので、今回追加した機能はこのツールをより強力なものにします。

投影断面図一枚一枚に位置図を組み込むことなども可能となります。


投影断面図に位置図を組み込んだ例(イメージ)


停電によるIllustrator不調の改善策

 Fixing Illustrator Issues Caused by a Power Outage


I experienced a sudden power outage while working in Illustrator. When I resumed work after the power was restored, the screen turned completely white, making it effectively impossible to continue. After investigating the issue, I selected the "Preview on CPU" option, which resolved the problem. This was the first time I learned that there are two modes: "Preview on CPU" and "Preview on GPU."


Illustrator作業中に突然の停電がありました。停電解消後作業を再開すると画面が真っ白になる現象が生まれて事実上作業が出来ないという不調が生じました。調べて「CPUでプレビュー」をチェックしたところ不調は解消しました。「CPUでプレビュー」と「GPUでプレビュー」の2つがあることをはじめて知りました。

1 突然の停電によるIllustratorの不調

1-1 データ復元

3年ぶりくらいの珍しさだと思いますが、突然の停電がありました。Illustrator作業中でした。停電解消後パソコンを立上げ、Illustratorを開くと復元ファイルが出来ていました。作業データの保存はかなり前でしたが、それにもかかわらず作業データの欠損は感じませんでした。後で確認するとクラウドファイルの自動保存間隔が5分となっていました。自動保存されているという意識はなかったので、得をした気分になりました。

1-2 Illustrator不調

復元ファイルを操作しだすと不調に気が付きました。オブジェクトをクリック(選択)すると画面全部が真っ白になってしまいます。マウスホイールを動かすと画面真っ白は解消されますが、オブジェクト選択は出来ていません。レイヤーウィンドでレイヤを非表示にしても画面が真っ白になります。「だましだまし使う」こともできない状況です。作業が全くできません。

復元ファイルではなく、過去に作成したIllustratorファイルも同じ症状です。

パソコン再立上げやIllustratorアップデータをしても同じ症状です。

2 改善策

ChatGPTに改善策を調べてもらったところ次の策を順番に試す提案がありました。

① GPUプレビューを切る(最優先)

② Illustratorの環境設定をリセット

③ 新規ファイルでも起きるか確認

④ セーフモードでGPUを確認

⑤ グラフィックドライバを入れ直す

⑥ Illustratorを完全初期化

⑦ Windows側の異常確認

⑧ Illustrator以外は正常か

最初の「GPUプレビューを切る」を試したところ不調は嘘のように消えました。


「CPUでプレビュー」をチェックして停電不調が改善

表示→「CPUでプレビュー」と表示されている状態は「GPUでプレビュー」されている状態です。ここをクリックしたので、「GPUでプレビュー」から「CPUでプレビュー」に切り替えたのです。それで不調が解消しました。その後「GPUでプレビュー」に直しましたが不調は生じません。

結果として停電によりGPU描画系が一時的に不調になり、「CPUでプレビュー」に切り替え操作を加えることで不調は解消したようです。

3 メモ

「GPUでプレビュー」「CPUでプレビュー」という項目がIllustratorに存在することにはじめて気が付きました。過去に類似の不調を体験したことがあり、だましだまし使っているうちにいつの間にか解消しましたが、その時の不調もおそらく「CPUでプレビュー」操作を加えれば解消したに違いないと想像しました。


2026年6月26日金曜日

Blender3D空間に分布する点群(メッシュ)のCT撮影用Pythonスクリプト

 Python Script for CT-Style Imaging of Point Clouds (Meshes) in Blender 3D Space


I have created a Python script to perform CT-style imaging on point clouds (meshes) distributed within Blender's 3D space. This allows for the generation of data analogous to medical CT scans of internal organs, but applied instead to the spatial distribution of artifacts within a shell midden. This marks the creation of a prototype for a key tool in 3D spatial analysis of artifacts. Moving forward, I plan to utilize this tool in spatial analysis while refining its usability.


Blender3D空間に分布する点群(メッシュ)のCT撮影用Pythonスクリプトを作成しました。体内臓器のCT撮影と同じようなデータを貝塚貝層内遺物分布にあてはめて生成できます。遺物3D空間分析の重要ツールの一つの祖型ができたことになります。これからこのツールを3D空間分析で活用して、その使い勝手を改善していくことにします。

1 点群(メッシュ)のCT撮影用Pythonスクリプトについて

このスクリプトは、Blender3Dビューポートに分布する点群(メッシュ)について、Y軸方向に多数のXZ断面を設定し、各XZ断面に近傍の点群を投影した投影断面図を作成するBlenderPythonスクリプトです。


点群(メッシュ)のCT撮影

断面図の間隔は0.1mとか0.5mとか1mとか自由に設定できます。また画面や点の色、点の大きさも自由に設定できます。


CT撮影結果(点群投影断面図)1枚目ct_slice_0000.png


CT撮影結果(点群投影断面図)2枚目ct_slice_0001.png


CT撮影結果(点群投影断面図)3枚目ct_slice_0002.png

2 使い方

Blender3Dビューポートで選択された点群(メッシュ)についてCT撮影を行います。点群をgeometry nodesで操作してテーマに沿って絞り込んで表現されている場合でも、その絞り込んだ点群を選択すれば、それを対象にCT撮影します。

下のBlenderPythonスクリプトの設定欄を好みに設定して、点群が配置されているBlenderファイルのテクストエディターに貼りつけ、走らせます。

Blenderファイルが存在するフォルダーにct_slices名称のサブフォルダーがつくられ、点群投影断面図がその中に生成します。生成スピートは高速です。(自分のパソコンでは84枚で10秒ほどです。)

3 点群(メッシュ)のCT撮影用Pythonスクリプト


import bpy
import os
import math

# ==========================
# ユーザー設定
# ==========================
# スライス厚み (m) : Y 方向の幅
SLICE_THICKNESS = 0.1

# 出力画像の「基準横幅」(px)
# 高さはバウンディングボックスの XZ 比率を保つように自動計算されます
IMAGE_WIDTH = 1024

# 点の色 (R, G, B, A) 0.0〜1.0
POINT_COLOR = (1.0, 1.0, 0.0, 1.0)  # kiiro
# 背景色 (R, G, B, A)
BACKGROUND_COLOR = (0.027, 0.051, 0.498, 1.0)  # ao

# 何ピクセル四方に塗るか(点の大きさ)
POINT_SIZE = 2  # 1なら1ピクセルのみ,2なら3x3ピクセル,3なら5x5ピクセル相当

# 出力先ディレクトリ(.blendファイルからの相対パス)
OUTPUT_DIR = "//ct_slices"

# 対象オブジェクトを「選択中」に限定するか
# True: 3Dビューポートで選択中のメッシュだけを対象にします
# False: シーン内の表示中メッシュを対象にします
USE_SELECTED_OBJECTS_ONLY = True

# Geometry Nodes / モディファイア適用後の「ビューポート表示結果」から頂点を取るか
# Geometry Nodesで点群を絞って表示している場合は True のまま使ってください
USE_EVALUATED_VIEWPORT_MESH = True

# 非表示オブジェクトを除外するか
EXCLUDE_HIDDEN_OBJECTS = True
# ==========================



def collect_world_vertices():
    """選択中(または表示中)メッシュの頂点をワールド座標で取得。

    USE_EVALUATED_VIEWPORT_MESH=True の場合は、Geometry Nodesやモディファイア適用後の
    ビューポート評価結果から頂点を取得する。
    """
    view_layer = bpy.context.view_layer
    depsgraph = bpy.context.evaluated_depsgraph_get()

    if USE_SELECTED_OBJECTS_ONLY:
        source_objects = list(bpy.context.selected_objects)
    else:
        source_objects = list(bpy.context.scene.objects)

    objects = []
    for obj in source_objects:
        if obj.type != 'MESH':
            continue
        if EXCLUDE_HIDDEN_OBJECTS and (obj.hide_get(view_layer=view_layer) or obj.hide_viewport):
            continue
        objects.append(obj)

    print("対象オブジェクト:", ", ".join(obj.name for obj in objects) if objects else "なし")

    points = []
    for obj in objects:
        mat = obj.matrix_world

        if USE_EVALUATED_VIEWPORT_MESH:
            obj_eval = obj.evaluated_get(depsgraph)
            mesh = None
            try:
                mesh = obj_eval.to_mesh(preserve_all_data_layers=False, depsgraph=depsgraph)
                for v in mesh.vertices:
                    co_world = mat @ v.co
                    points.append((co_world.x, co_world.y, co_world.z))
            finally:
                if mesh is not None:
                    obj_eval.to_mesh_clear()
        else:
            mesh = obj.data
            for v in mesh.vertices:
                co_world = mat @ v.co
                points.append((co_world.x, co_world.y, co_world.z))

    return points


def compute_bounds(points):
    """頂点群の XYZ の最小値・最大値を返す"""
    xs = [p[0] for p in points]
    ys = [p[1] for p in points]
    zs = [p[2] for p in points]

    min_x, max_x = min(xs), max(xs)
    min_y, max_y = min(ys), max(ys)
    min_z, max_z = min(zs), max(zs)

    return (min_x, max_x, min_y, max_y, min_z, max_z)


def bucket_points_by_slice(points, min_y, max_y, thickness):
    """Y方向のスライスごとに頂点をバケツ分けしたリストを返す"""
    if max_y - min_y == 0.0:
        num_slices = 1
    else:
        num_slices = int(math.floor((max_y - min_y) / thickness)) + 1

    slices = [[] for _ in range(num_slices)]

    for (x, y, z) in points:
        idx = int((y - min_y) / thickness)
        # 安全のためクランプ
        idx = max(0, min(num_slices - 1, idx))
        slices[idx].append((x, y, z))

    return slices, num_slices


def create_blank_image(name, width, height, bg_color):
    """背景色で塗られた空画像を作成して返す"""
    img = bpy.data.images.new(name=name, width=width, height=height, alpha=True, float_buffer=True)

    # すべて背景色で初期化
    r, g, b, a = bg_color
    num_pixels = width * height
    pixels = [0.0] * (num_pixels * 4)
    for i in range(num_pixels):
        base = i * 4
        pixels[base]     = r
        pixels[base + 1] = g
        pixels[base + 2] = b
        pixels[base + 3] = a

    img.pixels = pixels
    return img


def draw_points_to_image(img, points_3d, bounds, point_color, point_size):
    """XZ平面に投影した点群を画像に描画する"""
    min_x, max_x, _, _, min_z, max_z = bounds
    width = img.size[0]
    height = img.size[1]

    # 既存のピクセルデータを「リスト」としてコピー(ここが重要)
    px = list(img.pixels)

    # XZ範囲がゼロにならないように
    range_x = max_x - min_x
    range_z = max_z - min_z
    if range_x == 0.0:
        range_x = 1.0
    if range_z == 0.0:
        range_z = 1.0

    scale_x = (width - 1) / range_x
    scale_z = (height - 1) / range_z

    pr, pg, pb, pa = point_color

    # point_size=1 のときは1ピクセルのみ、
    # 2以上のときは +-point_size ピクセルに塗る
    radius = max(0, point_size - 1)

    for (x, y, z) in points_3d:
        u = int((x - min_x) * scale_x)
        v = int((z - min_z) * scale_z)

        # 画像内に収まるチェック
        if u < 0 or u >= width or v < 0 or v >= height:
            continue

        for du in range(-radius, radius + 1):
            for dv in range(-radius, radius + 1):
                uu = u + du
                vv = v + dv
                if 0 <= uu < width and 0 <= vv < height:
                    idx = (vv * width + uu) * 4
                    px[idx]     = pr
                    px[idx + 1] = pg
                    px[idx + 2] = pb
                    px[idx + 3] = pa

    # 修正したリストを pixels に戻す
    img.pixels = px


def main():
    # 頂点収集
    points = collect_world_vertices()
    if not points:
        print("メッシュ頂点が見つかりません。対象オブジェクトを確認してください。")
        return

    # 全体バウンディングボックス
    bounds = compute_bounds(points)
    min_x, max_x, min_y, max_y, min_z, max_z = bounds
    print("Bounds X:[{}, {}], Y:[{}, {}], Z:[{}, {}]".format(min_x, max_x, min_y, max_y, min_z, max_z))

    # XZ方向の実長
    range_x = max_x - min_x
    range_z = max_z - min_z

    # 万が一ゼロにならないように
    if range_x == 0.0:
        range_x = 1.0
    if range_z == 0.0:
        range_z = 1.0

    # 横幅を基準にしてピクセルスケールを決定 (px / m)
    pixels_per_unit = IMAGE_WIDTH / range_x

    # XZ の比率をそのままに縦高さを決める
    img_width = IMAGE_WIDTH
    img_height = max(1, int(round(range_z * pixels_per_unit)))

    print(f"Image size (W x H): {img_width} x {img_height} (px)")

    # スライスごとに頂点を振り分け
    slices, num_slices = bucket_points_by_slice(points, min_y, max_y, SLICE_THICKNESS)
    print("スライス数 :", num_slices)

    # 出力ディレクトリ準備
    out_dir = bpy.path.abspath(OUTPUT_DIR)
    os.makedirs(out_dir, exist_ok=True)
    print("出力先ディレクトリ:", out_dir)

    # スライスごとに画像生成
    for i in range(num_slices):
        slice_points = slices[i]

        # スライス名
        img_name = f"ct_slice_{i:04d}"
        print(f"生成中: {img_name} (頂点数: {len(slice_points)})")

        # 空画像作成(ここで計算した img_width, img_height を使用)
        img = create_blank_image(img_name, img_width, img_height, BACKGROUND_COLOR)

        # 頂点を描画(XZ 投影)
        if slice_points:
            draw_points_to_image(img, slice_points, bounds, POINT_COLOR, POINT_SIZE)

        # PNGで保存
        filepath = os.path.join(out_dir, img_name + ".png")
        img.filepath_raw = filepath
        img.file_format = 'PNG'
        img.save()

    print("完了しました。")


if __name__ == "__main__":
    main()

有吉北貝塚北斜面貝層の骨歯3D分布CT撮影動画

 Video of 3D Bone and Tooth Distribution in the Northern Slope Shell Midden at Ariyoshi-kita Shell Midden (CT Scan)


I created a video visualizing the 3D distribution of bones and teeth (34,050 items) within the shell midden on the northern slope of the Ariyoshi-kita Shell Midden site by generating projected cross-sectional views at 0.5-meter intervals. Using a Python script, I processed CT scan data (69 frames) to produce a video with a frame interval of 0.2 seconds. I plan to compare these results with CT scan data of pottery and stone tools in the future.


有吉北貝塚北斜面貝層の骨歯3D分布(34050件)について幅0.5mスリット毎に投影断面図を作成し、動画としました。PythonスクリプトでCT撮影(コンピュータ断層撮影、69コマ)し、0.2秒間隔の動画にしたものです。今後土器や石器のCT撮影結果と比較する予定です。

この記事は2026.06.26記事「有吉北貝塚北斜面貝層の石器3D分布CT撮影動画」の続きです。

1 有吉北貝塚北斜面貝層の骨歯3D分布(34050件)


有吉北貝塚北斜面貝層の骨歯3D分布(34050件)

バウンティングボックスの大きさ:13.7m×11.7m×34.0m

2 有吉北貝塚北斜面貝層の骨歯3D分布CT撮影動画


有吉北貝塚北斜面貝層の骨歯3D分布CT撮影動画

画像の大きさ13.7m×11.7m

延長34.0m区間を0.5m幅スリット毎に土器分布投影図を作成(69コマ)し、0.2秒間隔で表示する動画。

骨歯は34050件。

3 メモ

土器、石器、骨歯のそれぞれの3D分布CT撮影画像比較は今後行う予定です。


有吉北貝塚北斜面貝層の石器3D分布CT撮影動画

Video of 3D Stone Tool Distribution in the Northern Slope Shell Midden at Ariyoshi-kita Shell Midden (CT-style Visualization)


I created a video visualizing the 3D distribution of stone tools (2,045 items) found in the northern slope shell midden at Ariyoshi-kita Shell Midden by generating projected cross-sections at 0.5-meter intervals. Using a Python script, I simulated a CT scan (computed tomography; 80 frames) to produce a video with 0.2-second intervals between frames. I plan to compare these results with CT-style visualizations of pottery, bones, and teeth in the future.


 有吉北貝塚北斜面貝層の石器3D分布(2045件)について幅0.5mスリット毎に投影断面図を作成し、動画としました。PythonスクリプトでCT撮影(コンピュータ断層撮影、80コマ)し、0.2秒間隔の動画にしたものです。今後土器や骨歯のCT撮影結果と比較する予定です。

この記事は2026.06.25記事「有吉北貝塚北斜面貝層の土器3D分布CT撮影動画」の続きです。

1 有吉北貝塚北斜面貝層の石器3D分布(2045件)


有吉北貝塚北斜面貝層の石器3D分布(2045件)

バウンティングボックスの大きさ:13.2m×21.6m×41.9m

2 有吉北貝塚北斜面貝層の石器3D分布CT撮影動画


有吉北貝塚北斜面貝層の石器3D分布CT撮影動画

画像の大きさ13.2m×21.6m

延長41.9m区間を0.5m幅スリット毎に土器分布投影図を作成(80コマ)し、0.2秒間隔で表示する動画。

石器は20145件。

3 メモ

土器、石器、骨歯のそれぞれの3D分布CT撮影画像比較は今後行いますが、土器と石器は似ています。


2026年6月25日木曜日

有吉北貝塚北斜面貝層の土器3D分布CT撮影動画

 Video of CT-style visualization showing pottery distribution in the shell midden on the north slope of the Ariyoshi-kita Shell Midden


I created a video showing the 3D distribution of pottery (17,484 items) found in the shell midden on the north slope of the Ariyoshi-kita Shell Midden by generating projected cross-sections at 0.5-meter slit intervals. Using a Python script, I simulated a CT scan (computed tomography) consisting of 85 frames to produce a video with 0.2-second intervals between frames. I intend to utilize this CT-style imaging technique as a powerful tool for analyzing the 3D distribution of artifacts in the future.


有吉北貝塚北斜面貝層の土器3D分布(17484件)について幅0.5mスリット毎に投影断面図を作成し、動画としました。PythonスクリプトでCT撮影(コンピュータ断層撮影、85コマ)し、0.2秒間隔の動画にしたものです。今後遺物の3D分布分析の有力なツールとしてCT撮影を活用します。

1 有吉北貝塚北斜面貝層の土器3D分布(17484件)


有吉北貝塚北斜面貝層の土器3D分布(17484件)

バウンティングボックスの大きさ:12.6m×22.4m×42.5m

2 有吉北貝塚北斜面貝層の土器分布CT撮影動画


有吉北貝塚北斜面貝層の土器分布CT撮影動画

画像の大きさ12.6m×22.4m

延長42.5m区間を0.5m幅スリット毎に土器分布投影図を作成(85コマ)し、0.2秒間隔で表示する動画。

土器は17484件。

3 メモ

PythonスクリプトでCT撮影(コンピュータ断層撮影、85コマ)し、0.2秒間隔の動画にしたものです。今後遺物の3D分布分析の有力なツールとしてCT撮影を活用します。