カットされたテキスト、コード、写真の下。
パートI.地球
まず、最新のSDKをダウンロードしてインストールする必要があります 。 多くのシーンがその場で生成され、アクセス権の問題が発生する可能性があるため、プログラムファイルにインストールする必要はありません。
ソースから独立してエンジンを構築したい人のために、 メモがありますが、これは必要ありません-実行中のCityGenデモですべてを行うことができます。
メモから役に立つのは、エンジンコマンドに関するドキュメントの生成です。このためには、binフォルダーからautodoc.pyを実行し、doc / autodocフォルダーでindex.htmlを開く必要があります(以降、すべてのフォルダーは、インストール中に定義されたnebulaフォルダーに関連して指定されます) 。
始めましょうか? おそらく時は正しい。
スタートメニューからCityGenを起動し、外出先で生成された風景の写真を確認します。 はい、景色は少しがっかりしましたが、これは学生の仕事であり、その目的は私たちがインストールしたものを確認することです。
現在、2つの方法で作業/実験を行っています。
1. Escを押してコンソールを呼び出します。 彼女は写真の背景に表示されます。
2. F2を押してnbrowserを呼び出します。 これは次のようなものです。
この記事ではnbrowserについては説明しません(かなりシンプルなインターフェイスがあり、もしあれば、その機能の説明を含む短い投稿の概要を説明します)。したがって、組み込みのコンソールを使用します。
Escを大胆に押して、さまざまなログの後に、次のようなコマンドラインを取得します。/ usr / scene>
nebulでは、エンジンのすべてのオブジェクトはC ++クラスのインスタンスであり、nrootクラスの継承者であり、実行時にはファイルのようなパスを持つ階層ツリーシステムに編成されます。 パスは、絶対パスと相対パスの両方にすることができます。 いわゆるレンダリングが開始されるツリーノード。 シーンのルート(nebul)は、伝統的に/ usr / sceneにあり、プロンプトで判断すると、そこにあります。 コマンド(関数)は、いくつかの基本的なものを除き、元のクラスの元のメソッドへの呼び出しであり、現在のノードまたは指定されたパスを持つ任意のオブジェクトに与えることができます。
例として、魅力的な女性はコンソールの文字の色をピンクに変えることができます:
/sys/servers/console.seticolor 255 10 100 255
現在のシーンの絵のようなビューを楽しんだ後、余分なものを削除しないように(たとえば、ユーザーのカメラがそれなしでレンダリングをクラッシュさせるように)、慎重にのみ、すばやく消去しましょう。
現在のノードにあるものを調べるには、 dirコマンドを使用します
/usr/scene>dir cam skybox sun city landscape lights machine
おそらく、カメラ、太陽、光を離れ、止められない手で残りを破壊するでしょう。
delete machine delete city delete landscape delete skybox
そして、私たちは天と地を取り除きました...そしてそれは空になりました...(しかし、光が残っていたのでそれは光です)
さて、これで何かを作成できます。 今から音楽から始めましょう-ムード、タイプ、その他すべて。 作成されたメッシュ(この記事の範囲を超えているため)がメッシュ、テクスチャ、音楽のあるフォルダーに移動します。 実際のファイルシステムをナビゲートするために、tclは通常のcdコマンドを使用します。 tutorialsフォルダーに入る必要があります。
cd ../tutorials
サウンドノードを作成します。
new nsoundnode music sel music .setlooping 1 .setfile Souls_of_Gaia_V.2_Sotano_Sellado.ogg sel ..
困難な長い名前のサウンドファイルをコンソールに入力しないようにするには、技術的なトリック-.setfile [glob * .ogg]を使用できます。 * .oggファイルには1つしかありません-問題はありません。
上記のコマンドには少し説明が必要です。 ツリーのノード間のナビゲーションは、それぞれcdコマンドと同様にsel (selectから)を使用して実行され、 sel ..は1レベル上がります。 新しいnsoundnode musicコマンドを使用して、musicというサウンドノードを作成しました。 newはクラスを最初の引数として、この場合-nsoundnode 、2番目の方法、オブジェクトの名前、この場合-ローカルミュージック 、および作成されたオブジェクトを返します。tclの場合、これはパスを持つ文字列です。 現在のノードはpselコマンドを返します。 .setlooping 1チームでは、 アプリの実行中に音楽が離れないように要求しました。 そして最後に、 .setfileコマンドは、 再生するサウンドファイルを示しました(ogg / vorbisおよびwav形式がサポートされています)。
ここでもっと楽しみましょう。 著者PeerGynt Lobogrisとこの作品のサイトjamendoに感謝し、さらに先へ進んでください。
どうにかして私たちが一緒に作った空虚さと黒さの中で自分自身を方向づけ始めても害はないだろうし、もちろんグリッドはこれを助けてくれる。
::visual_debug::create_grid 30 60
最初のパラメーター(30)-グリッドプレーンのサイズを設定します。
2番目(60)-セルの数。
さらに、次のように色を設定できます。
::visual_debug::create_grid 30 60 {0.75 0.3 0.0 1.0}
空間ナビゲーションは、AWSDゲームキー、矢印(コンソールがオフの場合)、およびドラッグを移動するために左ボタンが押されたマウス、または回転するために右ボタンが押されたマウスを使用して実行されます。 コンソール(Esc)をオフにします。 見回す...
そろそろ空を返す時です。 そしてまた、既製のコマンドが助けになります:
create_skybox stars1
空が作成されます-地球の変わり目。 これはより深刻な問題であり、より多くのチームがあります( ;そして、それに続くコメントはもちろんオプションです):
sel [new n3dnode shape] ; #- n3dnode shape. .tz -10; # - 0, 0, -10 [new nmeshnode mesh].setfilename sphere.n3d ; # - shape ( , ). sel [new nshadernode shader]; #- , , .setnumstages 1; #- .setcolorop 0 "replace tex"; #- , .begintunit 0; #- .settexcoordsrc "uv0"; #- 0 ( ) .endtunit; #- sel ..; #- [new ntexarraynode tex].settexture 0 "globe.jpg" none; #- ,
まあ、それはここのどこかにあるはずです-私たちはマウス、ボタンでグリッドを見ています、私たちはすべてを探しています。 見つからない場合、絶望しないで、スペースキーを押します。 そして、これが私たちの前にある地球です((窓では、port窓の地球が見える-aaaa)。
実際に何をしましたか? コードを見てみましょう:
sel [新しいn3dnode形状] -shapeという名前のn3dnodeタイプのノードを作成し、すぐに選択します。
一般に、エンジンの可視オブジェクトはサブツリーであり、そのルートは、親を基準とした幾何学的変換を含むノードです。 このようなノードは、タイプn3dnodeまたはその子孫のクラスに属します。 このクラスのメソッドは、最初に生成したドキュメントのページにあります。 これで、1つの.tz -10コマンドのみが必要になります。これは、親ノードを基準にして座標0、0、-10のポイントにオブジェクトを配置します。 シーン。
次のコマンド[new nmeshnode mesh] .setfilename sphere.n3dは、 シェイプノード(三角形で定義された幾何モデル)の下にメッシュノードを作成します。 この場合、 meshという名前のクラスnmeshnodeのオブジェクトを使用し、すぐにそれを球体モデル(sphere.n3d)のファイルに割り当てます。 .n3dタイプのファイルは、ASCII形式の読み取り可能なファイルです。 バイナリ.nvx形式もあります。
sel [新しいnshadernodeシェーダー] - シェイプノードの次のサブノードは、固定コンベア用のモデルのマテリアル、ライティング、テクスチャリングパラメーターを記述します(エンジンはソフトウェアシェーダーもサポートします)。 簡単にするために、ここに最も基本的で「貧しい」シェーダーを示します。照明とマテリアルのパラメーターはありません。
最後に、テクスチャノード[新しいntexarraynode tex] .settexture 0 "globe.jpg" none 、 形状の最後のサブノード。
そして、一般的な形で可視オブジェクトのモデルをもう一度繰り返します。
T-サブノードを含む親-n3dnodeに相対的な変換:
| -M-静的または動的な幾何モデル-nmeshnode、nmeshcluster、nmeshipolなど
|-S (オプション)-シェーダー、シンプルまたはソフトウェア-nshadernode、nshaderprogramnode
|-T (オプション)-テクスチャ、 ntexarraynode、pdtexarraynode
やめて! 明らかに何かが欠けています。 委員会でつぶやいているガリレオは何ですか...?
シェイプノードにいることを確認してください
sel /usr/scene/shape sel [new nipol rot] .connect ry .addkey1f 0 0 .addkey1f 15 360 sel ..
はい、今、彼女は回転しています!
作業の結果を保存しましょう:
sel /usr/scene .saveas earth
これで、data / tutorialsフォルダーにearth.nというTclスクリプトがあります。 あなたはそれを読むことができます。 すべてが確実に保存されるようにするために、しっかりとした手で作成を消去します。
delete shape
そして、それを再びロードしますが、ファイルとして:
.parse earth.n
原則として、これは止められ、患者の読者である実験者に注意を向けて感謝し、彼は控えめにステージを去るだろうが、新年は彼の鼻の上にあり、誰も小さな休日の奇跡をキャンセルしなかった。 それで作成しましょう。
パートII 地球ではない
すでによく知られているコマンドで、地球のほこりを振り払います:
sel /usr/scene delete shape
多くの作業が再び待っていますが、コンソールからすべてのコマンドを入力することを急がないでください-最後に、すべてのテキストを手動で印刷せずに、このチュートリアル、パート1または2をダウンロードする方法を書きます。
set mesh_files [glob *.n3d];# - set meshes {};# - foreach m $mesh_files { lappend meshes [file rootname [file tail $m]] ;# - } sel [new n3dnode shape];# - .txyz 0 1 -10;# - sel [new nspriterender sr];# - sel [new nstaticmeshemitter me];# - sel [new nmeshipol mesh];# - () # - # foreach ; - , foreach m $meshes { new nmeshnode $m; $m.setfilename $m.n3d; $m.setreadonly true; # - , , , ; } .setreadonly true;# - set i 0 .beginkeys [expr [llength $meshes] * 2 + 1];# - , "" # ; foreach foreach m $meshes { .setkey $i [expr $i*3] $m; # - 3 , 3 incr i; .setkey $i [expr $i*3] $m; incr i; } .setkey $i [expr $i*3] [lindex $meshes 0];# - 1 , .endkeys;# - "" .setupdatecoord true;# - .setupdatenorm true;# - .setupdateuv0 true;# - 0 sel ..;# - .setlifetime 10;# - .setmeshnode mesh;# - "" sel ..;# - set sz 0.075;# - set bn 0.025;# - .beginkeys 4;# - .setkey 0 $sz $bn 1 1 1 1 .setkey 1 $sz 0 1 1 1 1 .setkey 2 $sz 0 1 1 1 1 .setkey 3 $sz 0 1 1 1 1 .endkeys .setemitter "me";# - "" sel ..;# - shape sel [new nshadernode shader];# - .setnumstages 1;# - .setcolorop 0 "mul tex const";# - .setalphaop 0 "replace tex";# - .setconst 0 1 1 1 1;# - , .begintunit 0;# - .setminmagfilter "linear_mipmap_nearest" "linear" .settexcoordsrc "uv0" .endtunit .setlightenable false;# - .setalphaenable true;# - .setzwriteenable false;# - z-buffer .setcullmode "none";# - "" sel [new nipol ipol];# - - .connect setconst0 ;# - setconst0 .addkey4f 0 1 0 0 1; # red .addkey4f 1 1 1 0 1; # yellow .addkey4f 2 0 1 0 1; # green .addkey4f 3 0 1 1 1; # cyan .addkey4f 4 0 0 1 1; # blue .addkey4f 5 1 0 1 1; # magenta .addkey4f 6 1 1 1 1; # white sel .. sel .. [new ntexarraynode tex].settexture 0 "lib:textures/glow-flat-a.png" "none";# - sel [new nipol rot];# - Y .connect ry .addkey1f 0 0 .addkey1f 15 360 sel .. sel ..
この部分の簡単な説明。 結果として得られたモーフは、事前に生成されたメッシュを使用します。 モーフィングの前提条件は、同じ数の頂点です。 残りのコードは独立した学習のために残します。 もちろん、質問は大歓迎です!
記事の最初の部分をダウンロードするには、次のように入力します。
cd ../tutorials source tutorial0.tcl
次に、2番目の部分を開始します。
part2
さて、それだけです!
:)おめでとう、Habrのすべての読者、明けましておめでとうございます!
PS起動時に突然問題が発生した場合は、次のオプションのいずれかを試してください。
1. DirectXを更新します(June SDKを使用します)
2.エンジンがOpenGLを使用するように、CityGen-GLを実行します。