« 月の地形とテクスチャ… | トップページ | C4D線形スプラインの角のポイント以外を選択するスクリプト »

C.O.F.F.E.E.を使わず手作業で、月面の地形データを取り込んでみる…

月周回衛星「かぐや」のサイト
http://wms.selene.jaxa.jp/selene_viewer/index_j.html
で公開されている、月面の地形データ[LALT_G.txt]を取り込みます。

C.O.F.F.E.E.を使わずに…と言っても多少使うんですけどね。
C.O.F.F.E.E.が苦手な人でも、手作業で点群データファイル(ASCIIファイル)をC4Dに何とか取り込む方法を…

C.O.F.F.E.E.を一通り使える人でも、C.O.F.F.E.E.と闘わずに、とにかく取り込んで形にしたい人にも…

点群データファイルって…?

3Dの点群データは通常、0(X,Y,Z),1(X,Y,Z),2(X,Y,Z)…と記録されている事だろう。

フォーマットは、ファイルごとに違うので、開いて確認する。説明文があるなら、それを参考に…
ASCIIファイルなら開けば、ある程度理解できると思います。バイナリーファイルなら諦めるかC.O.F.F.E.E.と格闘するか…。

残念ながらC4Dは点群データをオブジェクトとして開けませんし、インポートも出来ません…
と言いましたが、[ポリゴン/スプライン]オブジェクトに直接読み込むことが出来ます。
ただし、C4Dの点群データフォーマット(ASCII)だけですけどね。

どんなフォーマットなのか…

確認するため適当なポリゴンオブジェクトを用意してください。
ここでは、立方体プリミティブを編集可能にしました。

Pointdata_01

ポリゴンオブジェクトを選択して構造マネージャを開きます。

Pointdata_02

Pointdata_03

開くとポイントデータが表示されます。
この他に[ポリゴン/UVW座標/頂点ウェイト/N-Gons]が操作できます。

この構造マネージャのファイルメニューから「ASCIIデータをエクスポート...」を実行して、ファイルを保存してください。

Pointdata_04

保存したファイルをテキストエディタ等で開いてみてください。

Pointdata_05

アプリケーション毎で表示のされ方は違いますが、このアプリケーションは[タブ:緑の右矢印][改行:下矢印]で表示されます。
タブ区切りのインデックス付きXYZデータとでも言っておこう…

"ポイント"[tab]"X"[tab]"Y"[tab]"Z"[改行]
インデックス番号[tab]X値[tab]Y値[tab]Z値[改行]
        :
        :

このファイルを、構造マネージャのファイルメニューからASCIIデータをインポートをして取り込んで見てください。
問題なく、今のポイントデータに追加されます。

Pointdata_06

点群データファイルのデータのみのポリゴンオブジェクトにしたいならば、カラ(ポイント無し)のポリゴンオブジェクトに取り込みます。

このフォーマットを守ればC4Dの[ポリゴン/スプライン]オブジェクトにデータを取り込めます。

でもね…

このフォーマットをどこまで守るのか…知りたいよね。
大胆に挑戦してみる。

Pointdata_07

1行目を変更…とりあえず読み込んでみる。

なんと読み込めた。

1行目は無視してるのか?…
1行目を改行だけにしてみたら…

Pointdata_08

これも読み込めた…完璧に1行目は無視なんだね。

ちょっと待てよ…意外と1行目からデータが並んでも取り込んだりして…

Pointdata_09

Pointdata_10

ポイントの数が減ってる…2行目からのデータになってるね…
と言う事は、1行目は完全に読み飛ばされ無視されるんだね…

ん?でもインデックス番号がずれるよね…意外とインデックス番号も無視されるのか…

Pointdata_11

インデックス番号の順番もバラバラで重複している状態です。
読み込み時、インデックス順でソートされても分かるようにX値を判りやすい数値に変えました。

では読み込み…

Pointdata_12

インデックス番号は意味が無いんだね…
ソートされるわけでも無し…重複していても問題なし…並んでいる順番に取り込まれると…

インデックス番号が無くても良いのか?

Pointdata_13

Pointdata_14

シフトして取り込まれています。X値データが消えました。

