ラベル 技術メモ の投稿を表示しています。 すべての投稿を表示
ラベル 技術メモ の投稿を表示しています。 すべての投稿を表示

2025年12月17日水曜日

技術メモ 断面幅20㎝スリットから出土した遺物の分層別集計方法

 Technical Note: A method for counting artifacts by layer excavated from a 20cm-wide slit.


I developed a method for counting artifacts by layer excavated from a 20cm-wide slit. I used layer lines from Illustrator and Blender Python to count the artifacts.


断面幅20㎝スリットから出土した遺物の分層別集計方法を具現しました。Illustrator由来の分層線を利用してBlenderPythonで集計します。

1 断面幅20㎝スリットから出土した遺物


断面幅20㎝スリットから出土した遺物(11断面)

2025.12.06記事「11断面幅20㎝スリットから出土した遺物抽出」参照

2 断面幅20㎝スリットから出土した遺物の分層別集計方法

2-1 分層別集計用メッシュオブジェクト作成


分層と遺物分布

分層線はIllustrator由来のカーブ

遺物は点群で2つの属性(id,bunruicode)を具備しています。


S3混土貝層の集計用メッシュオブジェクト

分層線(カーブ)から押し出しと面貼りを利用して、遺物を完全に内包するメッシュオブジェクトを作成します。

2-2 BlenderPythonによる分層内遺物集計

集計用BlenderPythonをChatGPT支援で作成しました。集計は分層毎に行い、遺物リストと分類コード別集計(統計)の2つのcsvファイルを生成します。


集計と統計のcsvファイル

3 メモ

少し前まで、手にカウンターを持って、画面を見ながら数えるようなこともあったのですが、そうした活動はようやく過去のものとなりました。


2025年12月16日火曜日

技術メモ Illustratorで描いたパスをBlenderにプロットする方法

 Technical Note: How to Plot Paths Drawn in Illustrator to Blender


I plotted the shell boundary lines of a section drawing drawn in Illustrator to Blender as an SVG file. This eliminated the need to draw the same boundary lines twice in Blender.


Illustratorで描いたセクション図の貝層界線をSVGファイルでBlenderにプロットしました。これにより、Blenderで同じ界線を描く二度手間が解消されました。

1 Illustratorで描いたパスのBlenderプロット


Illustratorで描いたパスのBlenderプロット

Illustratorで描いた貝層界線(パス)をSVGファイル出力し、Blenderにインポートするとカーブになります。カーブの位置、大きさを正確に調整してからメッシュオブジェクトにすることにより、遺物点群集計などに使うことができます。


Illustratorで貝層界線(パス)を描いている様子


Illustratorで描いたパス

2 メモ

界線カーブをメッシュオブジェクトに変換し、押し出しにより厚みを持たせ、両側に面を貼ることで、貝層分層の姿に対応した3次元メッシュオブジェクトをつくることができます。このメッシュオブジェクトを利用して、スリットに分布する遺物を貝層分層毎に把握、集計できるようになります。


スリット分布遺物の貝層分層別集計用のメッシュオブジェクト

技術メモ セクション図を正確にBlenderにプロットする方法

 Technical Note: How to Accurately Plot Sectional Drawings in Blender


I've written a note on how to accurately plot sectional drawings in Blender. You can accurately plot them by calculating the image's center of gravity and size in the same units as the Blender3D viewport.


セクション図を正確にBlenderにプロットする方法をメモしました。Blender3Dビューポートと同じ単位で画像の重心位置と画像大きさを求めれば、正確にプロットできます。

1 セクション図を正確にBlenderにプロットする方法


セクション図を正確にBlenderにプロットする方法

1-1 画像重心位置、画像寸法を求める

画像ソフト(Illustratorなど)で画像の重心位置と寸法をBlender3Dビューポートと同じ単位で求めます。

画像ソフトによる計測値(例 pixel)を画像内スケール(例 Blender3Dビューポートで1mに該当する距離のpixel値)で換算してBlender3Dビューポート単位とします。

1-2 Blenderプロット

1-2-1 画像追加

Blenderに画像をメッシュオブジェクトで追加します(追加→画像→平面メッシュ)。次に画像の向きを回転で正しく調整します。

1-2-2 位置と寸法の記入

画像重心位置の数値をBlender→アイテム→トランスフォーム→位置の欄に記入します。

画像寸法の数値をBlender→アイテム→トランスフォーム→寸法の欄に記入します。

これで画像は正確にプロットされます。

2 メモ

発掘調査報告書掲載断面図は縮図略記トレースの過程で誤差が入り込んでいますが、セクション図原本から作成した図面はそれより誤差が少ないので、今後作成したセクション図のプロットを進めることにします。

3 参考

