はじめに
Wings3Dのプラグインを作るにはどうすればいいか...という書きかけの内容です。
この文書の目的
- Wings3dの仕組みの概略
- ソースの内容の体系化(どこに何があるのか?),Erlang,Wings3dコア,e3d,プラグインの関係
- 解説の読み方とErlangサイトへのリンク等
- Wings3Dはオープンソースで開発中のローポリ作成向け3Dモデラーで、制作スタイルは核となるオブジェクトの選択領域を枝や根を伸ばすように作成していくサブディビジョンモデラーです。
- Erlangという関数型言語で書かれています。Windows,MacOS,Linuxで動きます。
★Wingsfontの作成法について、さらにまとめたもの
予備知識1:この開発者向けメモの内容 及びフォーラムの情報
予備知識2:
Exploring Wings3D through the Erlang ShellWings3dの仕組みをErlangShellを通して調べてみよう (英語,Erlang言語)
を読んでおくと理解が進むかもしれません。
wings3dとプラグインとフォント作成方法について
How to make plugin and wingsfont?
★解明したいこと
・メニュー登録方法(メニューの意図した場所に入れるには...?)
・コマンド発動のトリガー
・GUIの構築方法&自身にパラメータを投げる仕組み
プラグインの構造
・保存系プラグイン(objとか任意のフォーマットで保存)(海外の方がwpc_ex.erlという形で公開しているものがある。)
・コマンド系プラグイン(オブジェクトを加工する2ndaySelectionを持つコマンド系プラグイン、解説がほとんどない)
・プリミティブ系プラグイン(特定の立体を生成するタイプ)
参考サイト
ユーザー向け
開発者向け
テスト版、開発中断プラグイン
これらは様々な人によって、Erlangの学習・Wings3dプラグインの作成や実験のために作られた物です。プラグイン作成の参考になるかもしれません。
使用には充分注意し、開発途上版なので予期せぬ不具合が発生することもあります。頓挫していたり、引き継ぐ人がなく開発が中断しているものもあります。
・
Newbie Programmer Plugin help in PROGRAMMING Forum
・
Wings3d Coding Guildelineを
要約してみました。(日本語)
バージョン履歴
Wings3dの開発は10年くらい掛けて緩やかなペースで進められてきました。
最新版では、古いWings3D v0.80,v0.92以前で作成したWings形式のファイルは読込めないようです
Wings3D v1.5.3 (2014-04-13) Erlang/OTP 17.0を使用,様々なバグフィクス,機能追加少々。
Wings3D v1.5.2 (2013-11-16) Windows環境でユーザー名にUnicode含まれていて起動が失敗する問題を解決との事。
Wings3D v1.5.1(2013-10-14) 入力結果のプレビュー機能の追加(リアルタイム更新/数値を入力後に更新/手動更新を選べる)他インターフェースの改善。
Wings3D v1.4(2011-02-05) インターフェースや処理の改善、スカルプトモード追加、Tweakモードのコアモジュール化
Wings3D v1.3.1 からMacOS X10.5.8以降 Intel Mac のみの対応です。
Wings3D v1.3.2でCJKフォントとエンコーディングに対応。
Wings3D v1.2(2010-01-17) いくつかの変更。以降で Wings3D 1.1.7以前のWings形式ファイルを読込んだ場合、オブジェクトモードの頂点属性が無視される
Wings3d v1.1 (2009-06-27)以降、辺や頂点データの格納には gb_treeではなくarrayを使用しています。古い情報をあたるときは注意してください。
Wings3d v1.1 (2009-5-17)ではエッジデータをarray で管理することになった。
Wings3d v1.1.xy(2009-5-23〜)では 面と頂点のテーブルをarray で管理することになった。
Wings3d v1.0(2009-05-17) 正式リリース
Wings3d v0.99.60(2009-04-25)
Wings3d v0.99.53(2008-11-xx) Installer only support Windows 2000 later(98/ME 非対応), Kerkythea plugin追加
Wings3d v0.99.00(2007-12-15) Added more Shader(toon brick enviroment etc),ISO-8859-9 font support
WindowsXP(SP2),OSX 10.4-PPC/10.5(Intel)
Wings3d v0.98.36(2006-11-22) Support Universal binary on Mac version
Wings3d v0.98.27(2005-01-14)
Wings3d v0.98.00(2002-11-02)
Wings3d v0.90(2002-01-29)
Wings3d v0.80(2001-10-19)最初のバージョン
Wings3dは、IZwareの作ったNendo, Miraiという3D統合ソフト(2Dペイントやアニメーション機能もある)に影響を受けて開発されました。
さらに、
Lisp:Geometry
(日本語)の記事によれば、Wings3dの先祖は Nend, Mirai 、それより遡れば Nicimen Geometry、元祖は Lispで書かれたモデリングツールまで行き当たるようです。
※
フォーラムの書き込み(#1, deerwood氏)によると...
- Wings3dは v1.4.1現在、 Erlangによる並列/マルチプロセスアプリケーションではない。(例外として、マルチプロセスとしてのプログレスバー処理は存在する)そのためメッセージをWings3dへ送るより、関数を呼び出す形で処理を行うことになります。
- 全体的なイベントの呼び出しはOSを経由しESDLまたはその他へ委ねられている。例えばモーダルダイアログが表示されている間、Wings/ErlangはOSから委ねられた一部のルーチン制御するために、ユーザーによるインタラクション(たとえばマウスクリックなどの入力)が発生するまで待機しづつける
そして、ユーザーからの入力が行われると、再びWings/Erlangはアクティブになり、OSのイベントまたは何か(実装者がフック定義をしている場合)が処理します。
- また注意すべきことは、あらゆるイベントの発生後にはダイアログを再表示する必要があります。
それは ESDLからのユーザーの入力結果を使用して(OK/Cancel)選択肢で停止させたままという意味ではなく、定型的に末尾再帰(tail recursion)するなどして、 パラメータを、新規の状態データによってダイアログを完全に再構築してください。
これから、Wings3dを ErlangShell(実際の動作)と ソースコード の2つの視点で見ていきます。
Wings3dをErlangShell視点で見る
Wings3Dというアプリケーションは Erlang という関数型プログラミング言語で作られています。
MacOSX版の構成
Wings3D Loader ........ 起動時に読込まれる。
Beam ........ Erlang仮想マシン。Erlang言語でかかれたソース変換やアプリの実行担当。
ESDL ......... Erlang 用のSDLライブラリ: キーボードやマウス入力、GUIインターフェースなど担当?
Wings3D....アプリケーション
BEAM (Bogdan's Erlang Abstruct Machine)とはErlang言語の仮想マシンと呼ばれるものの1つです。
コマンド入力で対話するための Erlang Shell はこれをエミュレートして動作するそうです。
仮想マシンBEAMは、Erlangで書かれたソースコード hoge.erlをBEAMで実行可能な hoge.beam にコンパイル(変換)したり、実行をサポートするようです。(各.erlファイルは、モジュールと呼ばれます。)
Wings3dのバイナリ版は、既に.beamファイルに変換済です。これらが実行されることで、アプリケーションが起動するようです。
このとき、仮想マシンBEAMも.beamファイルの実行のために働くようです。
Wings3Dは、オブジェクトの頂点や辺などのデータを
ウイングドエッジデータ構造として管理しています。
Wings3Dの内部構成についての、日本語の情報は
yst memoさんが詳しいです。
Erlang言語って何?
Wikipedia - Erlang
Erlang land (日本語)Erlangの基本的な使い方の情報があります。基本構文、データ構造、関数の書き方、beamファイルの作り方、パターンマッチ
Erlang クエックブック(日本語) より高度な内容
Erlang World(日本語)インストール方法から、並列処理まで色々
参考文献:『プログラミング言語 Erlang入門』,柏原正三著, ASCII
また、Wings3d本体には、Erlang言語をすぐに試せる、Erlang Shellが組み込まれています。
How To Write Wings3D Plugins
(for beginners) プラグインの作り方
Exploring Wings3D through the Erlang Shell Wings3Dと Erlang Shellを起動し、Wings3D内部の情報を見たり弄ったりする方法。
Erlang shell上で、Wingsの編集状態や辺や面の選択領域を加工するには、Wings3Dのソースコードをダウンロードしてwings.hrl(ヘッダファイル)を入手して、読込ませる必要があります。
ErlangShellとモジュールファイルの違い
※ここで注意しないといけないことがあります。
ErlangShellで対話する時 と モジュールファイル(xxx.erl)としてプラグインを書く時に、
同じことをするのに命令/関数が違ったり、ErlangShell独特の書き方あったりします。これは日本語における書き言葉と話し言葉の違いみたいなものです。
たとえば、ErlangShellでは、rr(wings)命令 なのが、モジュールでは -include("wings.hrl").と書いたりします。
また、チュートリアルの
Exploring Wings3D through the Erlang ShellではErlangShell上から レコードstの情報を St としてゲットするのにwpa:get_state()を利用しています。
しかし実際には、プラグインのソースコードを検索してもwpa:get_state()は現れません。おそらくWingsコア側が既にこの情報を持っていて、プラグインへ送るのでwpa:get_state()を使って明示的に取得する必要がないのかもしれません。
プラグインモジュールの場合は、モジュール内にあるcommand()関数が、Wingsのコアから レコードstの情報 St を受け取るようになっています。
Erlang Shellを準備する。Erlang言語を試す。
Wings3Dのパッケージ中には、もうコンパイル済のErlangShell環境が内包されているので、手っ取り早くそれを使う事にします。
※Erlangコンパイラは入ってません、yst memoさんの記事を参考に試したところ、
Erlang R13bの場合は本体をダウンロードして/Desktop/otp_src_R13B04/lib/ 内にある compiler というディレクトリを
Wings3D1.2.app/Contents/Resources/lib ディレクトリへコピーすると、Wings3DのErlang Shellでも c()モジュールが使えるようになります。
なお、今回は.erlファイルを.beamファイルにコンパイルしたりしないので、OSに ErlangやESDLのインストールはしません
ターミナル上で、bashに一時的にPathを通せば、Erlang Shellを通してWings3Dと対話することができます。(MacOSX10.4.11 PPCの場合)
bash
export ROOTDIR="/Applications/Wings3D 1.2.app/Contents/Resources"
export BINDIR=$ROOTDIR/bin
export ESDL_DIR=$ROOTDIR/lib
export EMU=beam
export PROGNAME=`echo $0 | sed 's/.*\///'`
exec "$BINDIR/erlexec" -run wings_start start_halt ${1+"$@"}
するとWings3Dが起動します。またTerminal 上ではErlang Shellが起動します。また、これを終了するにはq().と入力します
もし
erlexec: Error 2 executing '/Applications/Wings3D 1.2.app/Contents/Resources/bin/beam.smp'.
このようなエラーが出た場合、実行ファイル、/Applications/Wings3D 1.2.app/Contents/Resources/bin/にある「beam」の複製を同じディレクトリに作って、
複製したファイル名を「beam.smp」にして、もう一度挑戦してみて下さい。 (MacOSX10.5.8 Intelの場合)
Erlang言語で、標準で使えるモジュールおよび関数を使えば、Shell上から何か試すこともできます(Hello World!!とか)。
Erlang Shellでは最初からユーティリティとして使える内部コマンドのほか、 モジュールCコマンド( c:ls() , c:cd()など 互換ぽい機能?)があります。
Erlangでディレクトリリストを表示するプログラムを作るより、これらユーティリティを使いましょう。
カレントディレクトリ、標準出入力、環境変数等を確認したりできます。
Erlangプログラムやコマンドの最後は、必ずピリオド「.」で終わることになっています。
環境変数の表示
os:getenv().
Hello Worldを出力(※ioモジュール;fwrite関数)
io:fwrite("Hello World!!\n").
カレントディレクトリのpathを表示(※fileモジュール;get_cwd関数)
file:get_cwd().
カレントディレクトリのpathを表示(※Cモジュールコマンド)
pwd().
カレントディレクトリをデスクトップに変更(※Cモジュールコマンド)
cd("./Desktop").
カレントディレクトリ内のファイルを表示(※Cモジュールコマンド)
ls().
全ての束縛変数を破棄する。(※内部コマンド)
f().
Erlang Shell を終了する場合は次の内部コマンドを使って下さい(Wings3Dも一緒に終了します)。
q().
入力しても反応がなくなってどうしようもなくなった場合、CTRL+C でErlangShellを強制終了できます。
また、CTRL+Cで次のようなリストが表示された場合 a を押して改行キーで終了できます。
BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded
(v)ersion (k)ill (D)b-tables (d)istribution
Wings3Dと対話する場合は次の説明を見て下さい。
Erlang Shell でWings3Dと対話する その1
Exploring Wings3D through the Erlang Shellにあった例で、で結果を表示できたもの↓
rr("c:/erlang/wings/src/wings.hrl")を利用しないタイプのプログラムであれば、Wings3Dのヘッダファイルを用意しない状態でも結果を得る事ができます。
Non-State Functions (Wings3dの状態を出力)
Modifying Objects(オブジェクトの頂点情報)
Hotkeys List to HTML Table を実行した時の結果(ホットキー(ショートカット)情報をHTML形式で書き出す)↓
Erlang Shell でWings3Dと対話する その2
Exploring Wings3D through the Erlang Shellの例にはヘッダファイルwings.hrlが必要なものもあります。
このファイルはWings3Dのソースコードに含まれています。
入手するにはWings3Dの公式ページから Source のリンクを辿ってダウンロードしてください。
wings.hrlは、解凍したディレクトリの中のsrcディレクトリの中に入ってます。
このwings.hrlというファイルを任意の場所にコピーして下さい。
例題プログラム中にある rr("c:/erlang/wings/src/wings.hrl")のファイルパス部分をwings.hrlのあるパスに置き換えれば、動作します。
たとえばファイルをデスクトップに置いてそこから読込みたい場合は
/Users/ユーザー名/Desktop/wings.hrl
Wings3Dの中に置く場合は
/Applications/Wings3D 1.2.app/Contents/Resources/wings.hrl
に変更するとよいでしょう。
Wings3dで、選択している頂点(2つ以上)の座標を取得するプログラム「Vertex Selection Example」を試した結果
最初にWings3Dのほうで立方体を出現させ、頂点を選択しておいてから、これを実行します。
起動しているErlangプロセスを表示することもできます
Erlang Shellでの やり方
f(),i().
を試してみると、Wings3dのErlang Shell 起動直後には20位のErlangプロセスが立ち上がっていることがわかります。
※しかしこれらはWings3dのプロセスではなく、おそらくErlangVM関連だと思われます。(Wings3d自体はErlang並列処理アプリケーションではないため)
wings.erlの最初はどうなってるの?
少し寄り道、プロセスからコードへ目を向けてみます。
Wings3d と エラーログ書き出しについて考察。
ProcessID ---- Registered name
<x,x,x>----- init otp_ring0:start/2 init:loop/1
<x,x,x>----- wings erlang:apply/2 wings_io_sdl:wait_for_event/1
erlang:apply/2
さっき挙げたプロセスの中から2つのピックアップします。wings.erl ソースを見ると、この2つの発生源を伺えます。
start/2 関数と、do_spawn の spawn_option 動的に関数を呼び出す apply()関数を見つけることができでしょう。
これらはErlag備え付けの、erlang:spawn()またはspawn_opt()関数により発生していると思われます。
また、init()関数内での最初でregister()関数により自らのプロセスIDを「wings」と関連づけてもいます。
Wings3dはモジュールが沢山あり複雑にみえますが、最もコアな部分であるwings.erlモジュールの最初の部分を読んでみると、
次のような仕組みになっているようです。
・Wings3dはサーバープロセス(親)を立ち上げ、次に関連プロセス(子)を発生させる。
・サーバーはそれらの動作を監視していて、関連プロセスが、なんらかのメッセージをシグナルとして返してきたらサーバーは捕捉する
・「シグナル処理のカスタマイズ」をしているので、エラーを捕捉した場合は、エラーログとしてそれを書き出す。
これがどういうことかは、次のサイトの解説がわかりやすく、とても助かりました。
Wings3dは「シグナル処理のカスタマイズ」をしている典型的なアプリケーションといえるでしょう。
分かってきたこと
・wings.erlモジュールではプロセスの終了を監視している。また、init();では、様々な機能を初期化している模様。
・それに続いて、キーボード、マウス、メニュー等のイベントハンドラ関連の関数が動き出すようです。
・最終的には、ユーザーの動作がイベントハンドラによって伝えられ、プラグインの関数に渡されたパラメータがマッチすれば、それぞれの処理が実行されるようです。
wings.erlはプラグインを作ろうとする場合、触れることは一切ありませんが、Wings3dの全体の動きを知ったり、他のErlangアプリケーションを作ったり
する時の参考にはなるかもしれません。
次は、ソースコードを見てみましょう。
Wings3dをソースコード視点で見る
ソースを読むためのメモ
これらは、Wings3dのソースを読むために調べたものですが、試してなかったり、環境によってうまくいかない事もあると思います。
まず、仕様が書かれたモジュールのファイルが、解凍ディレクトリの構成のどこにあるか情報が足りないです。
各ファイルの構成及び、プラグインモジュールがアクセス可能な分野は、次のような図で表せます。
●Wings3dではプラグインを作成できるような仕組みが用意されています。まずはそこをを見てみよう。
解凍ディレクトリ内にあるソースのファイル構成を知る
↓
Erlangの解説書/サイト,Wings3dの開発フォーラム等の情報
↓
Wingsで扱うデータ=レコードの構造を知る(.hrl)
src ディレクトリ以下にあるファイルに仕様が書いてあるので読む。
↓
Wingsコア,E3dモジュールにどんなAPIが用意されているか調べる
↓
各プラグインで使用例を探す
(※複数ファイルを一括で検索するような手段で)
●Wings3dのプラグインのサンプル wpc_ex1.erl を読むのがおすすめ。
作者による説明がたっぷりあり、init , menu , command 関数などの役割が判明します。
これら関数はほぼすべてのプラグインのコードに存在して、プラグインの制御を担ってます。
●Internal function, Local Fanction
外部からアクセスする必要のない内部処理がかかれているので、
使う目的だけの場合、読む必要はあまりない。
Wings3d ソースコードファイルの格納先
|
●内容
Wingsx.x/src-------------------Wingsコアモジュール
Wingsx.x/e3d ------------------e3dモジュール
Wingsx.x/plugins_src-----------各種プラグイン
●srcには、コアモジュールwings_****.erl で始まるファイルがあります。
Wingsの基本的な機能(移動、回転、拡大縮小等)はここに集約されています。
また、 はプラグインモジュールの最初の方でincludeする。wings.hrl
拡張子.hrl のファイルにデータ構造が定義されている事が多い。
●e3dには、e3dモジュール e3d_***.erlのファイルがあり
数学(ベクトル、行列)や2D画像、出入力関連を担当します
●plugins_srcには主に第三者から提供されたプラグインが入ってます。
●Wings3dのダイアログやGUI構築関連
- src/wings_wpa.erl -- プラグインAPI。プラグインを書くときの機能の窓口担当。
このwpaモジュールを通じてGUIを記述した場合、
wings_askやそのほかのモジュールへ渡される仕組みになっている。
- src/wings_ask.erl -- 詳細なダイアログ使い方と仕様が書かれてる。内容はこの文書内で後述します。
GUI部品を構築する関数が定義されている。
より専門的にGUIを記述する場合 wings_ask.erl) モジュールを呼び出して使います。
- plugins_src/wings_test_ask.erl --
ダイアログの使い方の具体例。 enable();を使うと有効らしい。
- src/wings_drag.erl -- インタラクティブなコマンドのためのモジュール
- src/wings_io.erl -- 他のライブラリやソフトと連携するための出入力に用いるらしい。
(Wings3dのプラグインが外部ライブラリと連携している
例:Manifold-LabがQhull Libraryを利用)
★wpa:askで簡単に(モーダル)ダイアログを作成
★wpa:askよりも柔軟にダイアログを設計する場合は次の情報を参考に...
|
プラグインの種類
src/wing_plugin.erl によると
プラグインのファイル名には命名ルールがあって、3つのタイプが定義されています。
3種類のプラグインが作れるようです
wp*_example.erl
このようなファイ名の * にあたる文字でプラグインの種類が分かります。
c 一般的なコマンド拡張プラグイン Command extension plugin-in.
8 外部ユーザインターフェースプラグイン External user-interface plugin.
9 デフォルトユーザインターフェースプラグインDefault user-interface plugin.
ファイル出入力、コマンド(メニューバーと右クリックメニュー)、プリミティブ作成プラグイン。
wpc_circlarise.erl , wpc_obj.erl , wpc_cube.beam , wpc_bend.beam など
その他のものは、OSネイティブのダイアログを構築する為のプラグインに用いられます。
plugins_src/wp9_dialogs.erl 例:一般的なダイアログのためのプラグイン
plugins_src/win32_file/wp8_file.erl 例:Win32ネイティブなファイルダイアログボックス
plugins_src/wx_file/wp8_file.erl 例:Win32ネイティブなファイルダイアログボックス(wxヘッダ使用)
plugins_src/qt_file/wp8_qt_file.erl 例:UnixのQtによるダイアログ
plugins_src/mac_file/wp8_mac_file.erl 例;MacOSXのダイアログ
plugins_src/jpeg/wp8_jpeg_image.erl 例:jpegの出入力
wp8とwp9は、OSのインターフェースに関するものなので、
Wings3dに関する一般的なプラグインを作ろうとする場合は、
c のwpc_で始まるファイル名のプラグインとして、作ることが
多いと思います。
レコード(Wings.hrl)
Erlangのレコード(C言語の構造体のようなもの)
Erlangではデータ型も、型関数として存在していて、そのデータがどんなデータを扱うのかを説明しています。
これはAPIがどのデータを受け渡し加工するのがわかるので、ソースを読み解く手がかりになります。
型関数は、英小文字から始まって括弧()で終わる関数です。term()はすべての型をとる
参考:
Erlang -- Types and Function Specifications
Erlangの型記法(Type Notation) - 檜山正幸のキマイラ飼育記
-type edge_num() :: non_neg_integer().
edge_num() という型は、正の整数型をとる。
gb_tree は 一般的な木構造データ。キーとデータの組をとる。データの追加/削除/検索を想定している。
Erlang -- gb_trees
以下wings.hrl より
%%
%% Types. 型
%%
%この型は、あとのレコードにも適用される
% http://www.erlang.org/doc/reference_manual/typespec.html
% number() はinteger() または float()
%integer() は (〜-1 , 0 , 1〜)
% non_neg_integer() は(0〜)
% pos_integer() は (1〜)
% neg_integer()は(〜 -1)
% 頂点数 vertex_num() は 正の整数(non_neg_integer)をとる。(0〜)
% 辺の数 edge_num() は 正の整数(non_neg_integer)をとる。(0〜)
% 面の数 face_num() は 整数(integer)をとる。(〜-1 , 0 , 1〜)
% 表示可能な面の数 visible_face_num() は 正の整数(non_neg_integer)をとる。(0〜)
% 要素の数elem_num()は 正の整数(non_neg_integer)をとる。
-type vertex_num() :: non_neg_integer().
-type edge_num() :: non_neg_integer().
-type face_num() :: integer().
-type visible_face_num() :: non_neg_integer().
-type elem_num() :: vertex_num() | edge_num() | face_num().
% 選択モードのフラグ sel_mode()は 'vertex' | 'edge' | 'face' | 'body' のいずれか。
% バウンディングボックスは、3つのfloat型のリストをとり、xyz各々の寸法値を表す。
-type sel_mode() :: 'vertex' | 'edge' | 'face' | 'body'.
-type bounding_box() :: [{float(),float(),float()}].
% コマンド wings_cmd() は アトムまたは、タプルをとる。
% コマンド maybe_wings_cmd() は wings_cmd() または アトム' ignore'をとる
-type wings_cmd() :: tuple() | atom().
-type maybe_wings_cmd() :: 'ignore' | wings_cmd().
%頂点バッファwings_vtx_buffer() は 何もないアトム 'none' または、 整数とバイナリデータの組の タプルをとる
-type wings_vtx_buffer() :: 'none' | {integer(),binary()}.
%% State and records
%% Main state record containing all objects and other important state.
% レコード st は 編集状態とオブジェクト情報を格納します
% 全オブジェクトと 編集状態(ファイル名、直前のコマンドのパラメータ、選択領域、バウンディングボックス、アンドゥ情報など)です。
-record(st,
{shapes=gb_trees:empty() :: gb_tree(), % 表示されている全てのオブジェクト(デフォルトは空のBツリー)
selmode=face :: sel_mode(), % 選択モード (デフォルトは face[辺選択モード])
sh=false :: boolean(), % ハイライトがアクティブになっている。.
sel=[], % 現在選択中の領域 : 中身は、IDとGBsetの組のリスト [{Id,GbSet}]
ssels=gb_trees:empty() :: gb_tree(), % 保存された選択領域 (デフォルトは空のBツリー) 、
% ユーザーはメニューから選択領域を登録しておき 呼び出して使うことができる。
%% 一時的な選択領域 かどうか? これは アトム'none' または {選択モード, 真偽値値}のタプルをとる。 (デフォルトは none)
temp_sel=none :: 'none' | {sel_mode(),boolean()},
mat=gb_trees:empty() :: gb_tree(), % 定期済みのマテリアル (GbTree, デフォルトは空のBツリー).
pal=[], % パレット
file, % 現在編集中のファイル名
saved=false :: 'false' | 'true' | 'auto' | integer(), % 保存フラグ,してない|した|自動セーブ|整数値 のいずれかをとる。(デフォルトは false)
onext=1 :: pos_integer(), %次のオブジェクトで使うためのID (デフォルトID=1) (1〜)
%% 保存済みのバウンディングボックス(AutoUVは それ自身の目的により、したがって型にもタプルが許容されます。
%% バウンディングボックスは、 none または bounding_box() または タプルをとる。(デフォルトはnone)
bb=none :: 'none' | bounding_box() | tuple(),
edge_loop=none, %一つ前の辺ループ (デフォルトはnone)
views={0,{}}, % 現在表示されているもののタプル {Current,TupleOfViews}
pst=gb_trees:empty() :: gb_tree(), % プラグイン状態の情報
% gb_treeの キーはプラグインモジュールです。(デフォルトは空Bツリー)
%% 直前に実行された(複数の)コマンド
repeatable=ignore :: maybe_wings_cmd(), % 最後に実行したコマンドでリピート可能なコマンド
ask_args, % ユーザーがコマンド実行中にtabキーを押して出す、Ask ダイアログ で入力した値(移動距離、回転角度など)
drag_args, % ユーザーがコマンド実行したドラッグによる変位量(移動距離、回転角度など)
%% デフォルトコマンド (LMB, RMB).
def={ignore,ignore} :: {maybe_wings_cmd(),maybe_wings_cmd()},
%% アンドゥ情報
last_cmd=empty_scene, %最後に実行したコマンド(デフォルトは、空のシーン)
undo=queue:new() :: queue(), %アンドゥー用の(デ)キュー (デフォルトは 新規作成状態)
next_is_undo=true :: boolean(), % フラグ; アンドゥー/リドゥー状態のトグル(デフォルトはtrue)
undone=[] :: list() % アンドゥー用の複数の状態
}).
%% ウイングドエッジ構造データ(The Winged-Edge data structure)
%% See http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/model/winged-e.html
-record(we,
{id :: non_neg_integer(), %Shape id (シェイプID = 3D空間上のオブジェクトにつけられる) (0〜)
perm=0, % パーミッション(デフォルトは0)
% 0 - 全て許可
% 1 - 表示状態だけど選択不可 (ロックされている)
% [] or {Mode,GbSet} -
% 非表示状態で選択不可、
% Gbsetにはオブジェクトの
% 選択領域が含まれる
name="" :: string() | tuple(), % 名前(AutoUVは他の物をここに格納します)
es=array:new() :: array(), % 辺データが格納される array (型はarray、デフォルトでは新規作成)
lv=none :: 'none' | array(), % 左の頂点の(複数の)属性 (型はarray、デフォルトはnone)
rv=none :: 'none' | array(), %右の頂点の(複数の)属性 (型はarray、デフォルトはnone)
fs :: gb_tree(), % (複数の)面データ (型は Bツリー)
he=gb_sets:empty() :: gb_set(), %(複数の)ハードエッジ(デフォルトは 空のBツリー)
vc :: array(), % 頂点のための接続情報 (=インシデントエッジ)(型はarray、デフォルトは空のBツリー)
vp=array:new() :: array(), %(複数の)頂点の位置 (型はArray 、デフォルトは新規作成)
pst=gb_trees:empty(), % プラグイン状態の情報、(デフォルトは空のBtree )
% gb_treeの キーはプラグインモジュールです。
mat=default, % (複数の)マテリアル
next_id=0 :: non_neg_integer(), %辺、面、頂点のための、次にあるフリーなID(0〜)
% (weレコードがIDを全く再利用しないために このIDが必要です)
mirror=none :: 'none' | non_neg_integer(), % ミラー情報 , none または | Face を取る。(デフォルトは none )
light=none, %光源データ : none|Light
holes=[] :: [integer()] %複数の面のリスト
}).
-record(edge,
{vs=0 :: vertex_num(), % 始点 (Start vertex for edge)
ve=0 :: vertex_num(), % 終点 (End vertex for edge)
lf=0 :: face_num(), % 左面(Left face)
rf=0 :: face_num(), % 右面 (Right face)
ltpr=0 :: edge_num(), %左先行辺 (Left traversal predecessor)
ltsu=0 :: edge_num(), %左後続辺 (Left traversal successor)
rtpr=0 :: edge_num(), %右先行辺 (Right traversal predecessor)
rtsu=0 :: edge_num() %右後続辺 ( Right traversal successor)
}).
%% 現在のビュー/カメラ
-record(view,
{origin,
distance, % 原点からの距離
azimuth,
elevation,
pan_x, % X方向へのパン
pan_y, % Y方向へのパン
along_axis=none, % 視点がどの軸方向に沿っているか
fov, % 視野 ( Field of view.)
hither, % カメラに映る最も近い平面までの距離 (Near clipping plane.)
yon % カメラに映る最も遠い平面までの距離 (Far clipping plane.)
}).
%% オブジェクトごとのディスプレイリスト
%% これらは Wings3d の編集画面の表示方式を記録しています。
%% 重要: プレーンな整数と、リスト内の整数は明確にディスプレイリストであると思われるでしょう。
%% 任意の整数をディスプレイリストとして解釈されないように、
%% タプルかレコードで格納しなければなりません。
-record(dlo,
{work=none, % ワークモード表示 ( デフォルト; none )
smooth=none, % 面のスムースな陰影 ( デフォルト; none )
edges=none, % ワイヤーフレームの辺表示 ( デフォルト; none )
vs=none, % 選択されていない複数の頂点 ( デフォルト; none )
hard=none, %(複数の)ハードエッジ ( デフォルト; none )
sel=none, % 選択済みの(複数の)アイテム( デフォルト; none )
orig_sel=none, %オリジナルの選択領域.( デフォルト; none )
normals=none, % 法線表示( デフォルト; none )
vab = none, %% 頂点array(下をみて)
tri_map = none, %Tri -> Face map (ピッキングのための)
%% Miscellanous.
hilite=none, % ハイライトしたディスプレイリスト
mirror=none, % バーチャルミラーデータ
ns=none, % 面ごとの 法線/位置
plugins=[], % プラグインのための描画リスト
proxy=false, %Proxy データを使うか?.
%% ディスプレイリストの為のソース
src_we=none, % ソースオブジェクト
src_sel=none, % ソースの選択領域
orig_mode=none, % オリジナルの選択モード
split=none, % 分割データ
drag=none, % マウスドラッグ用
transparent=false, % 透明度を含むオブジェクト
proxy_data=none, % スムースプロキシの為のデータ
open=false, % 穴が開いてるか?
% ディスプレイリストのリストは、 存在していないか否かに関係なく、
% ディスプレイモードベースでのみで必要であることが知られています。
%% Example: [work,edges]
needed=[]
}).
%% 頂点arrayバッファ
-record(vab,
{
% 頂点バッファ。 それぞれの頂点バッファ{Stride,Binary},に似ています。
% そこでは、Strideが、頂点バッファをセットアップするとき使用されるべきストライドです)。
face_vs = none :: wings_vtx_buffer(), %面描画のための Vertex binary
face_fn = none :: wings_vtx_buffer(), %面の(複数の)法線 (平坦ですが頂点単位で)
face_sn = none :: wings_vtx_buffer(), %面の(複数の)法線 (スムーズ)
face_uv = none :: wings_vtx_buffer(), %(複数の)UV座標
face_vc = none :: wings_vtx_buffer(), %頂点色の(複数の)座標
face_map = none, %FaceId -> {BinPos,TriCount}
mat_map = none %マテリアルごとの面描画情報
}).
Winged-edge構造
Wings3Dは、頂点や辺や面の位置関係データ構造に、「ウイングドエッジデータ構造」を採用しています。
wings.hrlを読むと、レコードのWe(=Winged edge)にそれが格納されていることが分かります。
これは稜線と接続する辺の稜線の性質を利用した構造です。もしかしたらWings3Dという名前はそこから由来しているのかもしれない?
- 次図(左下):三角錐の頂点Aとそれを含む辺ABにおいて、辺ABとそれに繋がる面lf,rfと辺(赤と緑)に注目して、アジのヒラキ状に展開したものです。
- 次図(右下):また、ウイングドエッジデータ構造は辺ABに繋がる4本の辺の位置関係を左右で分け、さらにそれを先行(predessesor)辺、後続(successor)辺と定義しています。
どちらが先行/後続になるのかは、これらの辺で取り囲む面(rfとlf)を中心に、時計回り(clockwise)の順序で決定されます。
- 次図(右下/左下):また図解内で説明しているvsやltprなどの略称は、Wings3dで扱うWeレコードのフィールド名に対応します。辺や面を扱う場合に役立つかもしれません。
もし、始点と終点の順序が変わった場合(A→Bが、B→Aになる) 辺ABの名前以外のデータはすべて変化します。
また、これらの位置関係を整理すると、任意の頂点や辺に対応するインシデントな辺を求めることができるようです
面に穴があいていた場合は、穴の面を構成する辺は反時計回りになってしまいますが、一筆書きの要領で辿ると時計回り順序で扱えるようです。
詳しい説明は次のリンク先を見て下さい
どの辺とどの辺が隣り合っているか等の位置関係を素早く把握できるらしい。
Wings3dの頂点ナンバーの割当て
オブジェクトの複製によるナンバーの割当には違いがあります。Body|Dupliate と 複数のFace|RegionExtract、それを Combineコマンドで1オブジェクトにしたケースが考えられます。
Body|Duplcateは概ね元のオブジェクトの割当をトレースするようですが、複数 Face|RegionExtractは割当が
また、Wings3dでは、割り振られた頂点番号は頂点や面を追加/削除するたびに、並び順が変わります。
たとえば「#0,
#6,#7,#1,
#8,#9#2,
#10,#11,,#3,
#12,#13,#4,
#14,#15#5,
#16,#17」
今の所、頂点の再ナンバリングをする方法は不明です。
オブジェクト作成プラグインによって、順番が違う?
Extractで増やしたオブジェクトをCombineで1つのオブジェクトにした場合の頂点ナンバーの割当て。(Wings3D v1.2の場合)
Wingsコアモジュールについて
これらsrcディレクトリ内にある、モジュールのファイルには、APIとして利用可能な関数が書かれてます。
Wings3に備わっている機能(押し出しやカメラ操作、GUI)を利用したい場合は、各モジュールの関数をつかってWingsの機能にアクセスできます。
ただし、よりー般的なな処理....ベクトルや行列操作、画像ファイルの出入力は、e3dモジュールとして分離しているのでそれを使って下さい。
wpa.erl ** プラグイン作成のために提供される便利API (選択領域,コンソール,ダイアログ等)
wings_wm.erl **ウインドウマネジャ
wings_wm_toplevel.erl **直接アクセス不可
wings_we.erl** Wings3d の中心となる We: wings recorde 構造体 データの構築と操作
wings_we_util.erl**We構造体用ユーティリティ
wings_we_build.erl ** ポリゴンメッシュのWe構造体の構築用
wings_view.erl ** Viewメニューのコマンド関連
wings_vertex.erl ** 頂点関連のユーティリティ、BB
wings_vertex_cmd.erl
wings_vec.erl ** ベクトルとその 2ndary selection
wings_va.erl **頂点属性モジュール
wings_util.erl ** 様々なユーティリティ関数 gb_tree 大小 キーフォーマット , Unicode対応format関数
wings_util:format/2 は、io_lib:format/2に近いですが、書式が厳格です。しかし~t の引数はユニコードを含むリストを使えます。
現在~tsはアジア文字の翻訳用に対応しており、また、Format ディレクティブは~s~pを使えます。
また、Wings本体の基本メニュー構成と文字列を確認できます。(280行以降)。
メニューに項目を追加する場合はここではなく、プラグインやlangファイルのほうで行います。
(プラグインのメニュー構成や翻訳文字列ははWings本体実行時に、プラグインのcommand()関数や.lang ファイルから自動的に抽出するようです。)
wings_undo.erl ** アンドゥ関連
wings_u.erl ** 様々なユーティリティ関数 エラーmsg, クラッシュログ
wings_tweak.erl ** もともとプラグインだったTweak機能をWingsコアに引き入れました。
wings_toolbar.erl ** AutoUV と ジオメトリのツールバーにアクセス
wings_theme.erl ** ウインドウテーマの色セットデータが直接書かれている
wings_text.erl ** テキストとフォントのサポート
wings_tesselation.erl ** Tesselation/subdivision コマンド
wings_shaders.erl ** シェーダ関連
wings_sel_conv.erl ** 選択領域の変換
wings_sel_cmd.erl ** selectionメニューのコマンド
wings_sel.erl ** 選択領域のユーティリティ関数
wings_scale.erl ** Scale コマンドとベベル(面) のインタラクティブ部分を実装します。
wings_rotate.erl ** Rotateコマンドの実装
wings_render.erl **
シーン内の すべてのオブジェクトと、ヘルパー(軸の補助表示)ニ関するレンダー
GeometryとAutoUVウインドウで使用されている
wings_proxy.erl ** スムース Proxy表示 (実際のポリゴンを非破壊的にスムース表示させる機能)
wings_pref_dlg.erl ** 環境設定の管理(ダイアログ文字列など)
wings_pref.erl ** 環境設定の管理
wings_plugin.erl ** プラグインマネジャを含む、プラグインのサポート
wings_pick.erl ** OpenGLをつかったPick処理。選択域のハイライト
wings_pb.erl ** GUI (プログレスバーの処理)
wings_palette.erl ** 頂点パレットウインドウの維持
wings_outliner.erl **アウトライナーウインドウの維持
wings_msg.erl ** メッセージ表示と定型表示(formatting)のための補助関数
wings_move.erl ** Moveコマンド
wings_menu_util.erl ** メニュー補助とユーティリティ関数(方向,平均化,回転のサブメニュー等)
wings_menu.erl ** GUI (プルダウンメニュー の仕様)
menuデータはseparator または { Text , Name(Atom) , hotkey , HelpSrting, Propaties }
HelpStringは2種類あり、String または L,M,R(マウスボタンで異なる機能を持つ場合)のセット が存在する。
wings_material.erl ** 面のマテリアル管理(例えば色やテクスチャ等)
wings_magnet.erl ** マグネットコマンド
wings_light.erl ** 光源の実装
wings_lang.erl ** 多言語管理
wings_job.erl ** プラグイン作成者のための OS job handling サポート
wings_io_wx.erl ** Low-level WX GUI のための制御モジュール
wings_io_sdl.erl ** Low-level SDLのための制御モジュール
マウスカーソルの形状(通常、砂時計など)がソースに埋め込まれている。
マウスの状態、修飾キー判別、イベントハンドラ、グラブ
wings_io.erl ** 異なるバックエンドへのラッパーモジュール
wings_init.erl ** Wings のビデオとイベントハンドリングの初期化
wings_import.erl ** 外部オブジェクトのインポートを扱うモジュール
wings_subdiv.erl ** 全体と面モードにおける Smoothコマンド
wings_start.erl ** Wings 3D起動時にパッチ; might enable installed patches.
wings_shapes.erl ** このモジュールは立方体や球のように作成された全ての立体の定義を含みます。
wings_shape.erl ** Shape レコード
wings_face.erl ** このモジュールは面(例えば 面 の反復子の高階関数)を補助するルーチンが含まれます
wings_extrude_face.erl ** (複数の)面のための押し出しコマンドを含む。
wings_extrude_edge.erl ** このモジュールはExtrude (edge), Bevel (face/edge) Bumpコマンドを含む。(全てedge の押し出しをベースにしている)
wings_export.erl ** 他のファイルフォーマット(画像)の出力を扱う
wings_edge_loop.erl **辺ループコマンド
wings_edge_cmd.erl ** 辺コマンドとそのユーティリティ関数 (ハードネスとセットカラー)
wings_edge.erl ** 辺コマンドとそのユーティリティ関数
wings_draw_setup.erl** 描画用バイナリデータのセットアップと作成
wings_draw.erl ** OpenGLを使ってオブジェクトを描画する為のモジュール
wings_drag.erl ** コマンドのマウスドラッグによるインタラクティブ操作。
wings_dl.erl ** ジオメトリとAutoUVウインドウのオブジェクトのためのディスプレイリスト管理(ディスプレイリストのガーベジコレクションを提供)
wings_dissolve.erl ** 面の削除(ディゾルブ)
wings_develop.erl ** プラグイン制作者のための開発メニューにある便利な機能
wings_deform.erl **頂点のデフォーム関連
wings_convert
wings_console.erl ** Wings3d コンソール I/O およびコンソールサーバ機能
wings_color.erl ** カラー関連のユーティリティ
wings_collapse.erl ** 面の削除(コラプス)
wings_camera.er ** カメラ関連の処理(rotation, zooming, panning).l
wings_body.erl ** これはオブジェクト全体の為のコマンドの大部分を含む。
wings_ask.erl ** ダイアログ GUI関連 API
wings_align.erl ** 配置と整列に関するコマンドのモジュール( Align と Center )
wings.icon
wings.hrl ** Weデータ構造体
wings.erl ** メイン部分(初期化処理など)
wings_image.erl ** イメージ管理用モジュール(画像の出入力とスクリーンショット)
wings_hotkey.erl** ホットキーの翻訳 バインドとアンバインド
wings_help.erl **
wings_gl.erl ** 一部のOpenGL関連ユーティリティ(GSGLのエクスポートなど)
wings_font_table.erl **
表示されるグリフを構成するetsにおいて蓄積されたフォントテーブルへアクセスする関数を提供。
表示できるものはグリフを、そうでないものは、'undefined'を返し、全フォントテーブル内のグリフを検索処理を行います。
wings__font.erl ** 一般的なフォント操作関数
wings_file.erl ** Fileメニューのコマンド関連
wings_ff_wings.erl ** .wings 形式のファイルの出入力
wings_ff_ndo.erl ** .ndo形式のファイルの出入力
wings_facemat.erl ** このモジュールは面の番号からマテリアルの名前までマッピングの動向をおさえます。
wings_face_cmd.erl ** 面コマンドのほとんどが実装されている
user_default.erl ** Wings ユーティリティによってErlang shell を拡張する。(相互参照 Xref や, Erlangの 静的解析ツール dializer サポート)
array.erl ** arrayモジュール(Ericsson製)
wings_s.erl ** テキスト文字列 環境設定のカメラ、方向、修飾キーなど
メインモジュールと繋がるモジュールの調査
メインモジュール wings.erl で初期化されるものをリストしてみた
wings_pref:init(),
wings_hotkey:set_default(),
wings_pref:load(),
wings_lang:init(),
wings_init:init(),
wings_text:init(),
wings_image:init(wings_io:get_process_option()),
wings_plugin:init(),
wings_color:init(),
wings_io:init(),
wings_camera:init(),
wings_vec:init(),
wings_view:init(),
wings_sel_cmd:init(),
wings_file:init(),
wings_u:caption(St),
wings_wm:init(),
wings_file:init_autosave(),init_menubar(),
wings_pb:init(),
wings_ask:init(),
wings_job:init(),
wings_develop:init(),
wings_tweak:init(),
コアモジュールの中でも、比較的、用途・目的がはっきりしてるもの
wpa.erl ** プラグイン作成のために提供される便利API (選択領域,コンソール,ダイアログ等)
wings_menu.erl ** GUI (プルダウンメニュー の仕様)
wings_pb.erl ** GUI (プログレスバーの処理)
wings_ask.erl ** ダイアログ GUI関連 API
wings.hrl ** Weデータ構造体
wings.erl ** メイン部分(初期化処理など)
wings_theme.erl ** ウインドウテーマの色セットデータが直接書かれている
wings_io.erl ** 異なるバックエンドへのラッパーモジュール
wings_io_wx.erl ** Low-level WX GUI のための制御モジュール
wings_io_sdl.erl ** Low-level SDLのための制御モジュール
この2つのexportはほぼ一緒。マウス、キーボード、アイコン等
wings_job.erl ** プラグイン作成者のための OS job handling サポート
wings_plugin.erl ** プラグインマネジャを含む、プラグインのサポート
wings_develop.erl ** プラグイン制作者のための開発メニューにある便利な機能
plugins_srcディレクトリ内
wpc_test_ask.erl
e3dモジュールについて
Introducing e3d and Dan Gudmundsson(2001年)によると、以下のように紹介されています。
---------引用-----------
e3dとはWingsの一部として分類されますが、実際にはスタンドアロンのErlangモジュール
セットです。現在 出入力(3ds,obj,rib,objなどの出入力)とベクトル、行列関数、2Dイメージ(BMPとTGA)
の読み込みをサポートしています。(これは2001年時点なので、現在はPNGの形式もサポートされています)
利点
1)いくつかのe3dモジュールはwingsモジュールよりはるかに小さく理解しやすい。
Erlang言語を学ぶ好例です。(e3d_bmp,e3d_tga、e3d_tdsをみてどのようにバイナリ
データを扱うのか見てください)
2)プラグインからe3dにアクセスできます。ベクトルと行列の関数が必要となるのは確実でしょう。
出入力プラグインはe3d.hrlで定義されているレコードのメッシュデータを渡す
でしょう。また、他のプラグイン形式はそのフォーマットを使用するかもしれません。s
Dan Gudmundsson氏 (a.k.a. dgud) はe3dを思いつきました。
彼の主張によりWingsコアモジュールの中で一般的に役立つルーチンを、
コアモジュールのコード中に埋めずにe3dにそれらを入れることになりました。
彼は今のe3dの2D画像や最初の3ds出入力ルーチンを書きました、そして現在TIFF読込み機能を
実装していると思います。(2001年時点)
---------引用-----------
E3dのソースコード
これらは、行列やベクトルに関連する制御、または3dデータの変形や出入力、画像の出入力に用いられます。
●使用頻度の調査
command系プラグインでよく使われているもの。e3d_vecはかなり多くのプラグインから利用されていました。
e3d_vec: sub,add,dot,mul,norm
e3d_dist: (TurnEdgeのみ)
import_export系プラグインでよく使われるもの
e3d_image, e3d_mesh , e3d_object,
固有のファイル形式の保存には、たとえば、wpc_3ds では、e3d_tds,e3d_imageが使われている。
種類問わず使われているもの
e3d_util ( 3ds, stl , geodome,ncube プラグインから )
e3d_q (クォータニオン) は auv_texture で使われたりしています。
ファイルの出入力に、3Dデータ、2D画像データ、テキストデータの3種類があり
このうち、前2つは e3dを利用していますが、テキストデータの場合は直接Erlangのfile:open関数を使っているもの(wpc_ai.erl)も見受けられました。
wpa_save_image →wings_export:save → e3d
●定義
e3d.hrl **メモリ内の3dデータに関する定義。各データのレコードの定義がある。type やrecord
ベクトル(座標),点(座標),4x4行列の再現, 正規化された4x4行列
(e3d_vector, e3d_point, e3d_bv,e3d_matrix(),e3d_transf,e3d_face,e3d_mesh,e3d_object,e3d_file)
変形行列、面、ポリゴンメッシュ、オブジェクト、ファイルの定義
●数学、幾何学関連の機能。
e3d_util.erl ** ユーティリティ。 rawデータ(生座標) ←→ indexd形式(頂点/面リスト) 変換
e3d_kd3.erl
orig_kd3.erl ** kd tree (Kd木)の実装 。空間分割データ構造 (http://ja.wikipedia.org/wiki/kd木)
三次元空間上の探索に用いられる。
e3d_qbvh.erl ** QVBHの実装。 面の交差判定に利用されるらしい。
QVBH(Quad-tree Bounding Volume Hierarchy:4分木空間分割階層構造)
論文: http://www.uni-ulm.de/fileadmin/website_uni_ulm/iui.inst.100/institut/Papers/QBVH.pdf
(日本語の情報。明日ではないから--[CG][programming]QBVHを実装した)
QBVHを実装した - 明日ではないから
●ベクトル関連
e3d_vec.erl ** ベクトルの加減乗除、
ベクトル正規化(normalize)、正規化さえれたベクトルの平均、バウンディングボックス
2つのベクトルのとる角度(ゼロ除算対策済)
e3d_q.erl ** クォータニオンユニット (指定ベクトルを回転軸に、空間上の2地点の球面最短経路を通る回転を行う)
●行列関連
e3d_mat.erl ** 3Dの行列関連の基本機能 translate, scale , rotate(移動、拡大縮小、回転) , identify (正規化)
e3d_transform.erl ** 行列関連の機能。 平行投影、透視投影 、逆行列、行列の合成など。
●画像関連
e3d_image.hrl ** 2D画像データのレコード
e3d_image.erl ** 2D画像の出入力と変換を扱う tif , png, bmp,tga 、内部書き出し、法線マップ、ミップマップ
e3d_file.erl ** e3d_file レコードのユーティリティ
e3d__tif.erl
e3d__tga.erl
e3d__bmp.erl
e3d__png.erl
●3Dファイル形式
e3d_tds.erl ** 3ds Studio Max 形式のファイル(.tds)の出入力
e3d_obj.erl ** Wavefront OBJ形式ファイル(.obj)の出入力
e3d_bzw.erl ** BZFlag 用データの出入力
●メッシュ関連
e3d_mesh.erl ** e3dのユーティリティ( クリーンナップと三角ポリゴン化)
e3d_bv.erl ** バウンディングボックスと Quickhull(凸包アルゴリズム), eigen-vec(固有ベクトル)計算の実装
e3d__tri_quad.erl ** メッシュの三角形分割、四角形分割
e3d__meshclean.erl ** e3dメッシュのクリーン(内部モジュール)
wpa.erl及びダイアログ構築
このファイルは、API作者がプラグインを作りやすくする為の便利な機能を提供するために
他の複数のモジュールへデータを受け渡す窓口的役割をしています。
具体例はソースフォルダ内を「wpa:」で複数のファイルの内容を検索すると見つかります。
wpa:ask(title,Qs,Fun)のように使う。
複雑な部分は隠蔽されているので、専門的なことをやりたい場合は、
wpaを使わずそれぞれのモジュールを調べて直接呼び出してやることもできます。
↓次に説明するものは例は最も簡単なダイアログです。
askとdialog
例えば、Wings3dで移動コマンドを実行した時に、移動量を決めるのにマウスドラッグで調節する他に、
Tabキーを押して、モーダルダイアログから入力する方法があります。
このaskとdialog関数はその時にダイアログを出現させる機能を提供します
(wpaでは複雑な部分は隠蔽されており、実際にはwings_ask.erlへバイパスされている)。
wpa:askは定型的で単純なものが多いです。
Wings3dの様々なプラグインのコードを比較してみると、
自由度の高いダイアログを作成する場合は、wpa:dialog のAPIを使っているようです。
Wings3Dの GUIのフォームからどのように値を取得するかについては、全く文書化されていないので、調べてみたところ仕組みは多分このようになってるかと思われます(後で検証予定)。
プラグインの wpc_ncube.erl や wpc_torus.erl を読むと参考になるでしょう。
Scaleコマンドの例
Sweepコマンドの例
|
例:import_export/wpc_hlines.erl
|
wpaモジュールには、機能に合わせて2つのタイプ4種類が用意されています。
askもdialogも、簡単な書式で定型ダイアログが構築出来るように設計されています。
- wpa:ask : シンプル版。しかし、フィールドの単一リストしかサポートしていません。
- wpa:dialog : 高機能版。しかし、ほんの少しだけ難解です。
これらはどちらもダイアログを表示させる基本的APIです。
複雑な部分は外から見えなくなっていて、これらは、そのままwings_ask.erl へ渡されます。
ask は 最も単純な定型ダイアログを作成します。
タイトルと 、Qs(レイアウト記述のデータ) 、関数 を指定します
Qs をどのように書けばいいかは、この文書内で後述しています。
ask(Title, Qs, Fun) ->
wings_ask:ask(Title, Qs, Fun).
ask(Bool, Title, Qs, Fun) ->
wings_ask:ask(Bool, Title, Qs, Fun).
dialog(Title, Qs, Fun) ->
wings_ask:dialog(Title, Qs, Fun).
dialog(Bool, Title, Qs, Fun) ->
wings_ask:dialog(Bool, Title, Qs, Fun).
ask/3 と 4 関数の違いは、 wings_ask.erl を読んで下さい。
ask/3はbool は trueフラグ が最初から省略されているタイプで、
ask/4で ask(true, Title, Qs, Fun) すると同じになります。
% ask(Title, Qs, Fun) -> ask(true, Title, Qs, Fun).
% ask(Bool, Title, Qs0, Fun) ->
% {Labels,Vals} = ask_unzip(Qs0),
% Qs = [{hframe,
% [{vframe,Labels},
% {vframe,Vals}]}],
% dialog(Bool, Title, Qs, Fun).
このQsを見てみると、
おそらく、コンテナ hframe の中に 、横並び(vframe)で ラベルと値がレイアウトされると思われます。
% Label [Val] Label [Val]
------------------------------------------------------------------------------------
どのような種類の関数でwings_ask:dialog/3 を使うのですか?
http://nendowingsmirai.yuku.com/topic/7315/wings-ask-dialog-3
例えば command/2 のような関数を指し示す有効なタプル
{select,{similar_normals,Args}}, これは
command({select,{similar,Args}}, St).として呼び出されます。
それが、そのダイアログから呼び出したコマンドである理由です。
ダイアログの問い合わせによる結果を再び別のコマンドから呼び出す用途に使われます。
------------------------------------------------------------------------------------
これら小型ダイアログは、wings_uモジュールへバイパスされます。
%% エラーメッセージのダイアログ
error_msg(String) ->
wings_u:error_msg(String).
error_msg(Format, Args) ->
wings_u:error_msg(Format, Args).
%% Yes, No , Cancel 選択ダイアログ。 小型のダイアログ。
%% Yes型 :エラー通知やシステム上の確認に使われる事が多い。
yes_no(Question, Yes) ->
wings_u:yes_no(Question, Yes).
%% Yes、No型
yes_no(Question, Yes, No) ->
wings_u:yes_no(Question, Yes, No).
%% Yes, No , Cance型
%% 例 「保存して終了しますか?」 Yes(保存して終了)、No(すぐ終了)、Cancel(終了をあきらめる)
yes_no_cancel(Question, Yes, No) ->
wings_u:yes_no_cancel(Question, Yes, No).
%% キーとコマンドを結びつける何らかの関数 未調査
bind_unicode(Key, Command) ->
wings_hotkey:bind_unicode(Key, Command, plugin).
bind_virtual(Key, Mods, Command) ->
wings_hotkey:bind_virtual(Key, Mods, Command, plugin).
Import
%%% Import/export support.
%% St を返す。
import(#e3d_file{}=E3dFile, St) ->
wings_import:import(E3dFile, St).
%% 何も返さないタイプ : 最終的に import_filename
import(Props, Importer, St0) ->
%% import_filename([Prop], Continuation). は Continuation(Filename). と同じように呼ばれます
import_filename(Ps, Cont) ->
wings_file:import_filename(Ps, Cont).
Export
%% export([Property], ExporterFun, St)
%%
%% Recognized values for Property:
%% {subdivisions,Levels}
%% {tesselation,none|triangulation|quadrangulation}
%% {include_colors,Bool}
%% {include_uvs,Bool}
%% {include_hard_edges,Bool}
%% {include_normals,Bool}
%% Export には、全部を保存するタイプと、選択部分だけを保存するものがある。
export(none, Exporter, St) ->
export_selected(Props, Exporter, #st{selmode=Mode}=St) when Mode == body; Mode == face ->
穴そのものの面形状が書き出しされるのを防ぐ為に、選択領域を補う形で穴を作成します。
通常我々はメモリを節約する為に穴の面形状を削除(ディゾルブ)しますが、この
Weデータは、一時的なものなのでその必要はありません。
wings_we:create_holes(Holes, We).
%% この _filenameがついた関数は、 Continuation(Filename). と同じように呼ばれます。
%% export_filename([Prop], Continuation).
export_filename(Prop, Cont) -> wings_file:export_filename(Prop, Cont).
%% export_filename([Prop], St, Continuation).
%% この St (Wingsの状態レコード) の中には、ファイル名のデータも含まれていて、それが使用されます。
export_filename(Prop, St, Cont) -> wings_file:export_filename(Prop, St, Cont).
%% save_images(E3DFile0, Directory, DefaultFiletype) -> E3DFile
%% 全マテリアル内のすべてのイメージを保存し、保存されたイメージそれぞれに、ファイル名を挿入します。
%% E3DFile = #e3d_file{}
%% DefaultFiletype = Extension (list), 例えば ".bmp"
save_images(E3DFile, Directory, Filetype) ->
wings_export:save_images(E3DFile, Directory, Filetype).
ダイアログテンプレート
3Dファイル形式ファイルの出入力の際に定型的に用いられる、部分的なGUIレイアウトを提供します。
いくつか種類があります。たとえば、X/Y軸を入れ替えるかどうかのチェックボックスや、
テッセレーションをどのくらいにするかを、指定するラベルと入力欄などです。
これらGUIのまとまりを組み合わせて、ダイアログウインドウに埋め込むことができます。
impor_export/wpc_3ds, bzw,collada,exl,obj,ply,wle,x.erlに使用例があります。
また、import_export/wpc_obj.erl に、わかりやすい具体例があります。
実際のレイアウトは、wings3d アプリケーションで、file >export >obj形式で
保存する時のダイアログに見ることができます。
一般的なダイアログを返す。
%% dialog_template(Module, Type) -> Template
%% Module = callers module (used as preference key)
%% Type = import|export
dialog_template(Mod, import) ->
dialog_template(Mod, export) ->
dialog_template(Mod, tesselation) ->
%% dialog_template(Module, Type, ExcludeKeys) -> Template
一般的なダイアログを返します。
%% Return a template for a standard dialog. The flags argument makes
%% it possible to exclude certain keys.
%% Module = callers module (used as preference key)
%% Type = import|export
%% Flags = List of keys to exclude from the dialog template
定型ダイアログ中に表示させたくない項目がある場合。取り除きたい項目のキーのリストを
Flags に指定する事で非表示にできます。
dialog_template(Mod, Type, Flags) ->
import_scale_s() -> ?__( 1, "Import scale").
export_scale_s() -> ?__( 1, "Export scale").
import_matrix(Attr) ->
export_matrix(Attr) ->
環境設定データ
%%% Preferences.
%%% Mod には ?MODULE が渡されます。
内部的に wings_prefモジュールへ渡されます。
pref_get(Mod, Key) ->
pref_get(Mod, Key, Default) ->
pref_set(Mod, KeyVals) when is_list(KeyVals) ->
pref_set(Mod, Key, Value) ->
pref_set_default(Mod, Key, Value) ->
pref_delete(Mod, Key) ->
%%% Scene preferences.
%%% Mod には ?MODULE が渡されます。
これらは、レンダラー関連のプラグインimport_export/wpc_kerky, wpc_povlay, wpc_yafaray に使用例があります。
これら set/delete 関数は、値のリストをセットまたは削除し、そしてもしも値の変更があったならば、ジオメトリウインドウにメッセージを送ることで、Wings3d をグローバルなneed_save 状態へ更新させます。
scene_pref_get(Mod, Key) ->
scene_pref_get(Mod, Key, Default) ->
scene_pref_set(Mod, KeyVals) when is_list(KeyVals) ->
scene_pref_set_default(Mod, KeyVals) when is_list(KeyVals) ->
scene_pref_delete(Mod, Keys) when is_list(Keys) ->
選択領域ユーティリティ
%%% Selection utilities.
これらはauto_uv プラグインで使用例があります。
sel_set(Sel, St) ->
これら面は、同じ領域に属すために少なくとも1つの編を共有しなければなりません(頂点を共有するのは十分ではありません)。(wings_selモジュールのface_region関数と同じ)
sel_face_regions(Faces, We) ->wings_sel:face_regions(Faces, We).
同じ領域に属させるために、少なくとも1つの頂点(または辺)を共有する複数の面でなければいけません。
このwpaモジュールのsel_strict_face_regions関数は、wings_selモジュールのstrict_face_regions関数へ丸投げしています。
sel_strict_face_regions(Faces, We) -> wings_sel:strict_face_regions(Faces, We).
その他(未調査)
%%%
%%% Picking. (3D画面で、選択した領域のことか?)
%%%
%% pick(X, Y, St0) -> {add|delete,{Id,Item,original|mirror},St}.
%% Pick the item (body, face, edge, or vertex, depending on the selection
%% mode in St0) and either add it to the selection or delete it from
%% the selection.
%%
%% The first element in the returned tuple will indicate whether
%% something was added or deleted from the selection, and the second
%% element will indicate which item in which object was picked.
%%
%%%
%%% Drag and drop support
%%%
drag(Tvs, Units, St) ->
wings_drag:setup(Tvs, Units, [], St).
drag(Tvs, Units, Flags, St) ->
wings_drag:setup(Tvs, Units, Flags, St).
drop(WindowName, DropData) ->
wings_wm:send(WindowName, {drop,DropData}).
%%%
%%% Vertex functions.
%%%
%%% Camera info.
%%%
camera_info(As) ->
wings_view:camera_info(As, wings_view:current()).
%%%
%%% Get all lights.
%%%
lights(St) ->
import_lights(Lights, St) ->
%%% Images.
%%%
image_formats() ->
wings_image:image_formats().
image_read(Ps) ->
wings_image:image_read(Ps).
image_write(Ps) ->
wings_image:image_write(Ps).
%%%
%%% Virtual mirror.
%%%
vm_freeze(We) -> wings_we:freeze_mirror(We).
%%%
%%% Tesselation/subdivision.
%%%
triangulate(We) ->
wings_tesselation:triangulate(We).
triangulate(Faces, We) ->
wings_tesselation:triangulate(Faces, We).
quadrangulate(We) ->
wings_tesselation:quadrangulate(We).
quadrangulate(Faces, We) ->
wings_tesselation:quadrangulate(Faces, We).
%%%
%%% Console
%%%
popup_console() ->
wings_console:popup_window().
%%%
%%% External commands
%%%
2ndarySelection関連
今まで調べてきて、いまいちよくわからないのがユーザーから軸や頂点を選択(入力)してもらい、その入力を元に変形処理を行う2ndarySelectionのやり方です。
プラグイン wpc_bend.erl,wpc_intersect_edge.erl, wpc_shift,intersect_vertex.erlにそのヒントがあった。
ソースコードを読んでいくと、そのコマンドがどんなユーザー入力を必要として、どのような順番で2ndarySelectionが進行していくのか、手がかりを追ってみることにした。
例えば....
submenu(3, Ns) ->
wings_menu:build_command(
{'ASK',{[{axis_point, ?__(6,"Pick axis perpendicular to plane (plane will pass through axis's base)")}],[],[]}}, Ns).
とか
submenu_items(1, Clamped) ->
{{plastic_bend,Clamped},
{'ASK',{[{point, ?__(1,"Pick rod center")},
{point, ?__(2,"Pick rod top")},
{axis, ?__(3,"Pick bend normal")}]
++ submenu_clamp(Clamped),[],[]}}};
こういう記述が見つかります。
point, axis と関連するメッセージがリストされています。
上も下も最終的に、wings_menu:build_command関数へ渡しています。
これは何をやってるか、コアモジュールであるwings_menu.erlの build_command関数の部分を探してると、
そこでは単純に、list:foldl(リストの畳み込み関数(左))によって'ASK'関数へ、リストをまるごと処理させているようです。
list:foldlというのは、畳み込み関数といってErlangに最初から用意されている関数です。
さて、ややこしい括弧を解きほぐすと、
wings_menu:build_command({ {送るコマンド名} ,{ 'ASK' , {[選択箇所&メッセージのリスト],[],[]} , Ns);
のようになり、さらに選択箇所&メッセージのリストの構造を(マクロなどを省いて)分解して、単純に表すと->
[
{axis_point, "軸と点を選択してください" },
{axis , "軸を選択してください" },
{point , "点を選択してください" }
]
このように分解できます。
現在調べたのはここまで。
Todo:
・list:foldlの仕組み(畳み込み関数)について調べる
・どんな値が返ってくるのかを調べる。返ってきた値はどう処理されるのか?
・wings_menu:build_command()を使っていない大半のプラグインは、どのようにユーザーが選択(入力)した軸や頂点を取得しているかを調べる。
wings_ask.erlのメモ
より高度なダイアログを使うためのGUIの書式とAPIがあるようです。
GUIを構築する Qs(クエリ文字列)は wpc_test_ask.erlに説明がありますが、
次のURLも参考になります→More information about dialogs - wings_ask.erl in PROGRAMMING Forum
wpc_test_ask.erlの説明は、一応下でも日本語訳してあるのでリファレンスとしては使えるかもしれません。
ただ正規表現風に一括して書かれているので理解しにくい人もいるでしょう。
プラグイン等のコードから実際に使われている部分を探して読むのが一番かもしれません。
とは言っても、Qs 書式がわかりにくいのは、Erlang の文法のせいで、大量のカッコ開きカッコ閉じにうんざりします!!!!
しかし、ちょっと見方を変えるだけで、ソースを読むとっかかりが見えて来ます。
Erlang のややこしいカッコの入れ子もXML風に考えると、絡まった思考もほぐれてきます。
★直接wings_askモジュールの wings_ask:dialog を利用しているプラグインのリスト
wpc_numeric_camera.erl
wpc_snap.erl
wpc_grid_snap.erl (Origin of virtual Grid:Mボタン実行時にTabでダイアログを出す)
wpc_absolute_move.erl
wpc_absolute_scale.erl
wpc_bbox.erl
wpc_untrianglate.erl
wpc_sculpt
auv_texture.erl
動的に
wpc_plane_cut.erl
wpc_yafray.erl
wpc_pov.erl
wpc_test_ask.erl
wp9_dialogs.erl
内容はかなり多彩になります。
★wings_ask.erl で使える関数。
-export([init/0,ask/3,ask/4,dialog/3,dialog/4, hsv_to_rgb/1,hsv_to_rgb/3,rgb_to_hsv/1,rgb_to_hsv/3]
wings_ask:dialog( ほげほげ )
例: 状態フラグ→ inert|disabled|enabled
inert , disabled , enabled のいずれかが該当する。
=== ダイアログ関連のデータ構造 =====================================================
-record(s,
{w,
h,
ox,
oy,
call,
focus, %フィールドインデックス
focusable, %フィールドインデックス群のタプル
mouse_focus=false, % フィールドをマウスがクリックしたか判定
fi, % 全フィールドの静的データ
n, %フィールド数
coords, % 判定のための座標群
store, %全フィールドのデータ
level, %入れ子レベル
owner, %結果を送る場所
grab_win % ひとつ前にフォーカスを取得したウインドウ
}).
%% フィールド毎の静的データ
-record(fi,
{handler, % 無名関数のハンドラ
key=0, % フィールドのキー
index, %フィールドのインデックス
state=inert, % 状態フラグ→ inert|disabled|enabled
minimized, % 最小化フラグ→ true|false|undefined
hook, % アリティ(引数)2を持つ、フィールドに対する(無名)フック関数 fun/2
flags=[], % 複数フィールドのリスト
x,y, % 左上の位置
w,h, % 縦横サイズ
stretch=0, %水平伸張による影響
extra % コンテナまたは、末葉データ
}).
%% (複数の様々なフィールドを格納できる)コンテナフィールドのための静的データ拡張
-record(container,
{type, % コンテナタイプ(フレーム) → vframe|hframe|oframe
x,y, % コンテナ位置
w,h, %コンテナサイズ
fields, % フィールドやタプル tuple()が 含まれている
selected, % 整数値または未定義 integer()|undefined
stretch, % 伸張された要素の合計
w0,h0 % 未伝播な外側(フィールド)のサイズ
}).
%% 末葉フィールドのための静的データ拡張
-record(leaf,
{w,h % あるべき (最小)サイズ
}).
==== Qs の 書式=====================================================================
具体的な使用例は wpc_test_ask.erl で見ることが出来ます。
共通タイプ
String = string() テキスト
Boolean = true または false (アトム)
Fields = [Field] 複数フィールドが集まったリスト。
Field -- フィールド、どんなフィールドのタプルも以下に挙げるものの集合です。
Key = term()
キーに用いる値には、整数値 integer() は フィールドの相対的アドレス(場所)を指し、
それ以外の term() は絶対的な識別子を表します。
キーの意味合いからいうと float()を使うのは好ましくありません、
動く事は動きますが、パターンのミスマッチや間違いの元になります。
フィールド共通データ( 共通フィールドのタイプを指定したもの、これはダイアログツリーの走査等に使われる )
はダイアログツリーに格納されており、#fi{}レコードの入れ子で構成されています。
フィールドのプライベードデータ (特別なフィールドタイプを指定したもの) とフィールドの値は
同じ gb_tree に格納される。
全フィールドは、ダイアログツリー内に整数値1から始まるフィールドインデックスを持っており、
それは ツリー走査(traversal)順にカウントアップされる( Qs と同じく 深さ優先 )
書いたもの順に番号が割り振られる
[1 [2[3[4[5]]]]6 [7[8]]9--- 深さ優先
[1 [4[6[8[9]]]]2 [5[7]]3---幅優先
参考解説サイト:情報処理概論(Java)より tree traversal
フィールドプライベートデータは、 キーが負のインデックス番号として gb_tree に格納されており、
フィールドタイプに依存するタイプのレコードとは異なります。
フィールドの値は、 キーとしてフィールドインデックス(デフォルト)を伴った gb_treeに格納されており
もしキーに整数値が使われている場合はフィールドは他のフィールドと値を共有しており
そのキーは相対的フィールドインデックスのオフセットとして扱われる。
もしも、キーが整数以外の項 term ならば、それは格納されている実際のキーとして使われる。
非整数のキーを持つ全てのフィールドは、ダイアログの結果として {Key , Value}を返すでしょう
ほとんどのフィールドは、下に書いた場合を除き、値を返します。
Hook = function()
ボタンなどを押した時にフックして呼び出す関数はアリティ(引数)2 と void を返すものでなければいけません。
void はあらゆる値が来た時にそれをスルーさせるため必須です。
たとえば
fun (is_disabled, {Var,I,Store}) -> Bool;
全てのフィールドが再描画された時に呼び出される。 コンテナ内のフィールドはアクセス不能
ですが、コンテナフィールドそのものはそうではありません。
(is_minimized, {Var,I,Store}) -> Bool;
全てのフィールドが配置された時に呼び出される。(フレームに重なったものを除く)
(update, {Var,I,Val,Store}) ->keep|{store,NewStore}|done|{done,NewStore}|{layout,NewStore}
確実に値をNewStore 内に格納させてください。
done または {done, _} はダイアログが終了(あるいは再始動したとき)に返されます。
{layout,_}は レイアウトにフォーカスが渡された時
フィールドが変化した時に呼び出されます。
(menu_disabled, {Var,I,Store}) -> [Disabled];
Disabled = Val|{Val,MenuFlags}
Val = menu 値
MenuFlags = 他のメニューフラグを準備する為のフラグ
Only called for menu fields.
(_, _) -> void
end
Qs は 1つ下のフィールド( 参照可能な内容のあるフィールドがまだある、またはフィールドのリストで {hframe,...}
でくくられている内に2つの{vframe , ...}が内包されている) 場合、それぞれ最初のものをQsとして、
二番目の内容をOK と Cancel ボタンを含むようにするのが望ましいです。
●●●フィールドコンテナ(ダイアログツリーノード)●●●
●フレーム要素
{hframe,Fields[,Flags]} -- Horizontal frame
{vframe,Fields[,Flags]} -- Vertical frame
Flags = [Flag]
Flag = {title,String}|{minimized,Boolean}|{key,Key}|{hook,Hook}|layout|
checkbox|invert
フレーム要素のみ、 'title' と 'minimized' フラグ両方とも返します。
'checkbox' フラグは、ヘッダを含むチェックボックスを持つフレームのスタイルがが最小化したときに
返されます。(おそらくクリックでオプションが折りたたまれるタイプのもの)
'invert' フラグは チェックボックス値と返り値が最小化の反対が行われた(最大化、クリックで広がった状態)
ことを示します。
●オーバーレイ要素
{oframe,Fields[,Flags]} -- Overlay frame
Flags = [Flag]
Flag = {title,String}|{style,Style}|{key,Key}|{hook,Hook}|layout
Style = menu|buttons -- menu is default
●●●コンポジットフィールド(他の複数のフィールドで構成されている)●●●
●複合要素
{vradio,Alts,DefaultValue[,Flags]} -- 複数のラジオボタンの垂直配置
{hradio,Alts,DefaultValue[,Flags]} --複数のラジオボタンの水平配置
Alts = [{PromptString,Value}]
Flags = [Flag]
Flag = {key,Key}|{title,String}|{hook,Hook}
例: wpc_am.erl. をみてください。 これらは{hframe,...} / {vframe,...}内に {key,...}/{key_alt,...} フィールドが構成されています。
●ラベルの列
{label_column,Rows} -- ラベルフィールドの行と列
Rows = [Row]
Row = {String,Field}
これは、 {vframe,...} フィールドと1つの{vframe,Fields}がその分野を含んでいる1つの {label,String}を含む {hframe,...}です。
●スライダーとカラーボックス/テキストフィールドのコンボ
{slider,{text,Def,Flags}} -- Slider on text field
{slider,{color,Col,Flags}} -- Slider on color box
下のスライダーの通常のフィールドを見てください。 これは{hframe、…}2つを含むフィールドです。
●ボタン押すと、テキストフィールドになにか出る
{button,{text,Def,Flags}} -- 参照ボタンのテキストフィールド
Flags = [Flag]
Flag = {props,DialogBoxProperties}|{dialog_type,DialogType}|
{drop_flags,DropFlags}|RegularFlags
DialogType = open_dialog|save_dialog
DropFlags = [{index,Index}|{key,Key}|{hook,Hook}]
ボタンが押されたら、データをドロップする場所を指定したフィールドへ格納します。
Index = integer() ドロップターゲットの相対的フィールドインデックス。
Key = ターゲットをドロップするフィールドのキー
Hook = ターゲットフィールドをドロップするときに呼び出すフック関数
●●●一般的なフィールド (ダイアログツリーの末葉)●●●
●追加タイプ:
RegularFlags = [RegularFlag]
RegularFlag = {key,Key}|{hook,Hook}|{info,String}|
{stretch,Stretch}|layout
注意: 'layout'フラグは、フィールドの値に変更があれば強制的に、layout に渡されます。
デフォルトではStretch は 0 に設定してあり、フィールドが使われるhframe 内に含まれる時に
水平パディングがどのくらいあるか定義します。
水平パディングは 均等にStretch因数に広げられます。
●空白要素
panel -- 単純スペースを空ける stretch 1
{panel,RegularFlags}
値を返さない。
●不可視フィールド
{value,Value} -- 不可視フィールドによる、値を保持
{value,Value,RegularFlags}
●ラベル
{label,String} -- ラベル文
値を返さない。
●分割線
separator -- 水平セパレータ (メニューの分割線)
値を返さない。
●カラー選択ダイアログ
{color,Col[,RegularFlags]} -- サブダイアログで カラー調整ボックスを出す
Col = {R,G,B}|{R,G,B,A}
R = G = B = A = X, 0.0 =< X, X =< 1.0
●ラジオボタン
{alt,Def,String,Val[,RegularFlags]} -- ラジオボタン
Def = term() -- ラジオボタングループの初期値
1つのラジオボタングループにつき最初にどれか選択済みでなければいけない。
Val = term() -- ボタンの値
{key_alt,{Key,Def},String,Val[,Flags]} -- ラジオボタン
-> {alt,Def,String,Val,[{key,Key}|Flags]}
●ポップアップメニュー
{menu,Alts,Def[,RegularFlags]} -- ポップアップメニュー
Def = term() -- メニューの初期値
1つのメニュー選択肢には、この値が設定しておかなければいけない。
Alts = [Alt]
Alt = {String,Val}|{String,Val,MenuFlags} -- 記述と 値
Val = term()
MenuFlags = [{info,String}]
●ボタン
{button[,String],Action[,RegularFlags]} -- ボタン
Action = ok|cancel|done|function(Result)
Only Action == 実行後に返る値
もしStringが省略されて、Actionが アトムだった場合、Stringには アトムの文字列表現(英大文字)が入ります。
もし アトムが存在しない場合、Stringは必須です。
●カスタム表示
{custom,W,H,DrawFun[,RegularFlags]} -- ビュアーのカスタム表示
W = H = integer() -- Field size
DrawFun = function(X, Y, W, H, Store)
フィールド描画させ、おそらく'keep'.が返って来ます。
他の返り値も可能です--詳細はソースを読んでください。
●スライダ
{slider,{text,Def,Flags}} -- テキスト欄上にスライダがある
{slider,{color,Col,Flags}} --カラーボックス上にスライダがある
{slider,Flags} -- 単一のスライダ
Flags = [Flag]
Flag = {range,{Min,Max}}|{color,true}|{color,ColKeySpec}|
value|RegularFlag
ColKeySpec = {r,KeyG,KeyB}|{g,KeyR,KeyB}|{b,KeyR,KeyG}|
{h,KeyS,KeyV}|{s,KeyH,KeyV}|{v,KeyH,KeyS}
'range'フラグは必須。
R,G,B,H,S スライダの範囲には 0.0〜1.0を越える範囲を使っていはいけません。
V カラースライダの範囲には0.0〜360.0を超える範囲を使っていはいけません。
キー "Key*" にはスライダーに反応して背景色が変化するような、プロパティを読込む為に使われます。
{text,_,_} または{color,_,_} フィールドに同じフラグが渡されています。
もし'value'フラグが使用されていたなら、値のみ返ります。
● 数値欄またはテキスト欄
{text,Def[,Flags]} -- 数値欄またはテキスト欄
Def = integer()|float()|String -- 初期値
Flags = {range,{Min,Max}}|{width,CharW}|{password,Bool}|
{charset,Charset}|RegularFlag
CharW = integer() >= 1
Min と Max は Defと同じタイプでなければならず、
テキスト欄では許可されていません。
Min にはまた '-infinity' 、 Max には 'infinity'が指定可能です。
CharW には文字列が。デフォルト幅は30
integer()なら 8, float()なら12が設定されます。.
文字列には latin1 または unicode が可能です(デフォルトは latin1です)
●チェックボックス
{String,Bool[,RegularFlags]} -- チェックボックス
● ヘルプボタン
{help,Title,HelpLines} -- ヘルプボタン
Title = String
HelpLines = [HelpLine] | fun() -> [HelpLine]
HelpLine = String
●右クリックメニューとサブメニュー
右クリックメニューリストへプラグイン自身の名前を追加するために、サンプルでは一番末尾に名前を追加するのですが
他のプラグインのソースを覗いてみると、再帰を使ってリストを分離しながら再構成して、任意のコマンド名にマッチしたらその次へ、自身の項目を追加するといった様子です。
Fun(無名関数)とメニュー構築はリストへの追加が一番単純な方式、メニュー項目をリストの途中へ挿入する場合は関数の再帰を使ってリストを分離しながら再構成して、任意のコマンド名を見つけてその次に挿入するようになっています。あと、リストの逆順に戻しておくことがポイント。
役立つ情報;サブメニューを作る方法。
[primitives] adding a submenu in PROGRAMMING Forum
wings_plugin.erlのメモ
wings_plugin.erl のソースコードのあらすじ。
※注意:プラグインを作成する場合はこのジュールを隅々まで読む必要はないと思いますが、プラグイン全体の情報を取得するとかに興味ある人は読んでおくといいかも。
このモジュールがプラグインインストール及び、使用/不使用の管理、プラグイン実行時のパイパスを行っています。
プラグイン実行時には、wings_plugin.erlが、それぞれのモジュール名を引き出し共通する関数(たとえば、init(), menu(), command() )を呼び出してるようです。
init(): prefデータから、インストールされてるプラグインリストを取得、使用/不使用プラインの有無を調べているらしい。
インストールディレクトリも調べる
→→ [line:163] init_plugin() case catch M:init(Ui0) of ...
おそらく、各プラグインのinit()関数を呼び出しているのだと思われる
最後に put により wings_plugins へデータが入れられる。
このwings_pluginsのデータをもとに、プラグイン管理が行われるようです。
↓
またmenu, command も 2種類ある
■ プラグインバイパス用
[line:113]
menu()
menu_1(get(wings_plugins), Name, Menu).→→ menu_1([M|Ps], Name, Menu0) →→ case catch M:menu(Name, Menu0) of ...
command()command(Cmd, St) -> Ps = get(wings_plugins),
command([M|Ps], Cmd, St) -> case check_result(?MODULE, Other, St) of
next -> command(Ps, Cmd, St);
Res -> Res
また、ここで Plugin-Manager へ分岐する
↓
↓
↓
■ Plug-In Managerのメニュー用
[line:339]
manager_menu()
[line:360]
manager_command()→→[line:418]cat_xxx()それぞれの関数→→ try_menu();→→ Caregory リストに入れられる。
xxxには Command , Tool ,Select , Rende ,Import/Export , Primitives が該当する
[line:441]cat_command_fun() ->command_menus() ->ここでは、属するカテゴリ名をゲット
Modes = [{vertex},{edge},{face},{body}],
Cmds = [move,scale,rotate,flatten],
Modes ++ [{Mode,Cmd} || {Mode} <- Modes, Cmd <- Cmds]
++ [{vertex,deform},{face,tesselate}].
↓
↓
↓
Categories = [cat_command_fun(),fun cat_tool/1,fun cat_select/1,
fun cat_render/1,fun cat_import_export/1,
fun cat_primitive/1],
Cps0 = [{category(Categories, P),P} || P <- Ps],
↓
↓
↓
[line:373]
Cps = wings_util:rel2fam(Cps0),
Fun = fun(Res) ->
Disabled = [M || {M,false} <- Res],
put(wings_plugins, Ps -- Disabled),
update_disabled(Disabled, St)
end,
ダイアログの構築、タイトルバーに Plug-In Manager と表示される。またその時に実行されるのが 上の Fun 関数。
Dialog = mk_dialog(Cps, false),
wings_ask:dialog(?__(1,"Plug-In Manager"), Dialog, Fun);
↓
↓
↓
ダイアログ構築開始
[line:387]
mk_dialog()
↓
GUIの構築、水平フレームに、ボタンとプラグイン名、それを垂直フレームに入れることで、リストを並べている。
plugin_modules(C, Ms) ->
{hframe,[{vframe,[{atom_to_list(M),member(M, get(wings_plugins)),
[{key,M},
{info,?__(1,"Enable or disable this plug-in ")++
?__(2,"(a disbled plug-in does not show up in menus)")}]} ||
M <- Ms]},
{vframe,[plugin_info(C, M) || M <- Ms]}]}.
↓
↓
↓
[line:455]
それぞれのコマンドのカテゴリが渡された時に、 それに対応する処理を行う
plugin_info(export_import, M) -> export_import_info(M); → ラベル名関係の関数
↓
[line:553] 関連づけられているホットキーの取得? → その後 collectmenu();へ
normalize_menu([{Name,[_|_]=Menu}|T]) ->
case plugin_key(Menu) of
none ->
normalize_menu(T);
Key ->
Cmd = wings_menu:build_command(Key, reverse(tuple_to_list(Name))),
[Cmd|normalize_menu(T)]
↓
[line:441]
command_menus() ->ここでは、属するカテゴリ名をゲット
Modes = [{vertex},{edge},{face},{body}],
Cmds = [move,scale,rotate,flatten],
↓
[line:512]
plugin_menu_info([]) -> panel;
各メニュー情報を取得
↓
[line:545]
plugin_root_menu(body) -> ?__(1,"body: ");
文字列表示
↓
完了&戻る。plugin_modulesへデータが返ってGUIへ文字が送られる?
wpa全API
-module(wpa).
-export([ask/3,ask/4,dialog/3,dialog/4,error_msg/1,error_msg/2,
yes_no/2,yes_no/3,yes_no_cancel/3,
bind_unicode/2,bind_virtual/3,
import/2,import/3,import_filename/2,
export/3,export_selected/3,
export_filename/2,export_filename/3,
save_images/3,
dialog_template/2,dialog_template/3,
import_matrix/1,export_matrix/1,
send_command/1,
pref_get/2,pref_get/3,pref_set/2,pref_set/3,
pref_set_default/3,pref_delete/2,
scene_pref_get/2,scene_pref_get/3,
scene_pref_set/2,scene_pref_set_default/2,scene_pref_delete/2,
sel_get/1,sel_set/2,sel_set/3,sel_map/2,sel_fold/3,sel_convert/3,
sel_edge_regions/2,sel_face_regions/2,sel_strict_face_regions/2,
drag/3,drag/4,drop/2,
pick/3,
vertices/1,vertex_pos/2,vertex_flatten/3,vertex_center/2,
faces/1,face_vertices/2,face_outer_vertices_ccw/2,face_outer_edges/2,
face_dissolve/2,face_dissolve_complement/2,
edge_loop_vertices/2,
obj_name/1,obj_id/1,
camera_info/1,lights/1,import_lights/2,
image_formats/0,image_read/1,image_write/1,
vm_freeze/1,
triangulate/1,triangulate/2,quadrangulate/1,quadrangulate/2,
popup_console/0,version/0
]).
wpc_ex1.erl のサンプルコード
プラグインのサンプル wpc_ex1.erlで使用されるモジュールは wpa、e3d_mesh、wings_uがあります。
特にwpa.erlはプラグイン制作者のための便利APIを提供しています。
これらは各モジュールから特に有用な物だけをピックアップして利用できるようにしたもの。
wpa.erlから各モジュールにバイパスされるため複雑な部分は隠蔽されている。
さらに専門的な事をする場合は、各モジュールから提供される関数をつかいましょう。
(例えばGUIの詳細仕様は src/wings_ask.erlにあり、また使用例は、 plugins_src/wpc_test_ask.erl で読むことができます。 )
wins_ask: ダイアログ(ask と dialog, テンプレート)
wings_u: Yes Noダイアログ
wings_hotkey
wings_import(+wings_pb)
wings_file
wings_export(+wings_sel)
wings_we
wings_wm メッセージ送信
wings_pref シーン情報と環境設定
wings_sel 選択領域へのアクセスと制御
wings_pick 選択領域のピック
wings_drag ドラッグ&ドロップ
面頂点情報の取得
wings_util Array key
array
wings_vertex
wingss_edge_loop
wings_face
wings_view
処理
wings_tesselation
コンソール
wings_console
プラグインの手がかり
ほとんどのWings3dのwpcプラグインは
Wings本体とやりとりする窓口は、ほとんどinit, menu, command の3つの関数に集約されます。
★プラグイン内の menu , command 関数に渡されるアリティ(引数)は、そのプラグインが
どの選択モードで右クリックメニューを出したときに項目名が表示されるのか。
また、ツールメニューのどの項目を選んだ場合に使われるかが、手がかりになります。
また、加工する頂点や辺の座標のデータはレコードSt内にあることがわかります。
vertex, edge, face , body ,shape ....3Dオブジェクト選択モード
tool, file, select ....ツールバーのメニュー
St.... Wings3d の情報 (ファイル名や現在選択中の頂点や辺などの情報)
★init は trueを返します。そのプラグインが有効かどうかを確認するために使われるのかもしれません。
★menuは 各モード(頂点、辺、面, 全体、 シェイプ)のメニュー項目の構築と、atom識別子の定義
Shape= シェイプとはBody(全体)選択モードで無選択の時に、立方体や円柱などのプリミティブ立体を配置する場合のモードです。
渡されたメニュー項目に、プラグインの項目名を挿入、追加するものが多いです。
ただし、この項目追加のやり方が各プラグインで様々で、それぞれの書き手の好きな方法でやってます。
そのため、単純にメニューの最後に追加するやり方が無難です。
また、大量のコマンドを追加するタイプのプラグイン作者は、メニューあたりの項目を増やしすぎないように、
サブメニューを作ってそこに自分の作ったコマンド項目を展開させるようにしていて、インターフェースに配慮しているようです。
★commandはメニュー項目が選択されたら呼び出され、atom識別子及び、Wings3dの各種状態(State)情報を格納した
St レコードが渡されます。このStレコードはwings.hrlで定義されていて、プラグインはこのSt内のデータを
加工することになります。
。またバイナリのWings3dを起動して、実際にダイアログを出したり操作してみて
ソースコードのテキスト文字列とあわせて追うのも。理解の手がかりとなります。
プラグインのソースコードを追っていくにあたり、複数ファイルを開いて比較検討するのは骨が折れます。
そこで、比較対象のために一部をここに引用します
プリミティブ系プラグイン
wpc_ncube
menu({shape}, []) -> ncube_menu();
menu({shape}, Menu) -> Menu ++ [separator|ncube_menu()];
menu(_, Menu) -> Menu.
command({shape,{ncube, Arg}},_St) -> make_ncube(Arg);
command({shape,{ngon, Arg}},_St) -> make_ngon(Arg);
command(_, _) -> next.
wpc_plane
menu({shape}, []) -> plane_menu();
menu({shape}, Menu) -> Menu ++ [separator|plane_menu()];
menu(_, Menu) -> Menu.
command({shape,{regularplane ,Ask}},_St) -> make_regular_plane(Ask);
command({shape,{lumpyplane ,Ask}},_St) -> make_lumpy_plane(Ask);
command({shape,{wavyplane ,Ask}},_St) -> make_wavy_plane(Ask);
command({shape,{sombreroplane ,Ask}},_St) -> make_sombrero_plane(Ask);
command(_, _) -> next.
wpc_torus
menu({shape}, []) -> torus_menu();
menu({shape}, Menu) -> Menu ++ [separator|torus_menu()];
menu(_, Menu) -> Menu.
command({shape,{uvtorus,Ask}}, _St) -> make_uv_torus(Ask);
command({shape,{lutorus,Ask}}, _St) -> make_lu_torus(Ask);
command({shape,{sptorus,Ask}}, _St) -> make_sp_torus(Ask);
command(_, _) -> next.
wpc_image
menu({shape}, Menu) -> insert_before_image(Menu);
menu(_, Menu) -> Menu.
command({shape,image_plane}, _St) -> make_image();
command({shape,{image_plane,Name}}, _St) -> make_image(Name);
command(_, _) -> next.
wpc_bend
menu({vertex}, Menu) ->
menu(_,Menu) -> Menu.
command({vertex,{bend,Type}}, St) -> bend_cmd(Type, St);
command(_,_) -> next.
Command系プラグイン
wpc_absolute_move
menu({Mode},Menu) when Mode == vertex; Mode == edge; Mode == face; Mode == body; Mode == light -> parse(Menu, Mode);
menu(_,Menu) -> Menu.
command({_,{absolute,Mode}},St) when Mode == move; Mode == snap; Mode == csnap; Mode == nsnap -> Mirror = check_mirror(St),
move -> move(St);
snap -> wings:ask(selection_ask([reference,target]), St, fun snap/2);
csnap -> wings:ask(selection_ask([target]), St, fun csnap/2);
nsnap -> wings:ask(selection_ask([reference,target]), St, fun nsnap/2)
command(_,_) -> next.
wpc_circularise
menu({Mode}, Menu) when Mode =:= edge; Mode =:= {auv,edge} -> lists:reverse(parse(Menu, [], Mode, false));
menu(_,Menu) ->Menu.
command({Mode,circularise}, St) when Mode =:= edge; Mode =:= {auv,edge} -> process_circ_cmd(find_plane, St);
command({edge,{circularise,Plane}}, St) -> process_circ_cmd(Plane, St);
command({edge, circularise_center}, St) -> process_cc_cmd(none, St);
command({edge,{circularise_center,Data}}, St) -> process_cc_cmd(Data, St);
command(_, _) -> next.
wpc_shear
menu({vertex,deform}, Menu) ->
menu(_,Menu) -> Menu.
command({vertex,{deform,{shear,{GlidePlane0,{Radial0,{rmb,{'ASK',Ask}}}}}}},St) ->
command({vertex,{deform,{shear,{GlidePlane0,{Radial0,lmb}}}}},St) ->
command({vertex,{deform,{shear,{GlidePlane0,{rmb,{'ASK',Ask}}}}}},St) ->
command({vertex,{deform,{shear,{GlidePlane0,{mmb,{'ASK',Ask}}}}}},St) ->
% match 'Repeat Drag' arguments from 'ASK' selections
command({vertex,{deform,{shear,{GlidePlane0,{Radial0,{rmb,{Origin,GlidePoint}}}}}}},St) ->
command({vertex,{deform,{shear,{GlidePlane0,{rmb,{Radial,Origin,GlidePoint}}}}}}, St) ->
command({vertex,{deform,{shear,{GlidePlane0,{mmb,{Radial,Origin}}}}}}, St) ->
command({vertex,{deform,{shear,Data}}},St) ->
出入力系プラグイン
wpc_obj
init() -> true.
menu({file,import}, Menu) ->
menu({file,export}, Menu) -> import /exprt で判別してそれぞれ分岐
menu({file,export_selected}, Menu) ->
menu(_, Menu) -> Menu.
command({file,{import,{obj,Ask}}}, St) -> do_import(Ask, St);
command({file,{export,{obj,Ask}}}, St) ->
command({file,{export_selected,{obj,Ask}}}, St) ->
command(_, _) -> next.
wpc_ps
init() -> true.
menu({file,import}, Menu) ->
menu(_, Menu) -> Menu.
command({file,{import,{ps,Ask}}}, _St) when is_atom(Ask) ->
command({file,{import, ps, [Nsub]}}, St) ->
command(_, _) -> next.
wpc_x
init() -> true.
menu({file, export}, Menu) ->
menu({file, export_selected}, Menu) ->
menu(_, Menu) -> Menu.
command({file,{export,{x,Ask}}}, St) ->
command({file,{export_selected,{x,Ask}}}, St) ->
command(_, _) -> next.
====================================================================================
Credit of code.
====================================================================================
% wpc_turnedge.erl -- Plug-in for turning edges Copyright (c) 2002 Chris Osgood, 2003-2011 Bjorn Gustavsson.
% wpc_circularise.erl -- making them circular. Copyright (c) 2008-2011 Richard Jones.
% wpc_ncube.erl -- N-Cube and N-Gon Plugin Copyright (c) 2003-2011 Anthony D'Agostino
% wpc_x.erl -- DirectX export plugin Copyright (c) 2004-2011 Sean Hinde, Danni Coy, Dan Gudmundsson, and Ed Kolis
% wpc_image.erl -- Image plane plug-in Copyright (c) 2002-2011 Bjorn Gustavsson.
% wpc_absolute_move.erl -- Copyright (c) 2006-2011 Andrzej Giniewicz
% wpc_shear, ps.erl -- Copyright (c) 2010-2011 Richard Jones.
% wpc_cylindrilize.erl -- Copyright (c) 2008-2011 Richard Jones.
% wpc_constraints.erl -- Copyright (c) 2008-2011 Richard Jones.
% wpc_ambocc,plane,torus.erl-- CopyRight (c) 2008-2011 Anthony D'Agostino, Dan Gudmundsson
% wpc_bend.erl -- Plug-in for bending vertices Copyright (c) 2005-2011 Dave Rodgers
プラグインのメモ1
(未検証!)プラグインで作れるものは、新規立体作成。変形コマンド、ファイル出入力(Importer/Exporter)の3つが考えられます。
Wings3DプラグインのErlangコードを読解するための手がかり。
- レコードの扱い方(書き換え、作成、宣言、マッチング)
- 一部のプラグインのメニュー構築に、再帰関数や無名関数が使われている。
- Wings3dの辺や頂点データはバージョン1.1以降arrayで管理されている。
- Erlangのモジュール、関数の作成方法、パターンマッチ、変数の束縛
- Erlangのマクロ定義と記述
- rr().関数は、レコードデータを読む(ReadRecord)
- Erlangの変数は英大文字かアンダーバーから始まる。
- 小文字の変数はアトム:「名前が値がそれ、値そのもの」を表現するデータのこと。列挙体 英小文字から始まる、または「'」で囲まれる文字列。例:true, false
- Erlangの束縛。 (A = B: AはBに入りますか?→条件にマッチしたら入る)
- 変数の束縛(変数は値が決まったら、それ以降は変更できなくなる→もし値を変えたいなら、そのつど結果を入れるための新しい変数を作成する)
- 文字列は「"」で囲まれる
- レコードと、タプルとリストの違い→ { } , [] (変更不可)
- Erlangの関数は群体型、マッチする条件は最初の方限定的で、一番最後が最もゆるい条件、一番終端の関数から上へ読むとわかりやすい。
- バイナリデータ → << 〜 >>
- リスト内包表記 → <-
- リストの追加、削除、分割、リストの先頭を追加する方法→ ++ , --,[ Head | List ]
- 単一のアンダースコア 「_」は無名変数で、任意の値でマッチするが。その結果は取り出せない、またコードの書き手はその値には興味が無いという意味を持ちます。
- ソースコードから、wings_intl.hrl,wings.hrlの内容もあわせて読んでおけば理解が進みやすいかもしれないです。
wings.hrlの「The Winged-Edge data structure」にはデータ構造レコードの説明があります。
ガード → 関数のパターンマッチを補助する仕組み、when 以下条件をさらに絞り込められる,複数可能。
Wings3Dのソースコード中によく登場する ?__( 6,"hogehoge") というのはマクロで、これは「__」という名前で、他国語版のデフォルト翻訳文字列に関係あると思われます。ひょっとしたらマクロによって「〜.lang」ファイルの各国語のメニュー表示に置き換わるのかもしれない!?
また、Wings3dのソースコード intl_tools/wings_intl.hrl を探すと、 -define(__(Key,Str), wings_lang:str({?MODULE,Key},Str)). が定義されているのが分かります。
各プラグインに共通の関数は init(), menu() , command() 関数。menu()では 右クリックMenuリストへ、セパレータや項目を追加したりしてるらしい。
参考:Question about translations... (technical) - PROGRAMMING - Wings -
Exploring Wings3D through the Erlang Shell
のFirstExampleの解説
レコードはC言語の構造体と似ている。また名前付きのデータ領域として利用できます。
※Wings3d v1.1 以降、内部エレメントデータの格納には gb_treeではなくarrayを使用しています
<ソースはExploring Wings3D through the Erlang Shellより引用>
1: f(),
2: rr("c:/erlang/wings/src/wings.hrl"),
3: St = wpa:get_state(),
4: #st{shapes=Shapes,sel=Sel} = St, % レコードからデータを取り出されたものが、右辺の変数 Shapes、Selに代入されます。
5: We = gb_trees:get(1, St#st.shapes), % Shapesの内容は St#st.shapes と同じです(この例では)
6: Vs = gb_trees:values(We#we.vp).
1行目 全ての束縛変数を破棄し、リセットする。
2行目 rr()関数で、wings.hrlにある State-Record(状態データ/選択部分など) と、Wingd-Edgeデータ(オブジェクトの座標など)の定義を読込む
3行目 変数 St にレコードの状態データ(States)を束縛
4行目 Stの全データのうちから shape と sel というフィールド名を持つデータを絞り込み、条件にマッチしたものを、レコードSt#st として左辺へ取得。
このサンプルコードで、ややこしい部分がこの4行目です。#st{shapes=Shapes,sel=Sel} でマッチした右辺の変数ShapeとSelの内容が変化することがポイントです。英文の解説では、4行目はレコードからのデータを取り出すやり方を示しただけなので、ShapesとSelの2つの変数は5行目以降に直接関係しないと書かれています。 ただしShapes にはSt#st.shapesと同じ内容が入っているとも説明されています。
それから、#st{shapes=Shapes,sel=Sel} = St というのは、#st{shapes=Shapes,sel=Sel} = #st{shapes=GBTREE,sel=LIST}. と同じ意味らしいです。
これによりレコードのフィールドデータにアクセスするためには、St#st.shapes と書きます。(作成名#レコード名.フィールド名)
また、shapesはGBTREE(General Balanced Trees 平衡ツリー)データ、sel はLISTデータであることがわかる
平衡木とは 【balanced tree】 - 意味/解説/説明/定義 : IT用語辞典
5行目は We というのは(
Wingd-
edgeの略で) 1つの稜線に接続する辺や頂点に関するデータを束縛するものです。
6行目は Winged-Edgeデータのうち、vpにリストされたデータの値をVsに束縛すると思われる。
まだまだ不明な点が多いです。
プラグインを開発する方法
いまのところ、2種類の作成方法が見つかっています。
注意: 最新の Wings3D v1.3.1 は、Erlang(OTP/R14)以降で動作します。もし古いErlangのバージョンを使ってるなら make時に ./array.erl:253: function error/1 undefined というエラーが出ます。
また Wings3D v1.3.1以降 は Intel Macのみで動作するようです。
その1:Wings3D内のErlangShell上でプラグインをコンパイル | その2:Wings3Dソースコードと一緒にプラグインをコンパイル |
必要な物:
ソースコード一式(Erlang , Wings3D )
・makeやinstall必要なし、必要なファイルを拝借するのに必要。
Wings3Dアプリケーション(※Erlangソースコードからcompilerモジュールを持ってくる)
ターミナル.app (ターミナルを起動して、bashで作業するため)
|
必要な物:
ソースコード一式( Erlang ,SDL ,esdl ,Wings3D )
・Erlang,esdl,Wings3Dは、ビルド、makeし、インストール済であることが条件
・SDLは、ビルド、makeし、Home以下にインストールしてあることが条件
ターミナル.app (ターミナルを起動して、bashで作業するため)
|
あまり手間がかからない。
Wings3D内にあるErlang Shell上で、プラグインをコンパイルする。
ただし、初期状態ではコンパイルする機能c()は使えないのでErlang言語本体から拝借する。
また、bashでpathを通しておきWings3Dと対話できる状態にしておく。
システムにインストールしないので手軽そうですが、正式な方法ではないのでリスクがあります。
|
準備に時間を要する
例えば、Wings3Dをビルドするとき、デフォルトプラグインに紛れさせて一緒にコンパイルさせる。
Makefileへ設定を追加してから、コマンドライン上(bash) から make するだけ。
前準備のインストールが大変ですが、正式な手順で作成されます。
|
なお、Wings3dプラグインのモジュール名は、wpc_から始まる必要があるようです。
Getting camera transforms - PROGRAMMING - Wings - Wings3D Wings3Dのプラグインに関するトピック
How to Create Wings3D Plugins with C - PROGRAMMING - Wings - Wings3D どのようにして Wings3Dのプラグインを作るのか? HelloWorld。C言語のソースもあるようです。
wpc_ex1.erl Wings3Dプラグインの例。モジュール名 wpc_ex1
その1:Wings3D内のErlangShell上でプラグインをコンパイルする方法
あらかじめ、Erlang本体ソースコードのディレクトリから compilerを拝借してWings3Dへ入れておきます。
- とりあえず、作ったプラグインのソース モジュール名.erlをホームディレクトリ直下へ置いておく。
- ターミナル.appを起動
- bashに一時的にPathを通して、Wings3Dと対話できるようにしておく。
- ErlangShell が立ち上がるので、ErlangShell上でコンパイルのためのコマンドを入力
c(モジュール名). %% (モジュール名部分は、ファイル名から拡張子を除いた名前)
カレントディレクトリ(デフォルトではホームディレクトリ直下)を確かめておくこと。
- このとき、プラグインがソース中でヘッダファイルをincludeしている場合は別途、ヘッダファイルを用意する。
これらはWings3Dソースコードにある、例えば「wpc_ex1.erl:122: can't find include file "e3d.hrl"」という
エラーが出たら、それらファイルを Wings3Dのソースコードのe3dディレクトリから拝借して、 いまコンパイルしようとしているソースコードと同じ場所にコピーしておきます。
それで、もう一回c()を実行してみる。
Erlang Shell上でのコンパイルと Include path
通常 c( ) を使ってerlファイルをコンパイル場合は、 erlファイル内でinclude されているヘッダファイル(.hrl)を
同階層のディレクトリにおけば自動的にinclude されます。
もし、他の場所に .hrl ファイルがある場合は、c()関数のオプションに、その場所のディレクトリパスを指定すると、走査されます。
タプル{}を追加することで、複数の場所を指定することが出来ます
wpc_ex1.erl
include_directory_path/e3d.hrl
include_directory_path/e3d_image.hrl
このように、別ディレクトリにIncludeすべきファイルがある時には、Erlang Shell上では、
compile:file("wpc_ex1.erl",[{i,"./include_directory_path/"}]).
または、
c ("wpc_ex1.erl",[{i,"./include_directory_path/"}]).
のように書くとコンパイルが通ります。
これでおしまい。あとは、Wings3Dでプラグインをインストールするために、beam ファイルを指定します。
その2:Wings3Dソースコードと一緒にプラグインをコンパイルする。(ただし、Wings3D自体のコンパイルは失敗しました)
Wings3DのMacOSX版をビルドしようとして
失敗した記録。(一応プラグイン類はコンパイルされた)
必要なものは、Erlang,SDL,ESDL,Wings3Dで、順番でビルド、インストールしていきます。
BUILD.unix の説明書によればOSX版のWings3Dを完璧にビルドするには、fbx library(FBX SDK?)が必要とのことですが、今回はインストールしていません。
fbx libraryは
Autodesk - Autodesk FBXから入手することができます(要ユーザー登録)。
日本語の解説(ダイキン)
■環境。CPU=Intel Core Duo 2 GHz, OS= MacOSX 10.5.8
Wings3Dを解凍したディレクトリ直下に、ビルドのやり方を説明した BUILD.unix
というテキストファイルがあるので、これを参考に進めていきます。
■準備
Wings3D 1.2 のソースコード をダウンロード http://www.wings3d.com
Erlang/OTP R13B04 のソースコード をダウンロード http://www.erlang.org
SDL-1.2.14 のソースコードをダウンロード http://www.libsdl.org.
ESDL 1.0.1 のソースコードをダウンロード http://esdl.sf.net
■順番にインスト−ル
===========================================================================
■Erlang/OTP R13B04をインストールする。
Terminalを起動し、Erlangのアーカイブを解凍したディレクトリに入って
./configure --enable-threads --disable-hipe
途中、fop is missing. The documentation can not be built.というエラーメッセージが出ますが気にしない。
そして
make
結構時間がかかるので、お茶でも飲みます。makeが終わったら....インストールします。
sudo make install
これにより
/usr/local/lib/erlang にErlangのファイルがインストールされます。また、
/usr/local/bin/に typer,to_erl.run_erl,escript, erlc,erl,epmd,dialyzer が
インストールされます。
===========================================================================
■SDLライブラリ:(prefixにより、ホームディレクトリにインストールされます。
ドキュメントによれば、既にシステムにインストールされたSDLと混じらないようにするためらしい。)
SDLを解凍したディレクトリに移動してから
./configure --disable-video-aalib --disable-video-directfb --prefix=$HOME
make
10分くらい待つ
sudo make install
これにより、ホームディレクトリ以下の/share, /bin, /lib, include/ にSDL関連のファイルが保存されます。
===========================================================================
■ESDLライブラリ:
ESDLをビルドする前に、やっておく。
which sdl-config
sdl-config --libs
もし、sdl-config が見つからなかったら
cd /Users/User名/bin
という場所に移動して、sdl-config を直接実行する。
以下のコマンドを入力し、コンフィグを設定する。
./sdl-config --libs
ターミナルに、-L/Users/ユーザー名/lib -lSDLmain -lSDL -Wl,-framework,Cocoa
という感じで表示されればOK
その後で、ESDLをビルドします。ESDLを解凍したディレクトリに移ります。それで
make
sudo make install
これにより、usr/local/lib/erlang/addons/esdl-1.0.1 以下にESDLがインストールされます。
===========================================================================
■Wings3D:
いよいよWings3Dのビルドが始まります。いきなりエラーがでて失敗です。
エラーを回避するため、各ソースのヘッダファイルまでのpathを書き換えました。
もっとスマートな回避方法が、あるかもしれない....。
ヘッダファイルが足りないというエラーが出た!
./wings.hrl:17: can't find include lib "esdl/include/sdl.hrl" というエラーが表示されたので
準備として esdl 内のヘッダファイルをWingsのあるディレクトリにコピーする
例えば、/usr/local/lib/erlang/addons/esdl-1.0.1から、 Include ディレクトリをWings3Dの解凍ディレクトリ直下に コピーする。
また、コピーしたディレクトリの中に、一緒に sdl_util.hrl も入れて下さい。
テキストエディタで、 /wings-1.2/src/wings.hrl 内の include_lib のパスを相対パスに書き換え、つじつまを合わせる。
-include_lib("../include/sdl.hrl").
-include_lib("../include/sdl_events.hrl").
-include_lib("../include/sdl_video.hrl").
-include_lib("../include/sdl_keyboard.hrl").
-include_lib("../include/sdl_mouse.hrl").
-include_lib("../include/sdl_util.hrl").
-include_lib("../include/gl.hrl").
-include_lib("../include/glu.hrl").
また、/wings-1.2/src/wings_body.hr の include_lib のパスを相対パスに書き換える。
-include("../include/sdl_keyboard.hrl").
/wings-1.2/plugins_src/primitives/wpc_image.erl の include_lib のパスを相対パスに書き換える。
-include_lib("../include/gl.hrl").
/wings-1.2/plugins_src/commands/wpc_constraints.erl の include_lib のパスを相対パスに書き換える。
-include("../include/sdl_keyboard.hrl").
ターミナルで、Wings3Dを解凍したディレクトリに移ります。
export ESDL_PATH='/usr/local/lib/erlang/addons/esdl-1.0.1'
make macosx
Makefile の以下の行(71行目)をコメントアウトすると、FBX形式のプラグインを省略させて進めます。
# (cd plugins_src/fbx; $(MAKE))
# (cd plugins_src/fbx; $(MAKE) lang)
export ESDL_PATH='/usr/local/lib/erlang/addons/esdl'
make macosx
↑最後の最後でアプリケーション作成に失敗。プラグインはコンパイルされる。
テスト用のプラグインをコンパイルしよう。
Wings3Dのプラグイン作成の例題として公開されているテストコードがあります。
Dan Gudmundssonさんの作成した「
wpc_ex1.erl」
今回は、コンパイルしたコードが本当にWings3Dで動作するのかを試したいと思います。
●プラグインをコンパイルする
ソースコードをダウンロードし、/wings-1.2/plugins_src/import_export/へ放り込む
Makefileに追加記述する: /wings-1.2/plugins_src/import_export/Makefile を開き、MODULES = のリストに「wpc_ex1」を加える
/wings-1.2/ 直下で make
/wings-1.2/plugins/import_export/ 以下に「wpc_ex1.beam」が生成される。
これを任意の場所(デスクトップなど)に、コピーする。
うっかりミス← .beamファイルが生成されない? wpc_ex1.erl ファイル名の拡張子の後に、半角スペースがくっついてたのが原因
●プラグインをインストールする
とても簡単。Wings3Dを起動し、File>Install-Plugin を選択。
ファイルダイアログが現れるので、先ほどのwpc_ex1.beamを選択する。
これでWings3Dで使えるようにインストールされます。
●プラグインを使ってみる
すると、Wings3Dのメニューに、File>ExportにExample-exporter が追加されます。
この形式で出力する場合は、あらかじめオブジェクトのUVマップを書き出しておく必要があります。
Exportを実行すると、hogehoge.wex1(バイナリファイル)、auvBG.tga(テクスチャ)の2つのファイルとして保存されます。
エラーログ
Wings3Dで内部エラーが出たときアプリケーションがクラッシュせずに、Geometryウインドウをクリックすることでで、何事も無く続行できます。
このとき、Users/ユーザー名/wings_crash.dump というテキストファイルにエラーログが吐き出されます。その内容は、エラー報告の時に役立ちます。
ログには、実行経過を記録したスタックトレース情報が保存されます。 (Short stack trace と、 Long stack trace)
エラー発生した関数と引数、そして呼び出し元の関数をどのくらい経由していたのかがわかります。
トレースデータは一番先頭から 2,3行くらいの内容が重要だそうです。
エラーについての情報は、
Erlang実験室:分かりにくいと評判のErlangエラーのまとめ - 檜山正幸のキマイラ飼育記
が詳しいです。
エラーの例↓
Wing3D1.3.0.1にて、Geometryウインドウにあるメニューから Window>Tewak_palette を出そうとしたところ、エラーが発生した。
Dump written 2010-4-20_22-17
Version: 1.3.0.1
Window: geom <----- Geometry ウインドウの操作中に発生
Reason: function_clause <-----エラーの原因 呼出時にマッチする関数節 が見つからない とのこと
Short stack trace:
[{wings,command_1,2}, <----------- 最後に、この関数、 wingsモジュールに存在する wings:command_1/2 関数(引数2)でエラーが出た
{wings_develop,time_command,2},
{wings,raw_command,4},
{wings_wm,handle_event,3},
{wings_wm,send_event,2},
{wings_wm,do_dispatch,2},
{wings_wm,get_and_dispatch,0},
{wings,init,1}]
Long stack trace:
[{wings,command_1,
[{window,tweak_palette}, <----- 引数に渡された内容。
{st,{0,nil},
face,false,[],
{0,nil},
none,
{1,
{default,[{maps,[]},
{opengl,[{ambient,{1.0,1.0,1.0,1.0}},
{diffuse,{1.0,1.0,1.0,1.0}},
{emission,{0.0,0.0,0.0,0.0}},
{shininess,1.0},
{specular,{1.0,1.0,1.0,1.0}},
{vertex_colors,set}]}],
nil,nil}},
[],undefined,true,1,none,none,
{0,{}},
{0,nil},
ignore,none,none,
{ignore,ignore},
{window,tweak_palette},
{[],[]},
true,[]}]},
{wings_develop,time_command,2},
{wings,raw_command,4},
{wings_wm,handle_event,3},
{wings_wm,send_event,2},
{wings_wm,do_dispatch,2},
{wings_wm,get_and_dispatch,0},
{wings,init,1}]
Argument #2:
参考:
Not a programmer but want to help? - PROGRAMMING - Wings - Wings3D - Official Development Forum - Message Board Yuku
ソースコードからデータ抽出
ソースコードをデーターベースという視点で眺めれば、ドキュメントを自動生成する事は可能です。様々なプログラム言語で、ソースコードから関数やコメント文を抽出してドキュメントを自動生成するツールはたくさんあります。これは、プログラマ中心で使うドキュメントであり、主にAPIの構成を把握するのに役立ちます。
しかし一方、プログラマがなるべく面倒なことをしたくないのと同じように、ユーザーやドキュメント作成者も面倒なことはしたくありません。
メニュー構成やインターフェースについて知りたいなると、メニューを何回も開いたり閉じたり途方も無い労力が必要です。
さらに多言語化、度重なる更新、UIとドキュメントのギャップ(日本語ユーザーで、あえて英語版を使う場合に日本語表記のマニュアルが役立たない。 また3Dソフトは他のソフトの操作体系に切り替える事ができるものが多いので、1つのやり方でドキュメントを書いても対応しきれない。)を考えると割に合いません。
メニュー文字列はどこに?
wings3dはコード中に「?__()」マクロを埋め込んでいて、翻訳ライブラリで有名なgettextと似た方式でメッセージデータを作っています。
gettextと違う点は、翻訳文字列が書かれているlangファイルは、[ ]や{ }の入れ子でコード中の関数名の構造をトレースしているので
ソースコードを知っている者はその文字列が、コードのどの局面で使われているかを予想することができます。
しかし色々試していくと、
デメリットもあり、それらがソースコードの構造に依存しすぎているため
ヘルプ文字列やコマンド名が混在することが多く第三者がデーターベースのように分類したり抽出することは
難しい事が分かっていきました。
例えば、コマンド名と対応する文字列が混在していて、機械的にメッセージを抜き出しにくい。
さらに、他の欧米言語版のlangファイルを見ると、機能追加された部分のメッセージデータが、重複キーで追加されている。
これだと、元の場所に入れ直すの間違えればデータを壊しかねない。
ちなみにJSONデータの場合重複キーがあると後ので上書きされてしまう。
またデータによっては、改行を ¥n で表現するタイプと、複数の引用符を並べる方式があってそれも
JSONデータの変換の壁になっている。
メニュー文字列の場所
実は、wings3d本体のメニューに表示される文字列はwings_xx.langの
(注:データは入れ子構造になっていて、この文書ではデータ内の場所を、親ー>子 の順に表記することにします。)
"wings"ー>"init_menubar"
"wings"ー>"tools_menu"
"wings_view"ー> "menu"
"wings_sel_cmd"ー> "menu"
"wings_vertex_cmd"ー> "menu"
"wings_shapes"ー>"prim_name"
に分散されている。これら場所はファイル中の一カ所にまとまっている訳ではない。
一応、"menu_util"ー>"translation_strings" という部分に
あらゆるメニュー文字列からプリミティブ立体のコマンド名まで290個リストされてるのですが、
イタリア語版をはじめ欧米言語のlangファイルではこの部分は未翻訳、英語のままになっている。
もし各言語リソースに該当のキーがない場合(翻訳漏れが発生していたとしても)、英語版の項目名が適用されます。
JSON版でデータのシミュレートを行ったときに、"wings_sel_cmd"ー>"menu"データに食い違いがあり
・未選択領域をロック
・undefined
・undefined
・選択領域の記憶
・選択領域の呼出
このように表示されました。
この現象は、実際のWings3dではメニューでもundfinded の項目はなぜか英語表示であったことと一致します。
全ての翻訳構造のベースとなる英語版langファイルでは
"104": "Unhide All Objects",
"105": "Unlock All Objects",
と定義されています。おそらく後で追加されたコマンドの文字列なのでしょう。
これは、日本語版ファイルに、キー"104"と"105"に対応する文日本語字列を追加すれば実際のメニューにも表示されるようになると思います。
もし翻訳してもメニューに変化がない場合は、キー情報が間違っている可能性があります。
本体英語メッセージ(wings_en.lang)のキー情報も一緒に確認して変更点がないか確かめた方がいいかもしれません。
ドキュメント整備プロジェクト
『作業メモ』
目的:ソースコードを元に、javascript + HTMLでwings3dの全言語ヘルプのデータベースを作る。
本体と、プラグインで別々になっているのが厄介...。一部文字コードも、追加の仕方もバラバラ、データの並び順も、組み合わせ順も不定。
また、各プラグインの英語版langファイルがない(既に埋め込まれてるから)。
まず本体リソースから。
1. 各wings_言語.langを JSONに整形
2.JSONlintとJSONeditorを活用してエラーでなくなるまで修正。
3.現在イタリア語やスウェーデン語などのデータのエラーがなくせないので、中断しています。
--再開--
4.ドイツ語は、find grep段階でISO8859→UTF8にする際に、一部のウムラウト付きの文字が全て同じ文字に化けしてしまい、オンライン辞書の助けをかり手動で置換....。
5.ポーランド語で、引用符でかこってあるのに「,」や「[]」があるとうまくJSON化できない現象が発生。とりあえず別の文字に置き換える。
5.重複キーがあったとき対策の変換を作ったのに上手くいかない。チェコ語は3カ所同じキーで追加していたので、同じキーの場所へデータを集めた。
進捗状況
pt,svは一部文字化け
fr,cs,pl完了
deは文字化け修正
zh-cn,zh-tw,ru,ko完了
it は 保留
あとはリリースに向けての調整作業とか。
プラグインリソースから変換。
1.shellから、各プラグインのlangファイルをfind grep catして収集、各(人間用の)言語ごと1ファイルにまとめる。
2.Javascript でErlangデータを JSONデータに整形するスクリプトを書く。
3.JSONlintとJSONeditorを活用して、フランス語〜イタリア語までJSONデータにミスがあれば直す。
4.Javascriptで JSONデータから、メニュー別にHTMLテーブルで表示するスクリプトを書く。
5.重複キーのせいでうまくメニュー構成が生成されないので、 重複するキーに含まれるJSONデータをまとめるスクリプトを書く。
6.しかし順繰り表示は断念、Wings3dの実際のメニューの並びを元に、JSONデータの各所に散らばっているメニュー項目文字列を探して正しい並びで表示させる。
7.プラグインでは、言語よって項目が翻訳されてない場合があり、そこを英語版で補完しようとしたが、そもそもプラグイン全体で英語のlangファイルは存在しない。
8.そこでshellから、各プラグインのerlファイルを find cat してテキストファイル(1.8MB程度)を作り、そこから英語のlangデータを作ることに。
9.そのデータを元に、他言語のプラグインのJSONデータ中のキーワードを元に関数名で検索して、関数名と、その中に含まれる(であろう)文字列を抽出
10.ゴミデータを除去したりして、なんとか読めるJSONデータを生成。
11.JSONlintとJSONeditorを活用して、正しいJSONデータになるまで修正を行う。
12.langファイルに著作権表示のあるものは、その部分をCopyrightキーとして、JSONデータに格納する。
英語版はソースコードに直接メッセージとして書かれているので プラグインのen.langファイルは存在しない、
そのため、各ソースコードから関数名とメッセージデータを収集してJSONツリーを作ることにしました。
特に、Fun(無名関数)内にあるメッセージの場合、上手く収集してくれなかったりした。
しかし一部、他のlangファイルと食い違ったり、キー名を取り損ねたり。不完全なデータ。
例えば↓
ソースコードから、関数名と文字列を抽出した英語版
"wpc_turnedge": {
"turn_menu": {
"turn": "Turn"
},
----------------------------
フランス語版や他の言語のlangファイルでは なぜか command_menu キーに登録してある。
"wpc_turnedge":
{
"command_name":
{
"turn":"Tourner"
他に抽出の際key名が消失した部分をMISSING_KEY+連番数として保留にしておいた。
13.ビュアーの体裁を作る。また、JSONデータの複数同時読み込みは面倒なので、とりあえず対策を練る。
14.メニューの並びを再現するために、JSONデータのあちこちに散在しているデータを拾い集め、正しい順序で並び替える。
15.メニュー別に並び替える。
16.言語切り替え、サブメニューの開閉を作成する。
== ヘルプ文字列再構築の伏線 ==
17.ヘルプ文字列データを検索できるようにする(本体&プラグイン)。
18.この逆で、英語版ヘルプ文字列を検索して、検索結果を英語版と任意の言語版とで比較可能できるようにする。
19.ヘルプ文字列データの存在するJSONの階層パスを、検索結果表の左側の言語の方をクリックで取得可能する。ついでに文字列も取得。
20.取得したパスは、取得欄に収集される。また欄のリセットも行えるようにする。
21.ヘルプに含まれる文字列を検索フレーズにして、メニュー項目順に「|」で区切ってOR検索すると必要な文字列をあぶり出せる。
あとは関連づけたい項目を探して、コマンド名と説明文をクリックすると、関連づけに必要な中間データが出てくるようにする。
22.中間データのテストデータを作り、それを元に表として生成させるようにする。別言語であれば、英語メニューの名称も併記させる。
== ヘルプ文字列の関連づけ ==
23.最後はひたすら全データを関連づける(通常メニュー)。
24.マウス右クリックメニューは、押すボタンによってさらに1〜3通りあるので、それも関連づけ、および表示させる。(Todo)
==
26.変則的なデータをまとめるために、中間データの書式を拡張。
27. Plane cut など、英語データのKey名を変換できなかった部分を他の言語版の構造と照らし合わせて訂正。
==
28.デザイン、UIの整備,Charaset を en に変更。
29.Firefox のローカル環境でテスト
30.Safariのローカル環境でテスト失敗 JSONの配列オブジェクトが Undefined is not Object とかエラー。
どうやらファイルが全部読み込まれてないらしい。
$.getを $.ajaxに変更したらさらにひどくなったので戻す。
非同期処理にJavascript のジェネレータを利用しようとしたら yieldが定義されてない!? 謎のエラー。
コンソールログ流して調べたら、両ブラウザReady関数が起動するタイミングが全く違う
とりあえず、Ready待ちで表示させるか、$getの際にカウントして、規定数以上読み込んだら表示処理に移行させるかにした。
31.Firefox,Safari ローカルとサーバー環境で読み込みテスト。
仮データ
作業停止中。
そこでその差を少しでも埋める仕組み(Documentation Interface)を考えることにしました。例えばソースコードからそれら情報を取得できれば便利かもしれません。
以下の表は(不完全ですが) Wings3dのソースコードの中から言語ファイル(Erlangのリスト)をJSON形式に無理矢理変換し、ソースコードからメニュー構成を調べ、HTMLとして人間に分かる形で再構築したものです。
今のところ英語版と日本語版を作成する事ができました。
(( File Menu )) | Name | D | .2S. | Description |
新建 (New) | - | - | 創建一個新的空的場景 |
打開 ... (Open...) | - | - | 打開一個以前保存的場景 |
合併 ... (Merge...) | - | - | 合併以前保存的場景到當前的場景 |
保存 (Save) | - | - | 保存當前場景 |
(( File Menu )) |
Name | D | .2S. | Description |
Neu (New) | - | - | Neue, leere Szene erzeugen |
Öffnen... (Open...) | - | - | Gespeicherte Szene Öffnen |
Zusammenfähren... (Merge...) | - | - | Gespeicherte Szene in die aktuelle Szene einfügen |
(( File Menu )) |
Name | D | .2S. | Description |
Nowy (New) | - | - | Tworzy nową, pustą scenę |
Otwórz... (Open...) | - | - | Otwiera wcześniej zapisaną scenę |
Dołącz... (Merge...) | - | - | Dołącza zapisaną wcześniej scenę do aktualnie otwartej |
Zapisz (Save) | - | - | Zapisuje aktualną scenę |
Zapisz jako... (Save As...) | - | - |
wings_en
Vertex (Segmenting mode ) | Edge (Segmenting mode ) | Face (Segmenting mode ) | ▶▶▶ ▼ ▼
Projection/Feat.Detect by AutoSegmenting
or MarkEdge/Select Chart by User
▼ ▼ Continue ▶▶ | Unfold (Segmenting mode ) |
- Continue
- Segment by
- Projection
- FeatureDetection
| - Continue
- Segment by
- Projection
- FeatureDetection
- MarkEdgesforCut
- UnmarkEdges
- SelectMarkedEdges
| - Continue
- Segment by
- Projection
- FeatureDetection
- chart1
- chart2
- chart3
- chart4
- chart5
- chart6
- chart7
- chart8
- chart9
- IgnoreFaces
- Select
| - Unfolding
- ProjectionNormal
- ProjectionCamera
- SphereMap
- CylindricalMap
|
Vertex (AutoUV mode ) | Edge (AutoUV mode ) | Face (AutoUV mode ) | Body (AutoUV mode ) | CreateTexture (No Selection ) |
- Move
- Scale
- Uniform
- Horizontal
- Vertical
- Rotate
- Flatten
- Tighten
- Unfold
- SphereMap
- Create Texture
| - Move
- Scale
- Uniform
- Horizontal
- Vertical
- Rotate
- Slide
- Distribute
- Stitch
- Cut
- Create Texture
| - Move
- Scale
- Uniform
- Horizontal
- Vertical
- Rotate
- Project-Unfold
- Create Texture
| - Move
- Scale
- Uniform
- Horizontal
- Vertical
- Max Uniform
- Max Horizontal
- Max Vertical
- Normalize Sizes
- Rotate
- Move to
- Flip
- Tighten
- Hide
- Delete
- ReMap UV
- Create Texture
| |
wings_jp
Vertex (Segmenting mode ) | Edge (Segmenting mode ) | Face (Segmenting mode ) | ▶▶▶ ▼ ▼
Projection/Feat.Detect by AutoSegmenting
or MarkEdge/Select Chart by User
▼ ▼ Continue ▶▶ | Unfold (Segmenting mode ) |
| - 続ける
- セグメント化する...
- マークを付けた辺でカットします
- 辺に付けたマークを消します
- 選択した辺をマークします
| - 続ける
- セグメント化する...
- UVチャート1
- UVチャート2
- UVチャート3
- UVチャート4
- UVチャート5
- UVチャート6
- UVチャート7
- UVチャート8
- UVチャート9
- 面を無視
- 選択
| - UV展開する
- 法線で投影
- カメラ視点で投影
- 球面マップ
- 円柱マップ
|
Vertex (AutoUV mode ) | Edge (AutoUV mode ) | Face (AutoUV mode ) | Body (AutoUV mode ) | CreateTexture (No Selection ) |
- 移動
- 拡大縮小
- 回転
- 平均化
- 緊縮
- UV展開
- 球面マップ
- テクスチャを作成
| - 移動
- 拡大縮小
- 回転
- スライド
- 分布
- スティッチ
- カット
- テクスチャを作成
| | - 移動
- 拡大縮小
- 拡大縮小(一様に)
- 水平
- 垂直
- Max Uniform
- Max Horizontal
- Max Vertical
- サイズの正規化
- 回転
- 移動先...
- 反転...
- 緊縮
- 隠す
- 削除
- UVを再マッピング
- テクスチャを作成
| |
wings_fr
About Authors
%% French language strings.
%% Copyright (c) 2004 Nicolas Bouillard
%% Revised and corrected by Vital Proulx (aka TulipVorlax) in 2007-2009
%% See the file "license.terms" for information on usage and redistribution
%% of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Vertex (Segmenting mode ) | Edge (Segmenting mode ) | Face (Segmenting mode ) | ▶▶▶ ▼ ▼
Projection/Feat.Detect by AutoSegmenting
or MarkEdge/Select Chart by User
▼ ▼ Continue ▶▶ | Unfold (Segmenting mode ) |
- Continuer
- Segmenter par
- Projection
- Détection des caractéristiques
| - Continuer
- Segmenter par
- Projection
- Détection des caractéristiques
- Marque les arêtes pour coupure
- Enlever la marque
- Sélectionner les arêtes marquées
| - Continuer
- Segmenter par
- Projection
- Détection des caractéristiques
- carte1
- carte2
- carte3
- carte4
- carte5
- carte6
- carte7
- carte8
- carte9
- Ignorer les facettes
- Selectionner
| - Dépliage
- Projection normale
- Projection de la caméra
- Mappage sphériquue
- Mappage cylindrique
|
Vertex (AutoUV mode ) | Edge (AutoUV mode ) | Face (AutoUV mode ) | Body (AutoUV mode ) | CreateTexture (No Selection ) |
- Déplacer
- Maximum uniforme
- Maximum horizontal
- Maximum vertical
- Mise à l'échelle
- Uniforme
- Horizontalement
- Verticalement
- Faire tourner
- Aplanir
- Resserrer
- Déplier
- Mappage sphérique
- Créer une texture
| - Déplacer
- Maximum uniforme
- Maximum horizontal
- Maximum vertical
- Mise à l'échelle
- Uniforme
- Horizontalement
- Verticalement
- Faire tourner
- Glisser
- Répartir
- Coudre
- Couper
- Créer une texture
| - Déplacer
- Maximum uniforme
- Maximum horizontal
- Maximum vertical
- Mise à l'échelle
- Uniforme
- Horizontalement
- Verticalement
- Faire tourner
- Projection-Déplier
- Créer une texture
| - Déplacer
- Maximum uniforme
- Maximum horizontal
- Maximum vertical
- Mise à l'échelle
- Uniforme
- Horizontalement
- Verticalement
- Max Uniform
- Max Horizontal
- Max Vertical
- Normaliser les tailles
- Faire tourner
- Déplacer vers
- Retourner
- Resserrer
- Cacher
- Supprimer
- Remapper les UV
- Créer une texture
| |
■各言語データを比較することもできます。これは日本語と英語版の比較(データ量が多すぎるため、menu関連以外のキーの文字列リストは省略してあります)。
* | wings_en | wings_jp |
wings |
area_info |
area_volume_info |
cannot_repeat |
crash_handler |
define_command |
edit_menu | - 1 : Delete undo history to reclaim memory
- 3 : Undo/Redo
- 4 : Undo or redo the last command
- 5 : Redo
- 6 : Redo the last command that was undone
- 7 : Undo
- 8 : Undo the last command
- 9 : Repeat
- 10 : Repeat Args
- 11 : Repeat Drag
- 12 : Plug-in Preferences
- 13 : Purge Undo History
| - 1 : メモリから作業履歴を消去します
- 3 : 取り消し/やり直し
- 4 : 最後に実行したコマンドの取り消し、またはやり直し
- 5 : やり直し
- 6 : 最後に実行したコマンドをやり直します
- 7 : 取り消し
- 8 : 最後に実行したコマンドを取り消します
- 9 : 繰り返し
- 10 : 繰り返し:入力値を参照
- 11 : 繰り返し:マウスドラッグ量を反映
- 12 : プラグイン環境設定
- 13 : 作業履歴を消去
|
enhanced_info |
geom_title |
handle_drop_1 |
hole_info |
info_1 |
info_line |
init_menubar | - 1 : File
- 2 : Edit
- 3 : View
- 4 : Select
- 5 : Tools
- 6 : Window
- 7 : Help
| - 1 : ファイル
- 2 : 編集
- 3 : 表示
- 4 : 選択
- 5 : ツール
- 6 : ウインドウ
- 7 : ヘルプ
|
item_list |
measure |
patches |
purge_undo |
shape_info |
tool_dirs |
tools_menu | - 8 : Align
- 9 : Center
- 10 : Save Bounding Box
- 11 : Scale to Saved BB
- 12 : Scale to Saved BB Proportionally
- 13 : Move to Saved BB
- 14 : Set Default Axis
- 15 : Define and store axis (with ref. point) for later use with any
- 16 : "Default Axis" command (e.g. Scale|Default Axis)
- 17 : Virtual Mirror
- 18 : Create
- 19 : Given a face selection, set up a virtual mirror
- 20 : Break
- 21 : Remove virtual mirrors for all objects
- 22 : Freeze
- 23 : Create real geometry from the virtual mirrors
- 24 : Screenshot
- 25 : Grab an image of the window (export it from the outliner)
- 26 : Scene Info: Area & Volume
- 27 : Calculate area and volume for each object in the scene
- 28 : Put on Ground
- 29 : Put selected objects on the ground plane
- 30 : Unitize
- 31 : Scale selected objects to fit inside a unit sphere and move to origin
- 32 : Move BB to Selection
- 33 : Scale BB to Selection
- 34 : Set Axis and Point
- 35 : Set Axis
- 36 : Set Point
- 37 : Bounding Box
- 38 : Bounding boxes are useful for scaling or aligning objects
- 39 : Create bounding box around current selection
- 40 : Tweak
- 41 : Open the Tweak menu
| - 8 : 整列
- 9 : 中心に配置
- 10 : バウンディングボックス(BB)のサイズを保存
- 11 : BBのサイズに置き換え
- 12 : BBのサイズに比率保持で置き換え
- 13 : BBの位置へジャンプ
- 14 : デフォルト軸を設定
- 15 : 後で使用するための (点を参照する)軸の定義と記憶
- 16 : "デフォルト軸"コマンド(例 拡大縮小|デフォルト軸)
- 17 : バーチャルミラー
- 18 : 作成
- 19 : 選択済みの面を指定して、バーチャルミラーを設定します
- 20 : 削除
- 21 : すべてのオブジェクトに対応するバーチャルミラーを削除します
- 22 : 凍結
- 23 : バーチャルミラーから,実際の幾何形状を作り出します。
- 24 : スクリーンショット
- 25 : ウインドウの内容を画像として取込みます(アウトライナーへ出力されます)
- 26 : シーン情報:エリアとボリューム
- 27 : シーン内の各オブジェクトのエリアとボリュームを計算します
- 28 : 地面に接地
- 29 : 選択オブジェクトを地面に着地させます
- 30 : ユニタイズ
- 31 : 選択オブジェクトを原点に移動し,半径1の単位球面(Unit sphere)内に収まるサイズに変換。
- 32 : BBを選択領域へ移動します。
- 33 : BBを選択領域と同じサイズに変形させます
- 34 : 軸と点を設定します
- 35 : 軸を設定します
- 36 : 点を設定します
- 37 : バウンディングボックス
- 38 : バウンディングボックスは、オブジェクトのサイズや位置を変更するのにとても便利です
- 39 : 現在の選択領域を包括するバウンディングボックスを作成
- 40 : Tweak
- 41 : Tweakメニューを開く
|
undo_info |
vtx_attributes |
window_menu | - 1 : Geometry Graph
- 2 : Geometry Graph #
- 3 : Outliner
- 4 : Open the outliner window (showing materials and objects)
- 5 : Open a Geometry Graph window (showing objects)
- 6 : Palette
- 7 : Open the color palette window
- 8 : New Geometry Window
- 9 : Open a new Geometry window
- 10 : Console
- 11 : Open a console window for information messages
- 12 : Tweak Palette
- 13 : Open palettes from which tweak tools may be selected or bound to modifier keys
| - 1 : ジオメトリグラフ
- 2 : ジオメトリグラフ#
- 3 : アウトライナー
- 4 : アウトライナーウインドウを開きます(マテリアルとオブジェクトを表示します)
- 5 : ジオメトリウインドウを開きます(オブジェクトを表示します)
- 6 : パレット
- 7 : パレットウインドウを開きます
- 8 : 新規ジオメトリウインドウ
- 9 : 新規ジオメトリウインドウを開きます
- 10 : コンソール
- 11 : 情報や進捗状況を表示するためのコンソールウインドウを開きます
- 12 : Tweakパレット
- 13 : Tweakツールが揃ったパレットを開きます。修飾キーの設定もできます。
|
wings_ask |
button_label |
frame_event |
mktree |
wings_body |
arealight_conv |
auto_smooth |
clean_isolated_vertices |
cleanup |
cleanup_rep_1 |
cleanup_waists_1 |
color_material |
delete_2edged_faces_1 |
flip_ask |
flip_str |
menu | - 2 : Move
- 3 : Flip...
- 10 : Invert
- 11 : Flip all normals, turning the object inside out
- 12 : Tighten
- 13 : Move vertices towards average midpoint
- 14 : Smooth
- 15 : Subdivide all faces to give the object a smoother apperance
- 16 : Combine
- 17 : Combine multiple objects into a single object
- 18 : Separate
- 19 : Separate a combined objects into its components
- 20 : Weld
- 21 : Merge pair of faces that are nearly coincident
- 22 : Cleanup
- 23 : Remove various defects
- 24 : Auto-Smooth
- 25 : Set edges hard or soft depending on the angle between faces
- 26 : Duplicate
- 27 : Delete
- 28 : Delete the selected objects
- 29 : Rename
- 30 : Rename selected objects
- 32 : Show all faces for this object
- 33 : Vertex Attributes
- 34 : Flip the object along ~s axis
- 35 : Pick point to flip object along the ~s axis
- 36 : Flip object along the global ~s axis
- 37 : Pick
- 38 : Pick axis to flip object along
- 39 : Pick axis and point to flip object along
- 40 : Pick global axis to flip object along
- 41 : Colors to Materials
- 42 : Convert vertex colors to materials
- 43 : Materials to Colors
- 44 : Convert materials to vertex colors
- 45 : Remove Colors
- 46 : Remove all vertex colors
- 47 : Remove UV Coordinates
- 48 : Remove all UV coordinates
- 49 : Remove All Attributes
- 50 : Remove all vertex colors and UV coordinates
- 51 : Add a common prefix to each selected object
- 52 : Unhide Faces
| - 2 : 移動
- 3 : 反転...
- 10 : 法線を反転
- 11 : 全ての法線を反転させて、オブジェクトの表裏を裏返します
- 12 : 緊縮
- 13 : 各頂点から平均的な中間点に向かって移動させます
- 14 : スムーズ(Catmull-Clark)
- 15 : オブジェクトの全ての面を細分割して滑らかにします(再分割曲面:Catmull-Clarkアルゴリズム)
- 16 : 合体
- 17 : 複数のオブジェクトを1つのオブジェクトとして合体します
- 18 : 分離
- 19 : 合体オブジェクトをその構成部分へと分離します
- 20 : 接合
- 21 : ぼぼぴったり一致した2つの面同士を接合します
- 22 : クリーンナップ
- 23 : データ上の様々な欠陥を取り除きます
- 24 : 自動スムージング(Auto-Smooth)
- 25 : 面同士のなす角度を基準にハードエッジ、ソフトエッジ属性を自動的に振り分けます
- 26 : 複製
- 27 : 削除
- 28 : 選択済みのオブジェクトを削除します
- 29 : リネーム
- 30 : 選択済みのオブジェクトの名称を変更します
- 31 : 全てを表示
- 32 : このオブジェクトの全ての面を表示します
- 33 : 頂点属性の設定
- 34 : オブジェクトを ~ts 軸で反転
- 35 : オブジェクトを ~ts 軸で反転させるための基準点を選択してください
- 36 : オブジェクトをグローバル座標の ~ts 軸で反転させます
- 37 : 基準の選択
- 38 : オブジェクトを反転させるための基準軸を選択してください
- 39 : オブジェクトを反転させるための基準軸と基準点を選択してください
- 40 : オブジェクトを反転させるための(グローバル座標の)基準軸を選択してください
- 41 : 頂点カラーをマテリアルカラーに変換
- 42 : 頂点カラーをマテリアルカラーに変換します
- 43 : マテリアルカラーを頂点カラーに変換
- 44 : マテリアルカラーを頂点カラーに変換します
- 45 : カラーの削除
- 46 : 全ての頂点カラーの削除
- 47 : UV座標の削除
- 48 : 全てのUV座標を削除
- 49 : 全ての属性を削除
- 50 : 全ての頂点カラーとUV座標を削除
- 51 : 選択された各オブジェクト名に共通の接頭辞を追加
|
rename_1 |
rename_prefix |
vertex_color_item |
weld |
weld_error |
weld_objects |
wings_camera |
desc |
help |
info |
message |
mode_help |
prefs |
scroll_help |
wings_collapse |
check_consistency |
check_vertices_1 |
wings_color |
choose_1 |
wings_console |
do_window |
handle_action |
popup_menu | - 1 : Write to File
- 2 : Write console contents to a file
| - 1 : ファイルに出力
- 2 : コンソールの内容をファイルに出力します
|
server_loop |
wings_deform |
check_range |
crumple_dirs |
dir |
inflate_fun |
sub_menu | - 1 : Inflate elements
- 2 : Pick center and radius
- 3 : Crumple
- 4 : Randomly move vertices
- 5 : Inflate
- 6 : Taper
- 7 : Twist
- 8 : Torque
| - 1 : 膨張要素
- 2 : 基準となる半径と中心点を選択してください
- 3 : もみくちゃ
- 4 : 頂点をランダムに移動
- 5 : 膨張
- 6 : テーパ
- 7 : 途中をひねる
- 8 : ねじる
|
taper_item |
wings_dissolve |
dissolve_1 |
wings_drag |
drag_help |
help_message |
make_query_1 |
numeric_input |
plus_drag_string |
qstr |
standard_mode_fun |
switch |
wings_edge |
dissolve_edges |
wings_edge_cmd |
command |
cut_ask_entry |
cut_command |
cut_entry |
cut_fun |
cut_pick_error |
loop_cut |
menu | - 2 : Move
- 3 : Slide
- 4 : Slide edges along neighbor edges
- 5 : Extrude
- 6 : Connect
- 7 : Create a new edge by connecting midpoints of selected edges
- 8 : Bevel
- 9 : Round off selected edges
- 10 : Dissolve
- 11 : Eliminate selected edges
- 12 : Collapse
- 13 : Delete edges, replacing them with vertices
- 14 : Hardness
- 15 : Soft
- 16 : Hard
- 17 : Loop Cut
- 18 : Cut into two objects along edge loop
- 19 : Vertex Color
- 20 : Apply vertex colors to selected edges
- 21 : Delete edges, replacing them with vertices and remove any newly created isolated vertices
- 22 : Crease
- 23 : Extrusion commonly used for adding wrinkles to organic models
- 50 : Eliminate selected edges and remove remaining isolated verts
| - 2 : 移動
- 3 : スライド
- 4 : 辺を隣リの辺の向きに追随して移動させます
- 5 : 押し出し
- 6 : 接続
- 7 : 選択された辺同士の中間点を接続する辺を作成します
- 8 : ベベル
- 9 : 選択された辺に傾斜をつけます
- 10 : 削除
- 11 : 選択された辺を削除します
- 12 : 削除(コラプス)
- 13 : 辺を削除した所へ周囲の頂点が崩れ込みます
- 14 : ハード属性の切替
- 15 : ソフト属性
- 16 : ハード属性
- 17 : 輪切り
- 18 : 輪状に繋がった辺に従い、オブジェクトを2つに分割します
- 19 : 頂点カラー
- 20 : 選択された頂点に頂点カラーを適用します
- 21 : 辺を削除した所へ周囲の頂点が崩れ込み、その際作成されたあらゆる孤立点も削除されます
- 22 : 折り目
- 23 : 一般的な押し出し効果は、有機的なモデルに対してしわを寄らせます
- 50 : 選択された辺を削除し、その際生成された孤立点も削除されます
|
plain_cut_menu | - 2 : Cut into edges of equal length
| |
slide_help_mode |
wings_export |
export |
wings_extrude_edge |
bevel_faces |
extrude_problem |
wings_face_cmd |
bridge_1 |
bridge_error |
clone_on |
clone_on_selection |
create_hole_1 |
intrude |
lift_check_selection |
lift_fun |
lift_sel_mismatch |
lift_selection |
lift_vtx_sel_mismatch |
menu | - 2 : Move
- 3 : Extrude
- 8 : Intrude
- 9 : Carve out interior of object, making selected faces holes
- 10 : Bevel
- 11 : Round off edges of selected faces
- 12 : Bridge
- 13 : Create a bridge or tunnel between two faces
- 14 : Bump
- 15 : Create bump of selected faces
- 16 : Lift
- 17 : Put On
- 18 : Move and rotate object, aligning the selected face to another element
- 19 : Clone object on to one or more elements
- 20 : Mirror
- 21 : Mirror object around selected faces and merge to object
- 22 : Mirror and create separate objects
- 23 : Dissolve
- 24 : Eliminate all edges between selected faces
- 25 : Collapse
- 26 : Delete faces, replacing them with vertices
- 27 : Smooth
- 28 : Subdivide selected faces to smooth them (Catmull-Clark)
- 29 : Tesselate
- 30 : Vertex Color
- 31 : Apply vertex colors to selected faces
- 32 : Hide
- 33 : Hide the selected faces
- 34 : Eliminate selected faces and remove remaining isolated verts
- 35 : Extract
- 36 : Shell Extrude
- 37 : Hole
- 38 : Create hole
- 39 : Remove holes adjacent to selected faces
- 40 : or face regions
- 41 : Unhide faces adjacent to selection
| - 2 : 移動
- 3 : 押し出し
- 8 : くり抜き
- 9 : 選択された面に穴を開けてオブジェクトの内部をくり抜いて空洞にします
- 10 : ベベル
- 11 : 選択された面に傾斜をつけます。
- 12 : ブリッジ
- 13 : 選択された2つの面の間を橋またはトンネルのように連結します
- 14 : でこぼこ
- 15 : 選択された面に凹凸をつけます
- 16 : リフト
- 17 : 対象面に乗せる
- 18 : オブジェクトを移動又は回転させて別の要素の選択面に配置します
- 19 : 1つまたは複数の要素を複製します
- 20 : ミラー
- 21 : 選択した面の周りに鏡対称のオブジェクトを作成しひとつのオブジェクトに合体します
- 22 : ミラーリングしオブジェクトを分割されたオブジェクトを作成します
- 23 : 削除(ディゾルブ)
- 24 : 選択さたれた面と、それに関連するすべての辺を削除します
- 25 : 削除(コラプス)
- 26 : 面を削除した所へ周囲の頂点が崩れ込みます
- 27 : スムーズ(Catmull-Clark)
- 28 : 選択された面を細分割して滑らかにします(再分割曲面:Catmull-Clarkアルゴリズム)
- 29 : テッセレート
- 30 : 頂点カラー
- 31 : 選択された面に頂点カラーを適用します
- 32 : 隠す
- 33 : 選択された面を隠します
- 34 : 選択された面を削除し、その際作成されたあらゆる孤立点も削除されます
- 35 : 面を剥がす
- 36 : 押し出し(造殻型)
- 37 : 穴を開ける
- 38 : 穴を作成します
- 39 : 選択された面または面の領域に隣接して
- 40 : 穴を削除してください
|
put_on |
put_on_check_selection |
put_on_selection |
smooth |
wings_ff_ndo |
check_size |
clean_bad_edges |
import |
import_1 |
read_edges |
read_object_1 |
read_objects |
read_vertices |
skip_faces |
wings_ff_wings |
export |
import |
import_1 |
import_image |
import_props |
import_vsn2 |
translate_map_images_2 |
wings_file |
autosave |
command |
confirmed_open |
confirmed_open_dialog |
export_filename_1 |
import_filename_1 |
import_image |
import_ndo |
install_plugin |
menu | - 3 : New
- 4 : Create a new, empty scene
- 5 : Open...
- 6 : Open a previously saved scene
- 7 : Merge...
- 8 : Merge a previously saved scene into the current scene
- 9 : Save
- 10 : Save the current scene
- 11 : Save As...
- 12 : Save the current scene under a new name
- 13 : Save Selected...
- 14 : Save only the selected objects or faces
- 15 : Save Incrementally
- 16 : Revert
- 17 : Revert current scene to the saved contents
- 18 : Import
- 19 : Export
- 20 : Export Selected
- 21 : Import Image...
- 22 : Import an image file
- 23 : Render
- 24 : Install Plug-In
- 25 : Exit
- 26 : Generate new filename and save
- 27 : Install a plug-in
- 28 : Exit Wings 3D
- 29 : Save Unused Materials
- 30 : Include unused materials when saving a .wings file
- 31 : Save Preference Subset...
- 32 : Save a preference subset from your current settings
- 33 : Load Preference Subset
- 35 : Load...
- 36 : Load a previously saved preference subset
| - 3 : 新規作成
- 4 : 空の新規シーンを作成
- 5 : 開く...
- 6 : 以前に保存したシーンを開く
- 7 : 合流...
- 8 : 以前に保存したシーンを現在のシーンに合流させます
- 9 : 保存
- 10 : 現在のシーンを保存します
- 11 : 別名で保存...
- 12 : 現在のシーンを別のファイル名で保存します
- 13 : 選択領域を保存...
- 14 : 選択されているオブジェクトや面のみを保存します
- 15 : 連番ファイル名で保存
- 16 : 復帰
- 17 : 現在のシーンを保存時の内容に戻します
- 18 : 読込み
- 19 : 書き出し
- 20 : 選択領域の書き出し
- 21 : イメージの読み込み...
- 22 : 画像ファイルを指定して読込みます(読込んだテクスチャはアウトライナーへ追加されます)
- 23 : レンダリング
- 24 : プラグインのインストール
- 25 : 終了
- 26 : 新規ファイルを作成して保存します
- 27 : プラグインをインストールします
- 28 : Wings 3Dを終了します
- 29 : 未使用マテリアルを保持
- 30 : .wingsファイルを保存する時に未使用のマテリアルデータを含めます
- 31 : 環境設定の一部を保存...
- 32 : 現在カスタマイズされた環境設定で保存可能な項目を保存します
- 33 : 環境設定の一部を読込み
- 35 : 読込み...
- 36 : 以前に保存した環境設定の一部を読込みます
|
merge |
recent_files |
save_as |
save_now |
save_selected |
str_save_changes |
use_autosave_1 |
wings_prop |
wings_help |
def_commands |
def_hotkeys |
edit_prefs |
getting_started |
header |
help_window |
international |
lights |
message |
one_or_two |
opengl_info |
performance_tips |
splash_contents |
use_one_or_two |
wings_hotkey |
keyname |
list_header |
list_keys |
vkeyname |
wings_image |
create_default |
create_image |
event |
event_1 |
screenshot |
window_params |
wings_init |
display_actual_mode |
try_video_modes |
video_mode_failure |
wings_light |
attenuation |
color |
edit |
edit_ambient_dialog |
edit_dialog |
export_camera_lights |
info |
info_1 |
light_types |
menu | - 2 : Move
- 3 : Position Highlight
- 4 : Position the aim point or location of light
- 5 : Color
- 6 : Interactively adjust hue, value, and saturation
- 7 : Attenuation
- 8 : Linear
- 9 : Interactively adjust how much light weakens as it travels away from its source (linear factor)
- 10 : Quadratic
- 11 : Interactively adjust how much light weakens as it travels away from its source (quadratic factor)
- 12 : Spot Angle
- 13 : Interactivly adjust the angle of the spotlight cone
- 14 : Spot Falloff
- 15 : Interactivly adjust how much light weakens farther away from the center of the spotlight cone
- 16 : Edit Properties...
- 17 : Edit light properties
- 18 : Duplicate
- 19 : Duplicate and move selected lights
- 20 : Delete
- 21 : Delete seleced lights
| - 2 : 移動
- 3 : 強調表示させた位置
- 4 : 光源の位置または照射点の位置
- 5 : カラー
- 6 : 色相,明度,彩度をリアルタイムに調整します.
- 7 : 減衰
- 8 : リニア減衰
- 9 : 光源から光が届くまでどのくらい弱まるかをリアルタイムに調整します(距離に比例したリニア減衰)
- 10 : 二次減衰
- 11 : 光源から光が届くまでどのくらいの弱まるかをリアルタイムに調整します(距離の2乗で減衰,実際の光に近い)
- 12 : スポット角度
- 13 : スポット光源の照射する範囲を表す円錐の角度をリアルタイムに調整します.
- 14 : スポット減衰
- 15 : スポット光源の中心から縁まで,光がどのくらい弱まるのかをリアルタイムに調整します
- 16 : プロパティ編集...
- 17 : 光源のプロパティを編集します.
- 18 : 複製
- 19 : 選択された光源を移動して複製を作ります.
- 20 : 削除
- 21 : 選択された光源を削除します.
|
plugin_results |
qs_att |
qs_specific |
selected_light |
spot_angle |
spot_falloff |
wings_magnet |
check_radius |
common_dialog |
dialog |
drag_help |
info_string |
magnet_route |
magnet_shape_str |
wings_material |
edit |
edit_dialog |
load_map_1 |
material_fun |
material_menu | | |
new_1 |
plugin_results |
rename |
show_map |
show_maps |
wings_menu |
handle_key_event |
help_text_1 |
hotkey_delete_dialog |
hotkey_key_message |
hotkey_mouse_message |
magnet_help |
menu_toolbar_help | - 1 : Open the Tools menu
- 2 : Open the Select menu
- 3 : Recall Stored Selection
- 4 : Store Selection
- 5 : Deselect | Select All
- 6 : Deselect and close menu
- 7 : Repeat Drag
- 8 : Repeat Args
- 9 : Repeat
| - 1 : ツールメニューを開きます
- 2 : 選択メニューを開きます
- 3 : 記憶された選択領域を再呼び出しします
- 4 : 選択領域を記憶します
- 5 : 選択解除 | 全選択
- 6 : 選択解除してメニューを閉じます
- 7 : コマンド繰り返しにドラッグ入力値を反映します
- 8 : コマンド繰り返しに入力値を反映します
- 9 : コマンドを繰り返し実行します
|
mk_dialog |
mmb_menu_toolbar_help | | |
norm_help_adv |
normalize_menu | | |
rmb_menu_toolbar_help | - 1 : Edge Loop
- 2 : Edge Loop to Region
- 3 : Select edges which have both vertices selected
| - 1 : 辺のループ選択
- 2 : 辺のループ選択を領域にする
- 3 : 選択した頂点を両方とも持つような辺を選択します
|
scroll_help |
wings_menu_util |
adv_scale_1 |
dir_help |
dir_help_1 |
dirs |
dirs_help |
flatten |
flatten_edge_loops |
flatten_fun_1 |
rotate |
rotate_1 |
rotate_fun |
scale |
scale_fun |
uniform_scale |
wings_outliner |
command |
common_image_menu | - 1 : Export...
- 2 : Export the image
- 3 : Duplicate
- 4 : Duplicate selected image
- 5 : Delete
- 6 : Delete selected image
- 7 : Rename
- 8 : Rename selected image
- 9 : Pick up Image
- 10 : Pick up the Image to it put on a material as a texture
| - 1 : 書き出し...
- 2 : イメージを書き出します
- 3 : 複製
- 4 : 選択したイメージを複製します
- 5 : 削除
- 6 : 選択したイメージを削除します
- 7 : リネーム
- 8 : 選択したイメージの名称を変更します
- 9 : イメージをピックアップ
- 10 : ピックアップしたイメージはマテリアル項目上で右クリックメニューから「項目をドロップ」すると,テクスチャを関連づけられます.
|
delete_image |
do_menu | - 1 : Edit Material...
- 2 : Edit material properties
- 3 : Assign to Selection
- 4 : Assign the material to the selected faces or bodies
- 5 : Select
- 6 : Select all faces that have this material
- 7 : Duplicate
- 8 : Duplicate this material
- 9 : Delete
- 10 : Delete this material
- 11 : Rename
- 12 : Rename this material
- 13 : Duplicate
- 14 : Duplicate this object
- 15 : Delete
- 16 : Delete this object
- 17 : Rename
- 18 : Rename this object
- 19 : Edit Light...
- 20 : Edit light properties
- 21 : Duplicate
- 22 : Duplicate this light
- 23 : Delete
- 24 : Delete this light
- 25 : Rename
- 26 : Rename this light
- 121 : Drop picked object
- 122 : Drop a previously picked object on this material
| - 1 : マテリアル編集...
- 2 : マテリアルの特性を編集します
- 3 : 選択領域に割り当て
- 4 : 選択した面やオブジェクトにマテリアルを割り当てます
- 5 : 選択
- 6 : このマテリアルが適用されている面を全て選択します
- 7 : 複製
- 8 : このマテリアルを複製します
- 9 : 削除
- 10 : このマテリアルを削除します
- 11 : リネーム
- 12 : このマテリアルの名称を変更します
- 13 : 複製
- 14 : このオブジェクトを複製します
- 15 : 削除
- 16 : このオブジェクトを削除します
- 17 : リネーム
- 18 : このオブジェクトの名称を変更します
- 19 : 光源編集...
- 20 : 光源の特性を編集します
- 21 : 複製
- 22 : この光源を複製します
- 23 : 削除
- 24 : この光源を削除します
- 25 : リネーム
- 26 : この光源の名称を変更します
- 121 : ピックアップ項目をドロップ
- 122 : ピックアップした「オブジェクト/イメージ項目」をこのマテリアルへを関連づけることができます
|
event |
handle_drop |
image_menu | - 1 : Show
- 2 : Show the image in a window
| - 1 : 表示
- 2 : イメージをウインドウに表示します
|
image_menu_1 | - 1 : Make External...
- 2 : Refresh
- 3 : Make Internal
- 11 : Update image to the contents of the saved file
| - 1 : 外部テクスチャを書き出し...
- 2 : リフレッシュ
- 3 : 内部テクスチャに変換
- 11 : 保存ファイルの内容を更新してください
|
make_external |
refresh_image |
rename_image |
title |
wings_palette |
command |
do_menu | - 1 : Edit
- 2 : Edit color
- 3 : Interpolate
- 4 : Interpolate Empty Colors
- 5 : Clear All
- 6 : Clear palette
- 7 : Compact
- 8 : Compact Palette
- 9 : Scan Colors
- 10 : Scan colors from selection
- 11 : Export
- 12 : Export palette to file
- 13 : Import
- 14 : Import palette from file
| - 1 : 編集
- 2 : カラー編集
- 3 : カラーを補完
- 4 : 空のカラーを補完
- 5 : すべての色をクリア
- 6 : パレットの全色をクリアして空のカラーにします
- 7 : コンパクトに並び替え
- 8 : カスタム色が設定されている欄を一カ所にまとめます.
- 9 : カラーを取り込む
- 10 : 選択領域にあるカラーを取り込みます
- 11 : パレット書き出し...
- 12 : パレット情報をファイルに書き出します
- 13 : パレット読込み...
- 14 : パレット情報ファイルを読込みます
|
event |
title |
wings_pb |
loop |
wings_pick |
area_info |
enhanced_hl_info |
handle_hilite_event |
marquee_message |
wings_plugin |
cat_label |
def_ui_plugin |
install |
install_beam |
install_file_type |
install_verify_files |
manager_command |
manager_entry |
plugin_dir |
plugin_menu_info_3 | - 1 : (The Plug-In Manager was unable to find more information)
| - 1 : (プラグイン管理機能はこれ以上の情報を探せませんでした)
|
plugin_modules |
plugin_root_menu | - 1 : body:
- 2 : edge:
- 3 : face:
- 4 : vertex:
- 5 : Select|
- 6 : Tools|
| - 1 : 全体:
- 2 : 辺:
- 3 : 面:
- 4 : 頂点:
- 5 : 選択|
- 6 : ツール|
|
wings_pref |
pref |
recent_pref_help |
wings_pref_dlg |
advanced_prefs |
command |
constraint_prefs |
gen_prefs |
menu | - 1 : Preferences...
- 2 : Edit the preferences for Wings
| - 1 : 環境設定...
- 2 : Wings 3Dの環境設定を編集します
|
misc_prefs |
smart_set_value_1 |
ui_prefs |
viewer_prefs |
workaround_1 |
wings_rotate |
edges_to_vertices |
faces_to_vertices |
wings_s |
accept |
camera_mode |
cancel |
dir |
mod |
mouse_b |
no |
scroll |
yes |
wings_scale |
edges_to_vertices |
faces_to_vertices |
wings_sel_cmd |
ask |
faces_with |
group_mode_string |
group_title |
groups_menu | - 1 : Delete Group
- 2 : Delete group "
- 4 : Add to Group
- 5 : Add current selection to group "
- 7 : Subtract from Group
- 8 : Subtract current selection from group "
- 10 : Select Group
- 11 : Select group "
- 13 : Union Group
- 14 : Union group "
- 15 : " with current selection
- 16 : Subtract Group
- 17 : Subtract group "
- 18 : " from current selection
- 19 : Intersect Group
- 20 : Intersect group "
- 21 : " with current selection
- 22 : Selection Groups
- 24 : Next Group
- 25 : Previous Group
- 26 : Cycle In Selection Mode
- 27 : Cycle Prev/Next only within active selection mode
| - 1 : グループを削除
- 2 : グループを削除します"
- 4 : グループを追加
- 5 : 現在の選択領域をグループに追加します"
- 7 : グループから削減
- 8 : グループから現在の選択領域を削減します"
- 10 : グループを選択
- 11 : グループを選択します"
- 13 : グループを統合
- 14 : グループ"
- 15 : "と現在の選択領域を統合します
- 16 : グループ削減
- 17 : 現在の選択領域から,グループ"
- 18 : "を削減します.
- 19 : グループ交差
- 20 : グループ"
- 21 : "と現在の領域の交差部分を作成
- 22 : グループを選択
- 24 : 次のグループ
- 25 : 前のグループ
- 26 : Cycle In Selection Mode
- 27 : Cycle Prev/Next only within active selection mode
|
item_by_id |
less_help |
menu | - 1 : Deselect
- 2 : Clear the selection
- 3 : More
- 4 : Less
- 5 : Similar
- 6 : Edge Loop
- 7 : Edge Loop
- 8 : Expand edge selection to loop;
- 9 : convert face selection to selected border edges
- 10 : Edge Loop to Region
- 11 : Select all faces on one side of an edge loop
- 12 : Edge Ring
- 13 : Expand edge selection to ring
- 14 : Previous Edge Loop
- 15 : Select the previous edge loop
- 16 : Next Edge Loop
- 17 : Select the next edge loop
- 18 : Grow Edge Loop
- 19 : Grow edge selection by one edge in loop directions
- 20 : Shrink Edge Loop
- 21 : Shrink edge selection by one in loop direction
- 22 : Grow Edge Ring
- 23 : Grow edge selection by one edge in ring direction
- 24 : Shrink Edge Ring
- 25 : Shrink edge selection by one edge in ring directions
- 26 : Adjacent
- 27 : Vertices
- 28 : Edges
- 29 : Faces
- 30 : Objects
- 31 : By
- 32 : Hard Edges
- 33 : Select all hard edges
- 34 : Isolated Vertices
- 35 : Select all isolated vertices
- 36 : Vertices With
- 37 : 2 Edges
- 38 : 3 Edges
- 39 : 4 Edges
- 40 : 5 Edges
- 41 : Faces With
- 42 : 2 Edges
- 43 : 3 Edges
- 44 : 4 Edges
- 45 : 5 or More
- 46 : Random
- 56 : Short Edges
- 57 : Select (too) short edges
- 58 : Material Edges
- 59 : Select all edges between different materials
- 60 : UV-Mapped Faces
- 61 : Select all edges that have UV coordinates
- 62 : Id...
- 63 : Select by numeric id
- 64 : Lights
- 65 : Select all lights
- 66 : Select all elements
- 67 : Inverse
- 68 : Invert the selection
- 69 : Hide Selected
- 70 : Hide all (partly or wholly) selected objects
- 71 : Hide Unselected
- 72 : Hide objects that have no selection
- 73 : Lock Unselected
- 74 : Lock objects that have no selection
- 76 : Show all objects that have been hidden
- 78 : Unlock all locked objects
- 79 : Store Selection
- 80 : Store the selection into the selection group named "StoredSelection"
- 81 : Recall Selection
- 82 : Recall the selection from the selection group named "StoredSelection"
- 83 : New Group...
- 84 : Create a new selection group
- 85 : Non-planar Faces
- 86 : Select all non-planar faces
- 87 : Sharp Edges
- 88 : Select sharp edges
- 89 : Fewest Edges Path
- 90 : Select the path with the fewest edges between two vertices
- 91 : Shortest Path (Dijkstra)
- 92 : Select the shortest path between two vertices (Dijkstra)
- 93 : Shortest Path (A-Star)
- 94 : Select the shortest path between two vertices (A-Star)
- 95 : Vertex Path
- 96 : To Complete Loops
- 97 : Switches to Edge mode and completes loop selection
- 98 : ; convert consecutive vertices to edges
- 99 : (from selection or all visible objects (if no selection))
- 100 : Every Nth Ring
- 101 : Second
- 102 : Third
- 103 : Nth...
- 104 : Unhide All Objects
- 105 : Unlock All Objects
- 106 : Objects
- 401 : 6 or More
- 402 : Specify...
- nq0 : Non Quadrangle Faces
- nq1 : All Non Quadrangle Faces
- nq2 : Odd Non Quadrangle Faces
- nq3 : Even Non Quadrangle Faces
| - 1 : 全選択解除
- 2 : 選択領域をすべて解除します
- 3 : 選択領域を拡張
- 4 : 選択領域を縮小
- 5 : 類似要素を選択
- 6 : 辺をループ/リング状に選択
- 7 : 辺ループ選択
- 8 : 選択辺を含むループ状に選択領域を拡張します
- 9 : 面の選択領域から輪郭の辺を選択済みにします
- 10 : 辺ループを領域化
- 11 : 辺ループで2つに分けられた一方の面を全て選択します
- 12 : 辺リング選択
- 13 : 選択辺を含むリング状に選択領域を拡張します
- 14 : 1つ前の辺ループ
- 15 : 1つ手前の辺のループを選択
- 16 : 1つ後の辺ループ
- 17 : 1つ後にある辺のループを選択
- 18 : 辺ループを拡張
- 19 : ループ方向にある辺を1段階、選択領域へ取り込みます
- 20 : 辺ループを縮小
- 21 : 辺のループから1段階、選択領域を縮小します
- 22 : 辺リングを拡張
- 23 : リング方向にある辺を1段階、選択領域へ取り込みます
- 24 : 辺リングを縮小
- 25 : 辺のリングから1段階、選択領域を縮小します
- 26 : 選択モード切替
- 27 : 頂点
- 28 : 辺
- 29 : 面
- 30 : オブジェクト
- 31 : 共通の特徴で抽出
- 32 : ハードエッジ
- 33 : ハードエッジ属性を持つ辺をすべて選択します
- 34 : 孤立点
- 35 : 全ての孤立点を選択します
- 36 : 頂点に繋がる辺の数
- 37 : 2辺で
- 38 : 3辺で
- 39 : 4辺で
- 40 : 5辺で
- 41 : 面を取り囲む辺の数
- 42 : 2辺で
- 43 : 3辺で
- 44 : 4辺で
- 45 : 5辺以上
- 46 : ランダムな確率で選択
- 56 : 短い辺を選択
- 57 : 短い(過ぎる)辺を選択
- 58 : マテリアルが設定された辺
- 59 : マテリアルが(種類を問わず)設定された全ての辺を選択
- 60 : UVマッピングされた面
- 61 : UV座標を持っている全ての辺を選択します
- 62 : Id...
- 63 : 数値IDで選択
- 64 : 光源
- 65 : 全ての光源を選択
- 66 : 全ての要素を選択
- 67 : 選択領域の反転
- 68 : 選択領域を反転します
- 69 : 選択領域を隠す
- 70 : 選択されたオブジェクトをすべて(部分的または全体)を隠します
- 71 : 未選択領域を隠す
- 72 : 未選択領域を隠します
- 73 : 未選択領域をロック
- 74 : 未選択領域をロックします
- 75 : すべてを表示
- 76 : 隠されていたオブジェクトをすべて表示します
- 77 : すべてをロック解除
- 78 : すべてのオブジェクトのロックを解除します
- 79 : 選択領域の記憶
- 80 : 選択領域を"StoredSelection"という特殊グループ名で記憶します
- 81 : 選択領域の呼出
- 82 : 選択領域が記憶された,特殊グループ名"StoredSelection"を呼び出します
- 83 : 新規グループ作成...
- 84 : 選択領域のグループを新規作成します
- 85 : 非平面の面を選択
- 86 : 平面ではないすべての面を選択
- 87 : 鋭利な辺を選択
- 88 : 鋭利な辺を選択します
- 89 : 最短経路で辺選択
- 90 : 2頂点間を最短経路で結ぶ辺を探して選択します
- 91 : 最短経路で辺選択(Dijkstra)
- 92 : 2頂点間を最短経路で結ぶ辺を選択. 最短距離を均等に探索するので比較的高速(ダイクストラ法)
- 93 : 最短経路で辺選択(A-Star)
- 94 : 2頂点間を最短経路で結ぶ辺を選択. ゴールに近い経路を優先的に探索, より無駄が少ない(A-Star法)
- 95 : 頂点パス
- 96 : 完全なループにする
- 97 : 完全なループを作るために辺選択モードに切替えて、選択をループ状にします
- 98 : ;(選択領域または(もし選択領域が存在しなければ)表示されているすべてのオブジェクトから)
- 99 : 選択領域から条件に合致する頂点/面だけを残します
- 100 : N番目毎にリング選択
- 101 : 2番目
- 102 : 3番目
- 103 : N番目...
- 401 : 6番目以上
- nq0 : 非四角ポリゴン
- nq1 : すべての非四辺形(正方形,長方形,菱形等)の面
- nq2 : Odd Non Quadrangle Faces
- nq3 : Even Non Quadrangle Faces
|
more_help |
new_group |
new_group_name |
nonplanar_faces |
oriented_faces |
oriented_faces_menu | - 1 : Similar Normals
- 2 : Select faces with normals similar to those of the already selected faces
| - 1 : 類似した法線
- 2 : 既に選択された面と類似した法線を持つ面を選択します
|
random |
random_help |
sel_all_str |
select_nth_ring |
sharp_edges |
short_edges |
shortest_path |
similar_area |
similar_area_faces_menu | - 1 : Similar Area
- 2 : Select faces with areas similar to that of the already selected face
| - 1 : 類似したエリア
- 2 : 選択エリアと類似した面を選択し,選択済みの面にします
|
similar_help |
similar_material |
similar_material_faces |
valid_sel |
vertices_with |
wings_shape |
create_folder |
create_folder_dialog |
do_menu | - 1 : Duplicate
- 2 : Duplicate selected objects
- 3 : Delete
- 4 : Delete selected objects
- 5 : Rename
- 6 : Rename selected objects
- 7 : Create Folder
- 8 : Rename Folder
- 9 : Delete Folder
- 10 : Delete folder and its contents
- 11 : Move to Folder
- 12 : Move selected objects to this folder
- 13 : Empty Folder
- 14 : Remove From Folder
- 15 : Remove Selected From Folders
| - 1 : オブジェクトを複製
- 2 : 選択されたオブジェクトを複製します
- 3 : オブジェクトを削除
- 4 : 選択されたオブジェクトを削除
- 5 : リネーム
- 6 : 選択されたオブジェクトをリネーム
- 7 : フォルダを新規作成
- 8 : フォルダをリネーム
- 9 : フォルダと中身を削除
- 10 : フォルダごと選択オブジェクトを削除
- 11 : 選択オブジェクトを入れる
- 12 : ジオメトリで選択中(アクティブ状態)のオブジェクトをこのフォルダへ移動します
- 13 : オブジェクト全てを出す
- 14 : 選択オブジェクトを出す
- 15 : フォルダから出す
|
help |
rename_folder_dialog |
title |
wings_shapes |
cone |
cube |
cylinder |
dodecahedron |
grid |
icosahedron |
prim_help |
prim_name |
sphere |
tetrahedron |
torus |
wings_subdiv |
face_centers |
smooth |
wings_tesselation |
submenu | - 1 : Triangulate
- 2 : Quadrangulate
| |
wings_theme |
menu | - 1 : Themes
- 2 : Classic Green Theme
- 3 : Change the display colors to the original Wings3D theme with the green titlebars
- 4 : Olive Theme
- 5 : Grey Blue Theme
- 6 : Dark Blue Theme
- 7 : Change color scheme
| - 1 : ウインドウ外観の変更
- 2 : グリーン(クラッシック)
- 3 : ウインドウデザインを緑色タイトルバーの Wings3Dの元のテーマに切替えます
- 4 : オリーブ
- 5 : グレイブルー
- 6 : ダークブルー
- 7 : 配色を変更
|
wings_toolbar |
button_help_1 |
button_help_2 |
button_help_3 |
messages |
wings_tweak |
axis_string |
cam_conflict |
camera_msg |
constraints_menu | - 1 : Locks movement to the selection's Normal.
- 2 : Locks movement to the Default Axis.
- 3 : Locks movement to the Radial of the current Tweak Axis.
- 5 : Locks movement to the ~s axis.
- 6 : Constrained movement to normal of element marked by Tweak Vector.
- 7 : Scale from mouse cursor.
- 8 : Scale from element marked by Tweak Vector.
- 9 : Scale from Default Point.
- 10 : Clear Constraints
- 11 : Clear all locked axes.
| - 1 : 移動を選択領域の法線方向へ固定する.
- 2 : 移動をデフォルト軸方向に固定する.
- 3 : 移動を現在軸から放射状に固定する.
- 5 : 移動を ~ts 軸方向に固定します.
- 6 : 移動方向がTweakベクトルでマークされた要素の法線へ制限されます.
- 7 : マウスカーソルのドラッグで拡大縮小します.
- 8 : Tweakベクトルでマークされた要素で拡大縮小.
- 9 : デフォルト位置で拡大縮小.
- 10 : 固定軸をクリア
- 11 : 固定されたすべての軸設定をクリアします.
|
extra_msg |
help_msg_axes |
help_msg_basic |
help_msg_hotkeys |
help_msg_keys |
help_msg_magnet |
help_msg_palette |
help_msg_using_keys |
help_window |
mag_thelp |
magnet_type |
menu | - 1 : Tweak is a collection of tools for quickly adjusting a mesh.
- 2 : Enable Tweak
- 3 : Disable Tweak
- 4 : Magnets
- 5 : Axis Constraints
- 6 : Move selection relative to screen, or constrained to an axis.
- 7 : Move selection along average normal.
- 8 : Scale selection relative to screen, or constrained to an axis.
- 9 : Scale elements uniformly from the selection center.
- 10 : Relax selection toward the average plane of neighbors.
- 11 : Slide elements along adjacent edges.
- 13 : Tweak Preferences
- 14 : Preferences for Tweak
| - 1 : Tweakは直感的にメッシュを編集する機能が揃ったパレットです.
- 2 : ツールを有効に
- 3 : 【有効】: 無効に
- 4 : マグネット形状
- 5 : 軸を固定する
- 6 : 選択要素ドラッグ方向が画面の上下左右/軸方向の移動に対応。
- 7 : 選択領域を平均した法線方向へ移動.
- 8 : 選択要素ドラッグ方向が画面の上下左右/軸での拡大縮小に対応。
- 9 : 選択要素ドラッグで画面の中心から同比率で拡大縮小する.
- 10 : 選択領域を周りと平均的になるよう形状を崩さずに整える.
- 11 : 周囲に接続する辺方向に選択要素をスライド.
- 13 : Tweak環境設定...
- 14 : Tweakツールの環境設定
|
menu_conflict | - 1 : Key combo was not assigned.
Those keys would conflict with the right click Tweak menu.
| - 1 : キーの組合せは割り当てられませんでした.
これらのキーは右クリックメニューと衝突するでしょう.
|
mode |
palette_title |
spacebar_msg |
toggle_bold |
tweak_disabled_msg |
tweak_info_line |
tweak_magnet_help |
tweak_magnet_menu | - 1 : Disable Magnet
- 2 : Enable Magnet
- 3 : Tweak magnets are similar to 'soft selection'.
- 5 : Radius Adjust Key
- 6 : Press [Insert] to customize hotkey for adjusting the magnet radius.
- 7 : Without a hotkey assigned, the magnet radius is adjusted by holding [Alt].
- 8 : Reset Radius
- 9 : Reset the magnet radius to 1.0
- 10 : Next Magnet Type
- 11 : Can be hotkeyed to cycle through the magnets.
| - 1 : 【有効】: 無効に
- 2 : ツールを有効に
- 3 : Tweakメニューのマグネット効果は'soft selecton'と似ています
- 5 : 半径調整キー設定
- 6 : [Insert]キーを押し、マグネット半径の調整のためのホットキーを設定ください.
- 7 : [Alt]キーも同時に押すと,ホットキー割り当て無しで,マグネットの半径を調節できます.
- 8 : 半径をリセット
- 9 : マグネット効果の及ぶ半径を1.0にリセットします
- 10 : 次のマグネットタイプ
- 11 : マグネット効果を通してホットキーをローテーションできます.
|
tweak_magnet_radius_help |
tweak_menu_item | - 1 : Binding:
- 2 : Set:
- 3 : Swap:
- 4 : Hold modifiers and/or press any mouse button.
- 5 : Press another tool's key binding.
- 6 : Unbind:
| - 1 : 現在の設定:
- 2 : 設定方法:
- 3 : 交換方法:
- 4 : 修飾キー押しながらマウスボタン(左/右)を押す.
- 5 : 別ツールのキー組合せを押す.
- 6 : 関連取消:
|
tweak_preferences_dialog |
xyzkey_help |
wings_u |
caption |
wings_util |
translation_string |
wings_vec |
add_help_text |
add_magnet |
check_magnet_point |
check_point |
common_magnet_message |
common_message |
exit_menu | - 2 : Cancel current command
| |
get_vec |
guard_string |
magnet_message |
wings_vertex_cmd |
menu | - 2 : Move
- 3 : Extrude
- 4 : Connect
- 5 : Create a new edge by connecting selected vertices
- 6 : Tighten
- 7 : Move selected vertices towards average midpoint
- 8 : Bevel
- 9 : Create faces of selected vertices
- 10 : Dissolve
- 11 : Delete selected vertices (clearing selection)
- 12 : Collapse
- 13 : Delete selected vertices (creating a face selection)
- 14 : Deform
- 15 : Vertex Color
- 16 : Apply vertex colors to selected vertices
- 17 : Connect vertices and return the new edge selected
| - 2 : 移動
- 3 : 押し出し
- 4 : 接続
- 5 : 選択された複数の頂点を接続することで新しい辺を作ります
- 6 : 緊縮
- 7 : 選択された頂点を平均距離に向かって移動させます
- 8 : ベベル
- 9 : 選択された複数の頂点を囲むような面を張ります
- 10 : 削除
- 11 : 選択した頂点を削除します(削除により選択部分のない状態になります)
- 12 : 削除(コラプス)
- 13 : 選択した頂点を削除します(崩壊により生成された面が選択状態になります)
- 14 : デフォルメ
- 15 : 頂点カラー
- 16 : 頂点カラーを選択された頂点へ割り当てます
- 17 : 頂点同士を接続し,それによって新規に生成された辺を選択状態にします
|
wings_view |
auto_rotate_help |
camera |
help |
menu | - 1 : Ground Plane
- 2 : Show the ground plane
- 3 : Axes
- 4 : Show the coordinate axes
- 5 : Workmode
- 6 : Toggle flat/smooth shading
- 7 : Wireframe
- 8 : Display selected objects as a wireframe (same for all objects if nothing is selected)
- 9 : Shade
- 10 : Display selected objects as shaded (same for all objects if nothing is selected)
- 11 : Toggle Wireframe
- 12 : Toggle display mode for selected objects (same for all objects if nothing is selected)
- 13 : Toggle Proxy Mode
- 14 : Toggle the smooth proxy mode for selected objects
- 15 : Quick Smoothed Preview
- 16 : Toggle the smooth proxy mode for all objects
- 17 : Show Saved BB
- 18 : Display any saved bounding box
- 19 : Show Edges
- 20 : Show edges in workmode
- 21 : Show Wireframe Backfaces
- 22 : Show wireframe backfaces
- 23 : Show Normals
- 24 : Show normals for selected elements
- 25 : Reset View
- 26 : Reset view to the default position
- 27 : Aim
- 28 : Aim the camera at the selected element
- 29 : Frame
- 30 : Dolly to show all selected elements (or all objects if nothing is selected)
- 31 : Orthographic View
- 32 : Toggle between orthographic and perspective views
- 33 : Saved Views:
- 34 : Camera Settings...
- 35 : Set field of view, and near and far clipping planes
- 36 : Scene Lights
- 37 : Use the lights defined in the scene
- 38 : Two Lights
- 39 : One Light
- 40 : Use two work lights
- 41 : Use one work light
- 42 : Show Colors
- 43 : Show vertex colors
- 44 : Show Materials
- 45 : Show materials
- 46 : Show Textures
- 47 : Show textures
- 48 : Show Info Text
- 49 : Show an informational text at the top of this Geometry window
- 50 : View Along
- 51 : +X
- 52 : +Y
- 53 : +Z
- 54 : -X
- 55 : -Y
- 56 : -Z
- 57 : Align to Selection
- 58 : Align the view to the normal of the selection
- 59 : Auto Rotate
- 60 : Spin the view
- 61 : Clipping Planes
- 62 : Toggle extra clipping planes (use default axis)
- 65 : Frame Disregards Mirror
- 66 : Highlight Aim
- 67 : Aim camera at mouseover highlight. (Requires 'Use Highlight as Temporary Selection' enabled, and an assigned hotkey)
- 68 : Show
- 69 : Show BB Center
- 70 : Display the Center of any saved bounding box
- 71 : Nearest Axis
- 72 : Show Backfaces
- 73 : Show backfaces when there is a hole or hiddwn faces in an object
| - 1 : 地面
- 2 : 地面を表示する
- 3 : 軸
- 4 : 座標軸を表示
- 5 : フラット/スムーズ表示切替
- 6 : フラット/スムーズシェーディングを切替え
- 7 : ワイヤフレーム表示
- 8 : 選択したオブジェクトをワイヤフレーム表示に切替えます(もし未選択ならすべてのオブジェクトが対象)
- 9 : 陰影表示
- 10 : 選択したオブジェクトを陰影表示モードに切替えます(もし未選択ならすべてのオブジェクトが対象)
- 11 : ワイヤフレーム表示の切替
- 12 : 選択したオブジェクトの表示モードを切替えます(もし未選択ならすべてのオブジェクトが対象)
- 13 : Proxyモード切替(選択のみ)
- 14 : 選択オブジェクトを非破壊的にスムーズ(Catmull)表示します。これは元のメッシュを動かすことで制御可能な代替オブジェクトです)
- 15 : Proxyモード切替(すべて)
- 16 : 全オブジェクトを非破壊的にスムーズ(Catmull)表示します。これは元のメッシュを動かすことで制御可能な代替オブジェクトです)
- 17 : 保存されたBBを表示
- 18 : 保存されたバウンディングボックスを表示
- 19 : 辺を表示
- 20 : ワークモード(フラット/スムーズ表示)で辺を表示
- 21 : ワイヤフレームの裏側を表示
- 22 : ワイヤフレームの裏側を表示
- 23 : 法線を表示
- 24 : 選択した要素の法線を表示します
- 25 : ビューをリセット
- 26 : 視点を初期位置にリセットする
- 27 : 注視
- 28 : 注視(選択部分)
- 29 : 注視(選択部分をフレームイン)
- 30 : ウインドウ枠いっぱいに選択要素が収まるように表示.(未選択ならすべてのオブジェクトが対象)
- 31 : 正投影ビュー
- 32 : 「正投影ビュー」と「遠近法ビュー」を切替えます
- 33 : 記憶済みのビュー:
- 34 : カメラ設定...
- 35 : 視野角,前方/後方クリッピング平面を設定します
- 36 : シーン光源
- 37 : シーン内で定義された光源を使用
- 38 : 2つの光源
- 39 : 1つの光源
- 40 : 2つの光源を使用
- 41 : 1つの光源を使用
- 42 : カラー表示
- 43 : 頂点カラーを表示します
- 44 : マテリアル表示
- 45 : マテリアルを表示します
- 46 : テクスチャ表示
- 47 : テクスチャを表示します
- 48 : 情報テキストを表示
- 49 : このジオメトリウインドウの上部に情報テキストを表示します
- 50 : 正面図ビュー(各軸の垂直面)
- 51 : +X軸(Z←↑Y)
- 52 : +Y軸(Z↓→X)
- 53 : +Z軸(Y↑→X)
- 54 : −X軸(Y↑→Z)
- 55 : −Y軸(Z↑→X)
- 56 : −Z軸(X←↑Y)
- 57 : 選択領域の法線に垂直なビュー
- 58 : 選択領域の法線と重なるラインに視点を変更します
- 59 : 自動回転
- 60 : ビューを自動回転させます
- 61 : クリッピング平面
- 62 : 拡張クリッピング平面を切替える(デフォルト軸使用時)
- 65 : ミラー選択領域をフレームに入れない
- 66 : 注視(選択部分)
- 67 : 選択部をマウスオーバーすると視点が移動します(高度な設定で'強調表示部を臨時選択として使用'が有効でキーが割当られている場合)
- 68 : 補助情報の表示
- 69 : BBの中心を表示
- 70 : 保存されたバウンディングボックスの中心を表示します
- 71 : 最も近い軸
- 72 : 面の裏側を表示
- 73 : オブジェクトの面を隠したり穴がある場合にその裏側を表示します
|
shader_submenu | - 1 : Next
- 2 : Previous
- 3 : Shaders:
| - 1 : 次の項目
- 2 : 前の項目
- 3 : シェーダー:
|
view_legend |
views |
views_jump |
views_jumpmenu | - 1 : Jump
- 2 : No saved views!
- 3 : Jump to prev[
- 5 : Jump to current[
- 7 : Jump to next[
- 9 : Jump to [
- 11 : Jump
| - 1 : 直接指定
- 2 : 保存済みのビューがありません!
- 3 : 前の項目へ[
- 5 : カレント項目へ[
- 7 : 次の項目へ[
- 9 : ジャンプ[
- 11 : ジャンプ
|
views_move |
views_movemenu | - 1 : Move Current
- 2 : No saved views!
- 3 : Move "
- 5 : ] to prev[
- 7 : Move "
- 9 : ] nowhere
- 10 : Move "
- 12 : ] to next[
- 14 : Move "
- 16 : ] to [
- 18 : Move Current
| - 1 : カレントビューへ移動
- 2 : 記憶済みのビューがありません
- 3 : 移動"
- 5 : ]前へ[
- 7 : 移動"
- 9 : ]不明
- 10 : 移動"
- 12 : ]次へ[
- 14 : 移動"
- 16 : ]から[
- 18 : カレントビューへ移動
|
views_rename_qs |
views_save_dialog |
views_submenu | - 1 : Next
- 2 : Current
- 3 : Prev
- 4 : Save
- 5 : Save this view at
- 7 : Rename...
- 8 : Delete
- 9 : Delete All...
| - 1 : 次へ
- 2 : カレントビュー
- 3 : 前へ
- 4 : ビューを記憶
- 5 : このビューを記憶:
- 7 : リネーム...
- 8 : ビューを削除
- 9 : すべて削除...
|
views_submenu_help | - 1 : No saved views!
- 2 : Jump to "
- 5 : Rename "
- 8 : Delete "
- 11 : Delete all saved views
| - 1 : ビューが記憶されていません!
- 2 : ジャンプ先"
- 5 : リネーム"
- 8 : 削除"
- 11 : 記憶したビューを削除
|
virtual_mirror |
virtual_mirror_fun |
wings_we |
all_soft |
mixed_edges |
normals_2 |
wings_wm |
message_event |
wings_wm_toplevel |
close_event |
ctrl_command |
ctrl_menu | - 1 : Fit
- 2 : Both
- 3 : Let window use all available space by expanding in all directions
- 4 : Horizontal
- 5 : Let window use all available space by expanding it horizontally
- 6 : Vertical
- 7 : Let window use all available space by expanding it vertically
- 8 : Size
- 9 : Set window size numerically
| - 1 : 余白一杯に広げる
- 2 : 両方広げる
- 3 : 余白があれば、ウインドウを全方向に拡張します
- 4 : 水平
- 5 : 水平方向に余白があれば、ウインドウの横幅をいっぱいに拡張します
- 6 : 垂直
- 7 : 垂直方向に余白があれば、ウインドウの高さをいっぱいに拡張します
- 8 : サイズ
- 9 : ウインドウサイズをダイアログで入力した数値で指定します
|
ctrl_menu_toolbar | - 1 : Hide Toolbar
- 2 : Hide the toolbar
- 3 : Show Toolbar
- 4 : Show the toolbar
| - 1 : ツールバーを隠す
- 2 : ツールバーを隠す
- 3 : ツールバーを表示
- 4 : ツールバーを表示
|
ctrl_message |
ctrl_resize |
resize_event |
wpa |
dialog_template |
do_import |
export_scale_s |
export_selected |
format_error |
import |
import_scale_s |
|