先頭のタブが良くないのか?それともインデックスが必要なのか?

Pointdata_15

純粋なタブ区切りのXYZデータにしました。

では読み込み…

Pointdata_14

変わらず…

インデックス値はどうであれ必要だと…

最終的に

Pointdata_16

これなら問題なしと言うわけだね…

では、月面地形データ[LALT_G.txt]を読み込む為の作業を…その前に…
データファイルの説明[readme_LALT_G_j.txt]を読んでみる。
分解能は1度でデータ点数は、64800点と言う事は(360×180か180×360)だね。

で、フォーマットは[FORTRAN]。だいぶ昔に聞いた名だ…学習したことは無いけど…まだ使われているのか…自分には身近ではないね。

緯度/経度/高さの順でタブ区切りではなく[スペース]区切りか…しかもスペースは1個とは限らず、2個だったりするんだね…
要するに桁合わせで…1行の文字列の長さを一定にしてあるのね…
全部C.O.F.F.E.E.で処理したほうが楽かなぁ…

いやいや今回のテーマはC.O.F.F.E.E.は必要最小限で…

先ほどの実験の漏れ…スペース区切りは読み込めるのか…

Pointdata_17

では、読み込んでみる…

Pointdata_18

全く…

スペース区切りは駄目なんだね…

では、月面地形データ[LALT_G.txt]をテキストエディタで開いてみる。

Pointdata_19

自分は、このデータをC4Dの点群データフォーマットに加工する事が、手持ちのテキストエディタだけで簡単に出来ます。
テキストエディタだけで加工が出来る条件として、文章の[検索/置換]機能がある事。さらに、この[検索/置換]機能で[スペース/改行コード]も検索/置換できなければなりません。

[検索/置換]機能が無いと64800行を手作業で修正することになります。

アプリケーションは問わず、[スペース/改行コード]を検索/置換が出来るテキストエディタをお持ちの方から…

作業は簡単です。

まず1行目に改行を入れます。

Pointdata_20

[検索/置換]機能で…

[改行][スペース]を[改行]に置換。(行の最初のスペースの除去)。
先頭にスペースが2個ある場合は2回連続、3個あるなら3回連続します。
先頭のスペースがなくなるまで繰り返します。

Pointdata_21

先頭のスペースが無くなったら…
[スペース][スペース]を[スペース]に置換します。(2連続半角スペースを1文字半角スペースに置換)
数値間のスペースが3個あるなら2回連続します。
数値間のスペースが1個になるまで繰り返します。

Pointdata_22

数値間のスペースが1個になったら…

[スペース]を[タブ]に置換します。(1文字半角スペースを1文字タブに置換)

この段階で、XYZのタブ区切りになります。

Pointdata_23

最後に…

インデックスを付けます。

[改行]を[改行]0[タブ]に置換します。

Pointdata_24

このデータの最後の行を見てください。

Pointdata_25

インデックスのみの行があります。
削除して「別名で保存」をしてデータの加工は終了です。
これで、ポリゴンデータに取り込むことが出来ます。
取り込みには時間がかかります。万が一の事を考えて、大事なシーンファイルは閉じてください。

表計算アプリケーションを使って加工する場合…

CSV形式での取り込みが可能で、取り込みフィルタ[タブ/スペース]区切りの選択が可能で、連続区切りの結合、先頭の空白の削除などが可能な表計算アプリケーションが前提です。
CSVエディタという物が在るみたいですが使ったことが無いので説明できません。ごめんなさい。

月面地形データファイルをCSV形式で取り込みます。
取り込みフィルタは[スペース]区切りで連続区切りの連結を指定します。
残念ながら使用したアプリケーションは先頭空白の削除はできませんでした。

Pointdata_26

その為、X値が小数点以上3桁に満たない数値の先頭の空白が読みとられてしまい、空白のセルができてしまいました。

手作業で空白のセルを削除するか…?
データが多いと大変である…

表計算アプリケーションの機能にある[列の挿入]で、全てのA列にセルを挿入します。

Pointdata_27

これで一度、保存フィルタで[スペース区切り]を指定してCSVで保存します。

先ほどと同じ条件[スペース]区切りで連続区切りの連結で、保存し直したCSVを取り込みます。