Blenderに画像をメッシュオブジェクトで追加する手順は追加→画像→平面メッシュです。この平面メッシュの説明が「画像ファイルからメッシュ平面を適切なアスペクト比で作成します」となっています。

この説明を読んで、「適切なアスペクト比に直されてしまう(縦横比を変更されてしまう)」可能性を心配したのですが、調べると、「画像ファイルからメッシュ平面を画像ファイル通りの正確なアスペクト比で作成します」という意味であることが判りました。


2025年11月23日日曜日

技術メモ 標準偏差による最近隣距離4区分

 Technical Note: Four-Level Classification of Nearest Neighbor Distance Based on Standard Deviation


I developed my own four-level classification based on the standard deviation of 3D nearest neighbor distances for artifacts and applied it to bones. The density of bone distribution became clear. This is a record of the behavior of bone dumping, transportation, and deposition.


遺物3D最近隣距離の標準偏差による4区分を自分なりにまとめ、骨に適用しました。骨分布の密集性が明らかになりました。その様子は骨投棄→移動→堆積の挙動記録です。

1 遺物3D最近隣距離の標準偏差による4区分

貝層内遺物の3D最近隣距離を計測し、「平均からの離れ(標準偏差)」を基準にして、最小値、最大値も使い、データの相対的位置(かなり小さい、やや小さい、やや大きい、かなり大きい)の4区分を遺物3D分布分析に利用しています。この4区分の定義と名称をこのブログでは次のように設定します。

●名称

標準偏差による最近隣距離4区分

●定義

区分1:最小値~(平均値-標準偏差)

区分2:(平均値-標準偏差)~平均値

区分3:平均値~(平均値+標準偏差)

区分4:(平均値+標準偏差)~最大値

詳細には次のように定義します。

最小値≦区分1≦(平均値-標準偏差)

(平均値-標準偏差)<区分2≦平均値

平均値<区分3≦(平均値+標準偏差)

(平均値+標準偏差)<区分4≦最大値

●区分の意味

区分1:値が平均よりかなり小さい(遺物密集)

区分2:値がやや小さい~平均寄り(遺物やや密集)

区分3:値が平均寄り~やや大きめ(遺物やや散在)

区分4:値が平均よりかなり大きい(遺物散在)

●区分の表現

区分1(密集)

区分2(やや密集)

区分3(やや散在)

区分4(散在)

2 骨の4区分結果

2-1 骨 標準偏差による最近隣距離4区分 区分1(密集)


骨 標準偏差による最近隣距離4区分 区分1(密集)

   0.005~0.037m

2-2 骨 標準偏差による最近隣距離4区分 区分2(やや密集)


骨 標準偏差による最近隣距離4区分 区分1(やや密集)

   0.037~0.107m

2-3 骨 標準偏差による最近隣距離4区分 区分3(やや散在)


骨 標準偏差による最近隣距離4区分 区分3(やや散在)

   0.107~0.177m

2-4 骨 標準偏差による最近隣距離4区分 区分4(散在)


骨 標準偏差による最近隣距離4区分 区分4(散在)

   0.177~2.043m

2-5 観察

骨の密集域のまわりにやや密集域、そのまわりにやや散在域、さらにそのまわりに散在域が分布しています。

この分布の様相は、骨が貝塚に投棄され、斜面を移動して最終的に移動が停止した状態を表現しています。

貝塚縁辺部に骨密集域が存在しているのは、投棄された骨のかなりの部分の移動量が小さいため、投棄された場所を結果として表現していると仮説します。

3 骨 標準偏差による最近隣距離4区分の谷中部断面

骨 標準偏差による最近隣距離4区分の谷中部断面

骨 標準偏差による最近隣距離4区分 区分1(密集)3Dモデルに谷中部の断面を追記


谷中部断面


谷中部断面の位置

有吉北貝塚北斜面貝層

3DF Zephyr v8.031でアップロード


3Dモデルの動画


3Dモデルの画像


3Dモデルの画像

4 考察


考察

骨 標準偏差による最近隣距離4区分の谷中部断面を次のように仮説的に解釈しました。

貝塚縁辺部から骨が投棄され、その骨の一定部分はその場に残るが、それ以外は斜面を貝層とともに下方に移動して各所に堆積する。骨は大きさが小さいので移動量が小さく、土器のように斜面下部に密集して堆積するには至らなかった。

2025年11月13日木曜日

技術メモ 遺物3D分布の観察用断面作成

 Technical Note: Creating Cross Sections for Observing 3D Distribution of Artifacts


To efficiently observe the 3D distribution of numerous artifacts, it is important to create cross sections for observation. I have confirmed how to extract arbitrary cross sections in Blender and have made notes on the method.


多数遺物の3D分布を効率的に観察するためには、観察用の断面を作成することが大切です。任意の断面をBlenderで切り出す方法を確認しましたので、メモしました。

1 遺物3D分布の観察用断面作成方法

土器3D分布(土器数17481件、点群表示)を例に任意断面の作成方法を確認しました。

1-1 任意断面の選択

Blender3Dビューポートで点群表示された遺物分布から任意断面を選択します。

選択はボックス選択を使うので、断面方向が画面上下になるように遺物分布を揃えます。

オブジェクトモードで点群全体を選択してから、編集モードに移行し、一旦選択を外してから、必要な断面をボックス選択します。その際、「透過表示を切り替え」をオンにしておきます。


選択モードで点群が何も選択されていない様子


選択モードでボックス選択で断面が選択された様子


選択モードで点群が何も選択されていない様子(上からオルソ投影)


選択モードでボックス選択で断面が選択された様子(ウエイからオルソ投影)

1-2 選択点群のオブジェクト化

選択点群をShift+Dでコピーします。次にPで点群全体から分離します。

切り離された選択点群をgeometry nodesでオブジェクト表示にします。ここではICO球で表示しました。

次にgeometry nodesをモディファイア「適用」して、オブジェクトとして完全に実体化します。

実体化されたオブジェクトが観察用断面です。

1-3 オブジェクトのエクスポート

自分の場合、観察用オブジェクトをWabefront(.obj)でエクスポートして、Blenderより観察しやすい3DF Zephyr Liteにインポートして観察したり、Sketchfabに投稿したり、動画撮影します。


観察用断面(3DF Zephyr Lite画面)

土器3D分布の観察用断面(テスト)


土器3D分布の観察用断面(テスト)動画

2 観察用断面(テスト)について

観察断面を作成すると、周辺の土器分布による視覚的影響が完全に除去でき、観察精度が飛躍的に向上します。

観察用断面(テスト)をみると土器の層状分布が観察できて、貝層発達を考える上でとても重要な事柄を確認できることが直観できます。また斜面性貝層から流路性貝層・土層に移行する関係も観察できます。この断面の詳しい観察は改めて別記事で行います。


2025年11月4日火曜日

技術メモ Blenderにプロットした遺物(頂点)の属性確認方法

 Technical Note: How to Check the Attributes of Artifacts (Vertices) Plotted in Blender


The artifact database (55,892 records, 39 attributes) for the shell layer on the northern slope of the Ariyoshikita Shell Mound was plotted directly as vertices in Blender. I discovered a way to check the attribute data for a single vertex in Blender, so I've written this note.


有吉北貝塚北斜面貝層の遺物データベース(55892レコード、39属性)はそのままBlenderに頂点でプロットしてあります。Blender画面で頂点1つのある属性のデータを確認する方法を知りましたので、メモしました。

1 遺物データベースのBlender取り込み

有吉北貝塚北斜面貝層の遺物データベース(55892レコード、39属性)はそのままBlenderに頂点でプロットしてあります。


55892レコード、39属性がそのままBlenderにプロットされている様子

2 Blender画面で特定頂点の特定属性データを知る方法


Blender画面で特定頂点の特定属性データを知る方法

・編集モードで特定頂点を表示します。

・オブジェクトデータプロパティ→属性→(知りたい)属性を選択

・メッシュ→属性を設定

この操作で画面にその属性のデータが表示されます。

なお、属性のデータに日本語を使うと不都合が発生する可能性があるので、自分は使っていません。自分は属性の値はすべて類型区分の結果である整数値にしています。

3 メモ

Blender3Dビューポートでは頂点分布を観察しますが、上記属性データを知る方法は「この頂点は何を意味するのか」という疑問に即座に答えを出してくれるので、とても有用です。

4 参考

統計分析(例 全遺物の最近隣距離計測)はBlenderの外でPythonで行い、その結果をBlenderにプロットしています。

Blenderは主に種別、属性区分別などの表示ツールとして使っています。

Blenderで幾つかのデータを複合表示して、それを新たなデータとしてcsvファイルに書き出し、そのcsvファイルをPythonで分析することもあります。


2025年10月29日水曜日

技術メモ 凹みのある点群のラップ

 Technical Note: Wrapping Concave Point Clouds


I learned that Blender's Shrinkwrap modifier can wrap point clouds with objects, so I made a note of it. With some ingenuity, you can even wrap point clouds with concave 3D shapes.


BlenderのShrinkwrapモディファイアで、点群をオブジェクトで包むことができることを知りましたのでメモしました。工夫すれば点群に凹みがある3D形状でもそれに対応して包むことができます。

1 点群の事例

3D形状が馬蹄形の点群を事例とします。


点群の事例(上からオルソ投影)


点群の事例(斜めから)

2 ICO球を使ったラップ


ICO球で点群を内包した状況


Shrinkwrapモディファイアで包んだ状況

凸包のようなオブジェクトになり、馬蹄形特有の凹みが表現されていません。

CUBEなどを使っても同じ結果となります。