取り込み後のデータの並びが上の図のように、保存前の状態のままでしたら、多分拡張子が.csvになっていると思いますが、.csvを.txtに変更してから取り込みなおしてみてください。

Pointdata_28

問題なく取り込まれると4列のデータになります。
後はA列に任意の数値(0でも連番でも)を入力します。

A列全部に0を入力します。
全部と言ってもデータの有る行までです。
1行目のAに0を入力し、0で埋めるセルだけを全て選択します。
決して一番上の”A”をクリックしてA列全部を選択しないでください。スクロールバーでデータの最後の行を表示させ…

Pointdata_29

アプリケーションの連続データの入力機能(下に)でA列を0で埋めます。
この機能のオプションに(下に足す)を選択すると連番になります。
今回は0で埋めました。

Pointdata_30

1行目にセルを挿入しデータを1行下にシフトさせます。

Pointdata_31

最後に、タブ区切りのCSVで保存します。
これでC4Dのポリゴンオブジェクトに、点群データを取り込めます。

ここで説明したテキストエディタや表計算アプリケーションの機能については正確な表記ではありません。詳しくは使用するアプリケーションのマニュアルを読んでください。

いよいよ点群データの取り込みです。

先ほども言いましたが、大事なシーンファイルは閉じてから作業してください。

カラのポリゴンオブジェクトを追加し、構造マネージャから点群データを取り込みます。

Pointdata_32

わかり辛いですが…
もうちょっと、寄ってみます。

Pointdata_33

なんとなく、クレーターのような…

ポイントデータのみでポリゴンが無いので、分かり辛いですね…

これからどうする?って…
C.O.F.F.E.E.で面を張るのか(ポリゴン設定)?って…
今回は、C.O.F.F.E.E.は最小限です。C.O.F.F.E.E.始めたばかりの人でも分かる程度に…

では、このポイントデータはX軸に長いですね。
分解能が1度(x:360 × y:180)と言うことです。
X軸に長いからって、そんなに単純なのか…と思っている人もいるでしょう。
先ほどのデータの並びを覚えていれば、多分気がつくと思います。

イメージし易くデータの並びを説明しよう…
北極から南極へ東に巻きにリンゴの皮をむくように並んでいます。
データは、西から東に1度の分解能、すなわち(0~360)360度で閉じているので360個。
北極から南極にも1度の分解能なので(+90~-90)180度で開いているので181個。

正確には、このグリッドで仕切られた中心の高さと言うことです。北極-南極のデータは180個。

これで良いだろうか…

それでも分かり辛い…

Pointdata_46

では、こんなんでどうだろう。
図は分解能:10°の全球グリッド。
分解能:1°グリッドは、図にすると細か過ぎるので10°にしました。
格子の中心の緑のポイントがサンプルポイント。ここの標高がデータになります。
3Dオブジェクトは、この緑のサンプルポイントを繋いだ形になります。
分解能:10°なので、横の分割(格子の数)360÷10で36個
縦の分割は180÷10で18個
サンプル数は36×18で648個です。

でもこのサンプルポイントは格子の中心なので、北極/南極の地点にポイントが無いので穴が開きます。

サンプルポイントが、グリッドの交点ならば…

では、作業に入ろう…

ここからのポリゴンの生成の大まかな作業手順は…
新たなポリゴンメッシュ(360×180)に、先ほどのカラのポリゴンオブジェクトに取り込んだポイントの座標をそのまま適用する。これだけです。
ポリゴンの生成はまったくしません。

では、シーンに平面オブジェクトを追加します。
大きさや分割の設定は、

Pointdata_34

データは…
横360個、縦180個なので分割は359と179にします。
大きさも同じ数値にします。この大きさは、作業には関係ありません。100でも200でも…
向きは+Zにします。

これを編集可能にしポリゴンオブジェクトに変換します。

この時、平面オブジェクト(平面プリミティブ)とポリゴンオブジェクト(月面データ)のポイント数を確認してください。
確認方法は、構造マネージャーでそれぞれのオブジェクトの最後のポイント番号を比べるか…
「ウィンドウ」メニューの「選択/構造情報」のオブジェクトの属性に表示されているポイント数を比べてください。
同じであれば問題ありません。