3 馬蹄形のオブジェクトを使ったラップ


馬蹄形オブジェクトで点群を内包した状況


Shrinkwrapモディファイアで包んだ状況

馬蹄形形状で包むことができました。点群の3D形状を観察して、それに近いオブジェクトを作成して、点群をターゲットにShrinkwrapモディファイアを適用すると、点群の3D形状が反映できます。

4 馬蹄形オブジェクトの作成


・オルソ投影上から画面で馬蹄形をベジェ曲線で描く


・べジェ曲線をメッシュに変換して面を貼る


・面を法線方向に押し出して立体化し、点群を内包する

5 メモ

この技術により、Blender3Dビューポートに頂点でプロットしてある遺物データから、遺物分布範囲をオブジェクトで特定できます。特定した遺物分布範囲をつかって、例えば一例として、実際の遺物分布から計算できる最近接距離平均と遺物分布範囲内の仮想ランダム分布の最近接距離平均の比較ができるようになります。これにより遺物分布の偏り(密集性)を数値として捉えることができます。





2025年10月27日月曜日

技術メモ BlenderPythonの「Runtime Error:csvに列IDがありません」の解決

 Technical Note: Fixing BlenderPython's "Runtime Error: CSV file contains no column ID"


I'm using a BlenderPython script that plots CSV files containing data on tens of thousands of artifacts (IDs, xyz coordinates, and numerous attributes) as vertices in the Blender3D viewport within a second. However, the other day, I suddenly got the error "Runtime Error: CSV file contains no column ID," and was unable to plot. I've written a note about how to fix this.


数万遺物データを格納したcsvファイル(ID、xyz座標、多数の属性)を、Blender3Dビューポートに1秒以内に頂点としてプロットするBlenderPythonスクリプトを重宝して活用しています。ところが先日突然、「Runtime Error:csvに列IDがありません」が出て、プロットできなくなりました。その解決策をメモしました。

1 エラーの様子


遺物プロットに使っているBlender画面(2画面用にカスタマイズ、右端コンパートメントがBlenderPythonを記述したテキストエディター)

数万遺物データを格納したcsvファイル(ID、xyz座標、多数の属性)を、Blender3Dビューポートに1秒以内に頂点としてプロットできる優れモノのBlenderPythonスクリプトを毎日重宝して活用しています。ところが先日突然、「Runtime Error:csvに列IDがありません」が出て、プロットできなくなりました。csvファイルに異常は見つかりません。ID列は正常です。試しに列を入れ替えて、先頭列をxにしたところ、「Runtime Error:csvに列xがありません」が出てしまいます。

2 エラーの原因

ChatGPTに調査依頼してエラー原因を突きとめることができました。

BlenderPythonにおけるcsvファイル読込エンコードが encoding="utf-8"であるのに対して、csvファイルのエンコードが"utf-8-sig"であったので読み込めなかったのです。

自分はcsvファイルとExcelの間での文字化け回避などで"utf-8"と"shift-jis"の違いはいつも意識していたのですが、今回はじめて"utf-8-sig"というエンコードに直面して、エラー解決できなかったのです。"utf-8-sig"というエンコードのcsvファイルができたのは、2つのcsvフィアルを操作して1つの新しいcsvファイルを作成するPythonスクリプトをChatGPT支援で作った際に混入したことも判りました。

エラーとなったcsvをWZエディターで開き、文字コードを見ると、確かにUTF-8(BOM付き)になっています。


エラーとなったcsvファイルの文字コード

エンコード"utf-8-sig"のcsvファイルでは最初列名文字先頭に「BOM(Byte Order Mark)」という目に見えない文字(`\ufeff`)が入り、列名が\ufeffIDになり、スクリプトで指定した列名IDと異なり、エラーとなりました。

3 解決策

BlenderPythonスクリプトのcsvファイル読み込み部で、encoding="utf-8"をencoding="utf-8-sig"に修正して対処しました。これで"utf-8"のcsvファイルも"utf-8-sig"のcsvファイルも正常に読み込むことができます。

また原因がわかりましたので、同じエラーが類似BlenderPythonスクリプトで出た時は上記のように修正するか、csvファイルをWZエディターで読込み、"utf-8"に変更して書き出して使うことにします。


2025年9月7日日曜日

技術メモ 3DモデルのGigaMesh Software Framework展開前に行うMeshLab変換の意義

 Technical Note: The Significance of MeshLab Conversion Before Deploying 3D Models to the GigaMesh Software Framework


3D models (Wabefront (.obj)) must be converted to MeshLab before deploying them in the GigaMesh Software Framework. After four years, I finally understand why this is necessary. ChatGPT explained it to me.


3Dモデル(Wabefront(.obj))をGigaMesh Software Framework展開する前にMeshLab変換が必要です。なぜ必要なのか、4年経ってようやく理解できました。ChatGPTに教えてもらいました。