Pointdata_44

Pointdata_45

平面オブジェクトのポイントの並びと、先ほど取り込んだポイントの並びが同じになります。
では、先ほど取り込んだ点群データのポイントだけのポリゴンオブジェクトを平面オブジェクトの子オブジェクトにします。

Pointdata_35

ユーザデータを使っても良かったのですが、最後に子ブジェクトを削除するだけで完了させる為にしました。
今回は、ちょっと乱暴な方法ですけどね…

では、この子オブジェクトにC.O.F.F.E.E.エクスプレッションを取り付けます。

Pointdata_36

/*
親オブジェクトに自分のポイントデータを適用する
2009.5.14
*/


main(doc , op)
{
  var tg = op->GetUp();//親オブジェクトを取得

  if(!instanceof(op , PolygonObject))return;//オブジェクトがポリゴンオブジェクトでなければ終了
  if(!instanceof(tg , PolygonObject))return;//親オブジェクトがポリゴンオブジェクトでなければ終了

  var pts = op->GetPoints();//自分のポイントを取得
  var ptc = op->GetPointCount();//自分のポイント数を取得
  var tg_ptc = tg->GetPointCount();//親のポイント数を取得

  if(ptc != tg_ptc)return;//両方のポイント数が一致しなければ終了

  tg->SetPoints(pts);//自分のポイントデータを親に適用

  tg->Message(MSG_UPDATE);//親オブジェクトを更新
}

まあ、ポリゴンオブジェクト前提に作業を進めているので、一々クラスチェックをする必要もポイント数のチェックをする必要も無いんですけど…念のため…

もし完璧でチェックしないなら…

/*
親オブジェクトに自分のポイントデータを適用する
2009.5.14
*/


main(doc , op)
{
  var tg = op->GetUp();//親オブジェクトを取得
  var pts = op->GetPoints();//自分のポイントを取得

  tg->SetPoints(pts);//自分のポイントデータを親に適用

  tg->Message(MSG_UPDATE);//親オブジェクトを更新
}

スッキリしました…

入力して(コピペ)実行したら、子オブジェクトは削除してください。

結果は…

Pointdata_37

面の方向は+Zの方向だから裏になっているけどね。問題なしです。
ポイント全てを選択して、座標マネージャでサイズZの値の先頭に(-)を付けて適用するとZ軸で反転します。
位置のZ値も(-)を付け適用します。

Pointdata_38

サイズは適用後(-)は消えます。
何か一発でできるコマンド在ったっけ?

Pointdata_39

結果は、このような状態です。

このポリゴンオブジェクトをラップデフォーマを使って球体に変形します。

Pointdata_40

ラップデフォーマの設定は…

Pointdata_41

ポリゴンオブジェクトの幅は359ですが、360を設定します。
高さも179でしたが、180を設定します。
半径は月の半径を入力します。
巻きつけは、もちろん球状。
開始経度は、0°
終了経度は、360°
開始緯度 -90°
終了緯度 90°

以上…

この数値を見ただけで、分かる人もいるだろう。
つなぎ目に隙間ができます。当然ですけどね…
データ自体が循環していないので、今回の場合はデフォーマで隙間をなくす事は間違いです。
ただ、つなぎ目付近を使わないなら全く問題ないですけどね。

Pointdata_42

「現在の状態をオブジェクト化」を実行して、形を定着させてください。
通常のツールを使って隙間を埋めて形状の加工は終了です。
「ブリッジ」
「ポリゴンの穴を閉じる」
「ナイフ」
「N-gonsを削除」
これらのツールを使うことになるけど…

Pointdata_43

北極/南極の部分はN-gonsを削除すると汚くなるけどね。適当に処理してください。
今回もファイルは公開できません。

月周回衛星「かぐや」のサイトで公開されている地形データは他にも在りますので、興味がある方は試してみてください。

かなり、いい加減で説明不足ではありますが…
月面のネタは、これで終了です。続きません。

|

« 月の地形とテクスチャ… | トップページ | C4D線形スプラインの角のポイント以外を選択するスクリプト »