1 3DモデルのGigaMesh Software Framework展開方法

2021.09.27記事「GigaMesh Software Frameworkの使い方 その1 6面図の作り方

2021.09.30記事「GigaMesh Software Frameworkの使い方 その2 展開図の作り方


MeshLabに3Dモデルを読み込んだ様子

2 3DモデルのGigaMesh Software Framework展開前に行うMeshLab変換の意義

【ChatGPTへの質問】

フォトグラメトリソフト(3DF Zephyr Lite)で3Dモデルを作成し、それをGigaMesh Software Frameworkで展開しています。その際、3Dモデル(Wabefront(.obj))をMeshLabで変換(MeshLabに3Dモデル読み込み→書き出し)しないとGigaMesh Software Frameworkではテクスチャが貼り付きません。従って必ずMeshLabでWabefront(.obj)を変換します。

このMeshLabによる変換とは何を変換しているのか教えてください。MeshLabによる変換の意義を教えてください。

【ChatGPT回答】

良い質問です。結論から言うと、MeshLabでの「変換」とは、OBJファイルの形式・構造を標準的な形に書き直していることです。これは単なる「形式変換」や「保存し直し」に見えますが、実は以下のような意義があります。

1. OBJファイルの仕様の違いを吸収する

OBJ(Wavefront .obj)は非常に古いフォーマットで、拡張仕様や書き方の揺れがあります。

頂点(v)、法線(vn)、テクスチャ座標(vt)の書き出し順序や有無

マテリアルファイル(.mtl)の参照方法

パス表記(相対パス/絶対パス)

エンコードや改行コードの違い

Zephyr Liteが出力するOBJは、GigaMeshが想定している書式とは一部異なり、そのままではテクスチャ情報が正しく読み込めない場合があります。MeshLabで一度読み込み→書き出しを行うと、MeshLabが内部で解釈し、標準的なOBJ/MTLの形式に整理して出力してくれます。

2. マテリアルとテクスチャのリンクを再構成する

OBJには通常、外部ファイル(.mtl)を参照してマテリアルやテクスチャを読み込みますが、以下の問題が起こりやすいです。

.mtlファイル内のテクスチャパスがZephyr独自の書き方になっている

ファイル名にスペースや特殊文字が含まれている

相対パスが不正確でGigaMeshが見つけられない

MeshLabはこれらを適切に書き直し、パスを正規化します。そのため、GigaMeshで正しくテクスチャが貼り付くようになります。

3. データの整合性を保証する

フォトグラメトリ由来のモデルには、次のような「クセ」が含まれている場合があります。

重複頂点や未使用のテクスチャ座標

異常な法線の記録

サポートされないOBJ要素(グループ指定、smoothing groupなど)

MeshLabで「インポートしてエクスポート」する過程で、余計な情報が整理され、純粋な形状+マテリアル+テクスチャのセットに変換されます。

まとめ:MeshLab変換の意義

OBJ/MTLの仕様の揺れを吸収し、標準化する

テクスチャリンクを正しく修正する

不要・不正確なデータを整理して、GigaMeshが読み込めるようにする

つまり、MeshLabは「中継フィルタ」として働き、Zephyr出力 → GigaMesh入力 の間で互換性と安定性を保証する変換をしているのです。

👉 確認ですが、ユーザーさんはMeshLabで「単に読み込み→そのままエクスポート」していますか? それともエクスポート時に何か特定のオプション(例:法線の再計算、テクスチャを埋め込む、など)を設定していますか?

【あなた:】

MeshLabで「単に読み込み→そのままエクスポート」しています。

【ChatGPT:】

なるほど、ありがとうございます 🙆‍♂️

それならまさに 「MeshLabが内部でOBJ/MTLを標準化し直している」 だけで、ユーザー側の操作は不要という状況ですね。

具体的に何が起こっているか

1. OBJの構造整理

Zephyrが出力したOBJは、OBJの「ゆるい仕様」の範囲で独自の順序や書き方をしていることがあります。

MeshLabが読み込むと、一度内部の統一的なデータ構造に変換されます。

その後、MeshLabからエクスポートすると、一般的な書式に従ったOBJ/MTLファイルとして書き直されます。

2. MTLとテクスチャ参照の修正

Zephyrが書き出したMTLファイルには、テクスチャファイルの参照に「相対パスのずれ」や「特殊な記述」が含まれていることがあります。

MeshLabは読み込み時にそれを解釈し、エクスポート時に単純で標準的な相対パスに書き換えます。

その結果、GigaMeshがテクスチャを正しく見つけて読み込めるようになります。

3. データのクリーンアップ

ZephyrのOBJには、未使用のUV座標・法線・マテリアル参照が残っている場合があります。

MeshLabは不要な情報を整理してからエクスポートするため、余分なデータが除去されたクリーンなOBJ/MTLになります。

●意義まとめ

ユーザーがMeshLabで「ただ読み込んで書き出す」だけでも、

ファイル形式のゆれを吸収

MTL/テクスチャ参照を修正

不要なデータを整理

という処理が裏で行われており、結果としてGigaMeshが問題なくテクスチャを扱えるようになっています。

🔎 ちなみに、もしMeshLabを経由せずに直接GigaMeshで使いたい場合は、ZephyrのOBJエクスポート設定(特に「テクスチャの書き出し方法」や「マテリアルパス」)を調整すれば解決できる可能性もあります。

👉 ご希望があれば、「MeshLabを経由せずZephyr→GigaMeshを直結できる設定」についても調べて整理してみますか?

【あなた:】

MeshLabを経由せずZephyr→GigaMeshを直結できる設定について教えてください。

【ChatGPT:】

お待たせしました!MeshLabを経由せずに 3DF Zephyr Lite → GigaMesh Software Framework へ直接つなげるための設定手順について、以下に整理してご案内します。

1. 3DF Zephyr Lite のエクスポート設定

OBJ/MTL 書式の選択

Zephyr Lite では、「Export Textured Mesh」機能を使い、出力形式として OBJ/MTL を選びます

3Dflow

テクスチャ形式とリスケール

テクスチャの形式としては、PNG や JPG が選択可能です。

高解像度テクスチャが必要な場合は、「Rescale Texture to Nearest Power of Two(最も近い2の冪乗サイズへのリスケール)」をONにしておくと、後工程で非対応になる可能性が減ります

3Dflow

パス指定の注意

古いバージョンでは、単一テクスチャエクスポート時に 絶対パス が出力されてしまうバグがありました。これによりスペースを含むフォルダ名でテクスチャが読み込めないことがあったため、必要に応じて .mtl ファイルを手動修正するケースもあります

Steam Community

2. Zephyr 出力ファイルの内容確認

GigaMesh では OBJ/MTL ファイルから以下が正しく読み込まれることが前提となります:

.mtl ファイルが正しくリンクされているか(mtllib と usemtl 記述)

map_Kd に正しい 相対パス or シンプルファイル名が記述されているか

テクスチャ画像ファイル(例: JPG or PNG)が .obj・.mtl と同じフォルダにあるか

これらは Blender や他のツールでも確認できる一般的なチェック項目です

Blender Stack Exchange

YouTube

SourceForge

3. GigaMesh 側の対応能力と制約

MTL の読み込み対応

GigaMesh は元来 PLY 形式を推奨している側面が強く、OBJ/MTL の取り扱いは限定的である点に注意が必要です

ウィキペディア

テクスチャ読み込みに関するバグ報告

開発側のリリースノートでは、「複数のテクスチャが欠落しているメッシュのインポートが正しく機能しないバグ」が報告されています

gigamesh.eu

これは、MTL に複数のテクスチャ指定(たとえば複数の map_Kd)がある場合、正しく読み込めない可能性を示唆しています。

4. まとめ:直結できるか?条件は?

項目 推奨設定/確認点

出力フォーマット OBJ/MTL(テクスチャ付き)

テクスチャ形式 PNG or JPG。できれば「Nearest Power of Two」にリスケール

パス指定 .mtl は相対パスかファイル名のみ

.obj 内の記述 正しく mtllib と usemtl があるかチェック

GigaMesh 読み込み 複数テクスチャがないシンプルな構成なら比較的安定

実際に直結できるか?

可能性は高いですが保証はできません

上記の通り形式を整え、シンプルな構成にすれば、多くの場合 MeshLab を挟まずに GigaMesh へとデータを渡すことが可能です

ただし、出力時のバグや GigaMesh 側の不具合のため、事前テストが推奨されます

もしよろしければ、実際にエクスポートした OBJ/MTL + テクスチャを GigaMesh に読み込む際に直面したエラーや挙動を教えていただければ、より詳しく原因を調べてアドバイスできます。お気軽にお知らせくださいね!

3 感想

なぜMeshLab変換が必要なのか、GigaMesh Software Frameworkのマニュアルでは理解できず、実務的経験的にだけ必要性がわかっていたのですが、今回ChatGPTに質問してみて、はじめてその意義を理解することができました。

ChatGPTがなければ、この状況を質問できる人やサイトはなく、永遠にわからなかったかもしれません。




2025年7月19日土曜日

技術メモ べジェ曲線を使った単純モデリング

 Technical memo: Simple modeling using Bezier curves


I made a note of the steps to model simple shapes such as pits. Draw the border line with a Bezier curve, and reuse it to create individual unit terrain surfaces using the add-on Curves To Mesh function.


土坑等の単純形をモデリングする際の手順をメモしました。縁取線をべジェ曲線で描き、それを使いまわしながら、アドオンCurves To Mesh機能により単位地形面を個別に造形します。

1 単位地形面を2本のべジェ曲線で造形する

全ての単位地形面を2本のべジェ曲線の間を面張りすることによって表現することにします。面張りの実務はアドオンCurves To Meshにより行うものとします。

べジェ曲線の平面座標は資料平面図から、高さ座標は資料断面図から補間により獲得します。

2025.07.11記事「縄文遺構実測図の縁取線(地形変換線)の高度線形補間Blenderアドオン

2 縁取線をべジェ曲線で描く

全ての単位地形面の縁取線をべジェ曲線で描きます。


べジェ曲線による縁取線描画結果

作業の順番は、斜面造形を優先して行うことにします。斜面造形がしやすいようにべジェ曲線描画を工夫します。


べジェ曲線の描画単位

土坑を巡る斜面はべジェ曲線abに、段差斜面はべジェ曲線cdに対応します。

3 単位地形面の造形


造形結果


造形結果(単位地形面)

アドオンCurves To Meshにより、斜面1はべジェ曲線abから、斜面2はべジェ曲線cdから直接造形できます。

平坦面3はべジェ曲線bの一部とべジェ曲線cから造形します。

なお、べジェ曲線を使いまわす際、そのコピーはShift+Dで行います。(コピー元とコピー先にリンク関係が生じないようにするため。)

べジェ曲線の分離は編集モードで分離したい部分を指定してからPで行います。

平坦面4の造形はべジェ曲線d、bの一部(2箇所)、eを2本のべジェ曲線に整理してから、造形します。

ここではべジェ曲線bの一部(2箇所)とeを1本に統合しました。


造形結果

4 感想

斜面と平坦面という単位地形面毎に一つ一つ造形する手間をかけないと、結局望むレベルのモデリングができないことを認識しました。

なお、土坑の中の穴については、Blender合成により対応できます。

2025.07.15記事「土坑SK773A/B(千葉市有吉北貝塚)3Dモデル



2025年4月9日水曜日

技術メモ 点群から1つのオブジェクトを生成する方法

 Technical Note: How to generate an object from a point cloud


I have confirmed five methods to convert the distribution shape of a point cloud (a group of objects) in Blender3D space into a single object.


Blender3D空間における点群(オブジェクト群)の分布形状を1つのオブジェクトに変換生成する方法を5つ確かめました。

1 元データ


元データ

CUBEが分布する例です。

2 凸包


凸包

CUBE分布の殻を生成します。内部構造は見えなくなります。

3 ポイントクラウドの拡大


ポイントクラウドの拡大

内部構造が見えますが、点群ボリュームが連結するまで拡大するので、分布実体より肥大化します。

4 CUBEの拡大


CUBEの拡大

元データを拡大したもので、内部構造が見えますが、分布実体より肥大化します。

5 バウンディングスフェア


バウンディングスフェア

分布形状を内包する最小球です。

6 バウンディングボックス


バウンディングボックス

分布形状を内包する最小直方体です。

7 メモ

バウンディングスフェア以外はBlenderのgeometry nodesで数個のnodeを連結することで生成しています。

geometry nodesで作業することにより、元データに対して非破壊的です。

バウンディングスフェアは専用nodeがないのでPythonで生成しています。

上記以外にもメタボールを使った方法などがあります。

3D空間で遺物密度の分級を行った際、高密度分布域を強調して表現したい場合などに、この技術を利用します。


2025年2月4日火曜日

技術メモ Blenderにおける非破壊ブーリアン適用方法

 Technical note: How to apply non-destructive booleans in Blender


I found out how to apply Blender's boolean functions "non-destructively" using the geometry node editor, so I'll make a note of it.


Blenderのブーリアン機能をジオメトリノードエディターを使って、「非破壊的」に適用できる方法を知りましたので、メモします。

1 ブーリアン機能の非破壊適用


ブーリアン機能の非破壊適用結果(Blender画面)

画面では円柱と球が重なった部分をブーリアンモディファイア(交差)で抽出しています。ジオメトリノードエディターでオブジェクト情報、ジオメトリトランスフォーム、メッシュブーリアン、グループ出力の各ノードを繋いで実現しています。円柱と球は非破壊です。手作業でブーリアンモディファイアを適用すると円柱と球は破壊されます。

2 感想

非破壊的にブーリアン機能を適用できる技術があることを知り、今後大いに役立ちそうです。

またシェーダーエディターとは別にジオメトリノードエディターの存在を強く意識させられました。とても便利なツールです。Blender世界の奥深さを実感します。

現在有吉北貝塚北斜面貝層の貝層3Dモデル作成に向けてどのような技術を適用できるか、検討中です。


2025年1月26日日曜日

技術メモ JavaScriptでIllustratorを操作する

 Technical memo: Controlling Illustrator with JavaScript


I created a JavaScript that generates a B2-sized document in Illustrator and draws a grid. This is my first time using JavaScript, and it's very useful. I also learned that templates are even more useful as a next step.


立ち上げたIllustratorにB2判ドキュメントを生成し、グリッドを描画するJavaScriptを作成しました。JavaScriptの利用ははじめてで、とても便利です。また、次のステップとしてテンプレートがさらに便利であることを知りました。

1 B2判ドキュメントを生成しグリッドを描画するJavaScript

次の仕様のJavaScriptをChatGPT支援により作成しました。

1 ドキュメントを生成して、B2判アートボードを設定してアクティブにする。

2 横650mm、縦450mmの四角をアートボード中心に描く。

3 線幅は0.25pxとする。

4 四角を行9、列13のグリッドに分割する。

5 全てのグリッドをグループにまとめる。

6 カラーモードをRGBモードに設定する。

7 線の色は#0a009dとする。塗りはしない。

// ptをmmに変換する係数
var ptToMm = 2.83464567;

// 新規ドキュメントの作成と設定
if (app.documents.length === 0) {
    var doc = app.documents.add(DocumentColorSpace.RGB);
} else {
    var doc = app.activeDocument;
}

// B2アートボードの設定(B2: 728mm x 515mm)
var artboardWidthMm = 728; // mm
var artboardHeightMm = 515; // mm
var artboardWidthPt = artboardWidthMm * ptToMm; // ptに変換
var artboardHeightPt = artboardHeightMm * ptToMm; // ptに変換

doc.artboards[0].artboardRect = [
    0,                  // 左
    artboardHeightPt,   // 上
    artboardWidthPt,    // 右
    0                   // 下
];

// アートボードの中心座標
var centerX = artboardWidthPt / 2;
var centerY = artboardHeightPt / 2;

// 四角形を描画
var rectWidthMm = 650; // mm
var rectHeightMm = 450; // mm
var rectWidthPt = rectWidthMm * ptToMm; // ptに変換
var rectHeightPt = rectHeightMm * ptToMm; // ptに変換

var rect = doc.pathItems.rectangle(
    centerY + rectHeightPt / 2, // 四角の上
    centerX - rectWidthPt / 2,  // 四角の左
    rectWidthPt,                // 四角の幅
    rectHeightPt                // 四角の高さ
);
rect.stroked = true;
rect.strokeWidth = 0.25; // 線幅を0.25px
rect.strokeColor = new RGBColor();
rect.strokeColor.red = 10;
rect.strokeColor.green = 0;
rect.strokeColor.blue = 157;
rect.filled = false; // 塗りなし

// 四角形をグリッドに分割
var rows = 9; // 行
var columns = 13; // 列
var gridGroup = doc.groupItems.add();
for (var i = 0; i < rows; i++) {
    for (var j = 0; j < columns; j++) {
        var cellWidthPt = rectWidthPt / columns;
        var cellHeightPt = rectHeightPt / rows;
        var cell = gridGroup.pathItems.rectangle(
            rect.top - (cellHeightPt * i),       // セルの上
            rect.left + (cellWidthPt * j),       // セルの左
            cellWidthPt,                         // セルの幅
            cellHeightPt                         // セルの高さ
        );
        cell.stroked = true;
        cell.strokeWidth = 0.25;
        cell.strokeColor = rect.strokeColor;
        cell.filled = false;
    }
}

// グリッド全体をグループ化
gridGroup.move(doc.activeLayer, ElementPlacement.PLACEATEND);

// RGBカラーモードを設定
doc.documentColorSpace = DocumentColorSpace.RGB;

alert("スクリプトの実行が完了しました!(単位はmm対応)");
2 JavaScriptにより生成したドキュメント


JavaScriptにより生成したドキュメント(Illustrator画面)


JavaScriptにより生成したドキュメントの利用(Illustrator画面)

このドキュメントは有吉北貝塚北斜面貝層のセクション図を集成して1枚の貝層断面図にまとめるための「台紙」として使う目的で作成したものです。JavaScriptの変数を調整すれば、アートボードサイズやグリッド設定や線色を変更できますから、便利です。JavaScriptは規定の場所に置いて使っています。

3 テンプレート

セクション図集成作業ではグリッド番号や標高を記入する必要があるので、それらの数値例や時々必要となるゲージ(目盛)をアートボード内外に置いてあるファイルをテンプレートファイルとして作成し、活用しています。


テンプレート画面(Illustrator画面)

4 感想

JavaScriptの利用がとても便利であることをはじめて知りました。さらにそれ以上にテンプレート利用が便利であること知りました。テンプレートファイルは規定の場所に置くことは手間がかかるようなので、作業フォルダーに置いて使っています。