[ 前へ | 目次 | 次へ ]
Now Loading...
ダウンロード
PC (※スマートフォンでは動きません) でダウンロードし、ZIPファイルを右クリックメニューから展開して、できたフォルダ内の「 VCSSL.bat(バッチファイル) 」をダブルクリックすると起動します。 Linux等では「 VCSSL.jar 」をコマンド実行してください。
» 詳しい使用方法や、エラーで展開できない際の対応方法などはこちら

力学アルゴリズムによる波のシミュレーション(面上の波)

このプログラムは、面上を伝わる波を、単純な力学アルゴリズムと数値積分法によって計算し、その結果をリアルタイムでアニメーション表示するVCSSLプログラムです。

なお、このプログラムは以下のプログラムの応用編です。先にそちらの方からお読みいただくと、内容がスムーズに把握できるかもしれません。

使用方法

ダウンロードと展開(解凍)

まず、PC(スマホは未対応)で上の画面の「 ダウンロード 」ボタンを押してください。 するとZIP形式で圧縮されたファイルがダウンロードされるので、そのZIPファイルを右クリックして「すべて展開」や「ここに展開」などで展開(解凍)してください。 展開が成功すると、ZIPファイルと同じ名前のフォルダができ、その中にZIPファイルの中身が入っています。

» 展開がエラーで止まってしまう場合は…

なお、Linux® 等をご使用で、右クリックメニューから展開するとファイル名が文字化けしてしまう場合は、 コマンドライン端末でZIPファイルのある場所まで cd した上で「 unzip -O cp932 ZIPファイル名 」で展開してみてください。

プログラムの起動

Microsoft® Windows® をご使用の場合

上記の通りにZIPファイルを展開したフォルダ内にある、 「 VCSSL.bat(種類はバッチファイル) 」をダブルクリック実行してください。 もしプログラムの内容を書き変えながら使いたい場合は、代わりに「 VCSSL_Editor.bat 」を実行してください。

実行すると、最初にメモリー使用量や、(必要な場合のみ)Java®実行環境を自動で入手するか 等を尋ねられるので、適時答えると、プログラムが起動します。2回目以降はすぐに起動します。

※ ここで入手したJava®実行環境は、ZIPファイルを展開した中の「 jre 」フォルダ内にダウンロードされ、このプログラムの実行のみに使用されます。PC全体に影響する形でインストールされる事はありません。

Linux® 等やその他のOSをご使用の場合

ZIPファイルを展開したフォルダ内へコマンドライン端末で cd して、以下の通り入力して実行してください:

java -jar VCSSL.jar
(プログラムの内容を書き変えながら使いたい場合は、代わりに VCSSL_Editor.jar を実行)

» javaコマンドが使用できない等のエラーが表示される場合は…

操作方法

画面上で、下記のマウス操作を行えます。

  • 左ドラッグ … 視点の回転
  • 右ドラッグ … 視点の平行移動
  • ホイールスクロール … 拡大/縮小

題材解説

面上を伝わる波

「波」について、最も基礎的なものは、線(1次元)上を伝わる波です。しかし、日常的には「波」というと、水面などの面(2次元)上を伝わるものをイメージします。

シミュレーションでは、バネと質点による格子メッシュでモデル化

波を伝えるのは、弾性のある、つまり伸び縮みする媒質です。

このような弾性体をシミュレーションするにはいくつかの方法があります。簡単なのは、媒質を、バネで繋がった質点(質量のある点)で置き換える事です。そして弾性体の張力はバネの張力で、密度は質点の質量で表現します。

バネで繋がった質点のモデル
モデルの概要
伸び縮みする連続的な媒質を、バネと質点(質量のある点)で置き換えて扱うモデルです。弾性体の張力はバネの張力で、密度は質点の質量で表現します。

線(1次元)上の波をシミュレーションするなら、上図の通り、線上にバネを繋げるだけで済みます。一方、面(2次元)上を伝わる波の場合は、バネをメッシュ(網の目)のように張り巡らせ、格子点に質点を置いたモデルを用います。

バネと質点で構成される、格子メッシュのモデル
モデルの概要
面(2次元)上を伝わる波の場合は、バネをメッシュ(網の目)状に張り巡らせ、格子点に質点をおいたモデルを用います。

このようにモデルを設定すれば、媒質全体の運動は、前後左右の4つのバネから力を受ける、質点の運動として扱えます。

なお、メッシュはX-Y平面の方向に張っているとし、波の振動方向はZ軸のほうに取るものとします

隣り合う1個の質点(とバネ)からは、Z値の差に比例する力を受ける

隣り合う1個の質点から受ける力については、線上の波をシミュレーションする場合と全く変わりません。 具体的には、以下のプログラムの解説ページで求めた通りです。求める詳しい手順については、以下のページをご参照下さい。

今回は、上記ページで求めた結果だけを用いる事とします。

即ち、「 隣り合う1個の質点からは、Z値の差に比例する力を、Z方向に受ける 」というものです。水平方向(ここではX/Y方向)の力はオーダーが小さいため、振幅があまり大きくない場合は、ほぼ無視できます。

具体的に式で記述すると、ある質点が、Z方向にバネから受ける力 F は以下のようになります:

\(F_{ある質点が、バネから受ける力} \simeq T dz/dL\)
  \( = T (z_{その隣の質点} - z_{ある質点})/dL\)

ここで T はバネの張力です。また dL は、質点間の距離であって、X方向に隣接する質点なら dx、Y方向に隣接する質点なら dy と記述します。格子は水平方向へはほぼ力を受けないため、dx と dy はほぼ定数と見なせます。

X方向およびY方向へのメッシュ全長を Lx, Ly とし、各方向への質点数を Nx, Ny とすると、dx と dy の値は:

\( dx = L_x / (N_x-1) \)
\( dy = L_y / (N_y-1) \)

質点の受ける力は、4つの隣接する質点(とバネ)から受ける力の合計

質点は、4つの質点(とバネ)と繋がっています。質点が力を受ける経路はこれだけです。従って、質点が受ける力は、これら4つの質点から受ける力の合計で求まります。

質点は、4つの隣接する質点と、バネで繋がっています。
4つの隣接する質点とバネ
質点は、4つの隣接する質点と、バネで繋がっています。これらから受ける力の合計が、その質点に働く力です。

具体的に、ある質点がバネから受ける力を式で書くと:

\(F_{ある質点が、バネから受ける力} =\)
  \(T (z_{x方向の隣接質点1} - z_{ある質点})/dx\)
  \(+ T (z_{x方向の隣接質点2} - z_{ある質点})/dx\)
  \(+ T (z_{y方向の隣接質点1} - z_{ある質点})/dy\)
  \(+ T (z_{y方向の隣接質点2} - z_{ある質点})/dy\)

と書けます。

端の処理(固定端、自由端)

上の式では、4つの隣接質点を前提としたもの、つまり端以外の質点に関するものです。

従ってメッシュの端、即ち辺上にある質点に関しては、上の式とは異なる特別な処理を行う必要があります。具体的に端をどう処理するかについては、次に述べる2つの方式があります。

一つは「 固定端 」というもので、端(辺上)の質点を固定してしまい、動かなくするという方式です。この場合、質点がバネから受ける力は、固定の抗力と釣り合って常に 0 となります:

\( F_{固定端がバネから受ける力} = 0 \)

もう一つは「 自由端 」というもので、端の質点であっても、隣接する3個(辺上の場合)または2個(カドの場合)の質点とのバネから力を受けるとするものです:

\( F_{自由端がバネから受ける力} = 隣接する2または3個の質点から受ける力の和 \)

自由端の場合、端の質点は、3つ(返上)または2個(カド)の質点から力を受けて動きます。
端の質点が受ける力
自由端の場合、端の質点は、3個(辺の上にある点)または2個(カドの点)の質点から力を受けて動きます。

速度に比例する摩擦力で、減衰効果を加える

このままでは、全体でエネルギーが保存しているため、波がいつまでたっても消えません。しかし現実では、波はいずれ減衰して消えてしまいます。

このような減衰効果は、モデルによってメカニズムが異なります。最も簡単なのは以下のように、各質点に、速度に比例する摩擦力を加える事です。

\( F_{減衰効果付きの力} = F_{バネから受ける力} - f v \)   … (6)

小文字の v は質点の速度です。小文字の f は摩擦力の係数で、この値が大きいほど波の減衰が強くなります。摩擦力は、速度と逆向きに作用するため、項の符合にマイナスが付いています。

数値積分によって運動を解く

個々の質点の受ける力が求まったので、あとはニュートンの運動方程式を立てて数値積分すれば、質点の運動が求まります。個々の質点の運動方程式は、加速度を a 、質点の質量を m として:

\( m a = F \)

と置けます。ここで加速度 a は速度 v の微分 dx /dt であり、さらに速度 v は位置 y の微分 dy / dt なので、以下の 2 式の形に直します。

\( dv / dt = F / m \)   … (7)
\( dx / dt = v \)   … (8)

あとはこれらの連立微分方程式を解けば良いのですが、シミュレーションで数値的に解くために、時間変数 t を細かい区間 Δt に区切り、数値積分法を用いて解きます。

最も単純なのは、Euler(オイラー)法と呼ばれる数値積分法です。 これは、時間区間 Δt 内では、v や F がほぼ変わらないと見なす方法です。こうすると、

\( \Delta v / \Delta t = ( v_{t+1} - v_t ) / \Delta t = F_t / m \)   … (9)
\( \Delta x / \Delta t = ( x_{t+1} - x_t ) / \Delta t = v_t \)   … (10)

となり、現在の時刻の状態から、次の時刻の状態を求める漸化式が得られます:

\( v_{t+1} = v_t + (F_t/m) \Delta t \)   … (11)
\( x_{t+1} = x_t + v_t \Delta t \)   … (12)

ただし、Euler法はあまり精度が良くありません。科学技術計算で要求される精度を出したければ、4次Runge-Kutta法(RK4)など、もっと高精度の数値積分法を用いる必要があります。

しかし、Euler法を次のように一部改変するだけで、RK4ほどではありませんが、精度を上げる事ができます:

\( v_{t+1} = v_t + (F_t/m) \Delta t \)   … (13)
\( x_{t+1} = x_t + v_{t+1} \Delta t \)   … (14)

このように、位置の更新に、古い速度ではなく、新しい速度を用いるだけです。こうしておく事で Symplectic数値積分の一種となり、エネルギーが振動的に保存するようになると共に、精度自体もEuler法より向上します。

3DCGでの描画方法

以上で、メッシュの運動を力学的アルゴリズムでシミュレーションする方法は求まりました。続いて、それを3DCGで画面に描画する方法について解説します。

ここでは、要点のみを抜き出して解説します。より詳しい解説は、以下のページをご参照下さい。

四角形格子メッシュ(QUADRANGLE_GRID)形式の頂点配列

まずモデルの作成についてですが、今回のような格子メッシュ状に並ぶ座標値からは、簡単に3Dモデルを作成する事ができます。

それにはまず、四角形格子メッシュ(QUADRANGLE_GRID)形式という特定の形で、メッシュ頂点の座標を格納した「 頂点配列 」を用意します。

四角形格子点メッシュ形式における座標値配列の形式
四角形格子点メッシュ形式における座標値配列の形式
黒い線は四角形の辺で、青い点が格子点。この形で並ぶ四角形の集合は、格子点の座標値だけで指定できるはずで、実際にそれを表すのが四角形格子メッシュ(QUADRANGLE_GRID)形式の座標値配列です。 格子の軸がX-Y方向にあると仮定すると(別にY-ZでもZ-Xでも可)、 [ 格子点Y番号 ][ 格子点X番号 ][ その格子点のXYZ(0〜2)] といった3次元のfloat配列に格子点座標を格納します。

この形式の頂点配列は、3次元のfloat配列で用意します。

左と中央の次元は、格子のYとX方向の番号を意味します。具体的な番号は上図を参照してください。なお、[ X番号 ][ Y番号 ]ではなく、[ Y番号 ][ X番号 ]である事にご注意ください。Y-Z方向やZ-X方向の格子を使う場合も、このようにインデックスが逆転します。

右の次元は、その格子点の座標値のX/Y/Zを意味する次元です。0がX、1がY、2がZに対応します。

上図からも見て取れる通り、この形式の頂点配列は、今回のような四角形のメッシュ構造を扱うのに非常に都合の良い形式となっています。

実際、今回のプログラムでは上の形式の頂点配列を作成し、それを単に描画時だけでなく、力学演算時にも流用しています。描画用と演算用でわざわざ別に配列を用意するメリットが、今回はあまり無いからです(描画メッシュよりも演算メッシュを細かく取りたい場合などは、別に用意する意味もあります)。

描画モデルの生成

頂点配列からモデルを生成するには、Graphics3D ライブラリの newModel( int format, float vertex[ ][ ][ ] ) 関数を使用します。引数のformatには、Graphics3Dライブラリに定義されている定数値 QUADRANGLE_GRID を指定します。続くvertexには頂点配列を指定します。なお、この関数は、頂点配列からモデルを生成し、そのモデルに固有の識別番号「 モデルID 」をint型で返します。

描画モデルの形状変更

今回はモデルの変形をアニメーションで描画する必要があるので、画面更新タイミングごとに、モデルに頂点配列を再設定する必要があります。これにはGraphics3D ライブラリの setModelVertex( int modelID, float vertex[ ][ ][ ], int format ) 関数を使用します。引数のmodelIDには、newModel関数が返したモデルIDを指定します。続くvertexには頂点配列を指定します。最後のformatには、ここでも QUADRANGLE_GRID を指定します。

3DCGプログラミングの詳細はガイドで

その他、3DCGの制御に関する基本的な解説は、下記のガイドで解説していますので、そちらをご参照下さい。

コード解説

コード全体

このプログラムのコード全体は少し長ですが、まずは全体を見てみましょう。以下の通りです。

以下では、コードの各部について解説します。

先頭領域

プログラムの先頭領域では、以下のライブラリを読み込んでいます。

この通り、まず標準ライブラリから、数学関数を扱う「 Math 」と、3次元グラフィックスを扱う標準ライブラリ「 Graphics3D 」を読み込んでいます。

加えて、3DCG用フレームワーク「 graphics3d.Graphics3DFramework 」も読み込んでいます。

グローバル変数の宣言

続いてグローバル変数の宣言です。

前半部では、頂点配列や、速度、加速度の配列など、基盤としての変数を宣言しています。

続く中盤部では、張力や質量密度など、力学モデルのパラメータ変数を宣言しています。

最後に、描画モデルや座標系のIDを格納する変数など、グローバルに必要な雑用変数を宣言しています。

初期化処理を行う onStart関数

続いて具体的な処理を見ていきましょう。まずは プログラムの準備的な処理 = 初期化処理 を行うonStart関数です。

この関数は、プログラム開始後に一度だけ、フレームワークから自動でコールされる仕組みになっています。

前半部では座標系の準備を行い、後半部ではモデルの準備を行っています。

座標系は、モデルを配置する台座のような存在です。デフォルトでもワールド座標系という特別な座標系が最初から用意されていますが、そこに配置すると、座標(0, 0, 0)の点が画面の中心に描かれてしまいます。 それだと、今回のモデルだとメッシュの端が画面中心に来てしまいます。 やはりモデルの中心を画面中心に一致させたいので、別に座標系を一つ用意し、その上にモデルを配置しています。

具体的な座標系の生成や位置設定などは、後述するinitializeCoordinate関数に実装しているので、ここではそれをコールしています。すると、グローバル座標系の waveCoordinate に、生成した座標系のIDが格納されます。 それをGraphics3Dライブラリの addCoordinate 関数でレンダラー(描画エンジン)に登録しています。なお、この時点で座標系はワールド座標系上に配置されます。

続いてモデルの生成ですが、これも後述するinitializeModel関数に実装しているので、ここではそれをコールしています。すると、グローバル座標系の waveModel に、生成したモデルのIDが格納されます。 それをGraphics3Dライブラリの addModel 関数で、レンダラー(描画エンジン)に登録すると共に、先ほど確保した座標系上に配置しています。

最後に、後述する setGaussianWave 関数をコールし、頂点配列が格納する座標値を、ガウス波束の形状となるように初期設定しています。

以上がinitialize関数の中身であり、初期化処理の大まかな流れをまとめた形となっています。 ここからは、initialize関数でコールしていた関数の中身を、具体的に見ていきます。

座標系の初期化 - initializeCoordinate関数

まずは座標系の生成と位置設定を行うinitializeCoordinate関数です。

内容は、まず座標系を生成し、moveCoordinate関数でメッシュ全長の半分だけ平行移動させています。これにより、この座標系をワールド座標系上に配置した際、メッシュの中心が画面中心に一致するようになります。

加えて、rotZCoordinate / rotXCoordinate関数で角度を微妙に変えています。これで、プログラム開始時に、斜め見下ろし視点で見たような感じになります。

モデルの初期化 - initializeModel関数

続いて、モデルの生成と各種設定を行うinitializeModel関数です。

最初の newModel 関数で、格子メッシュの頂点配列から、モデルを生成しています。QUADRANGLE_GRIDという引数は、Graphics3Dライブラリに定義された定数で、頂点配列が四角形格子メッシュ形式である事を指定します。

続いて、色設定やカリング(描画省略)設定、フィル(塗りつぶし)設定などを行っています。

頂点配列の初期化 - setGaussianWave関数

初期化処理の最後にコールされていたのが、setGaussianWave関数です。

この関数は、頂点配列の座標値を、メッシュ中心からの距離を用いたガウス波束で初期設定する内容となっています。

ガウス波束とは、断面がガウス関数:

\( f(x) = \exp{ (x-m)^2 / 2 \sigma^2 } \)

となる波束で、滑らかな山のような形をしています。上式で m は山のピークの位置に一致し、σは山のおおまかな幅に一致します。

今回は、このガウス関数に、メッシュ中心からの2次元的な距離を用いる事で、円形の山の形を作っています。

更新処理を行う onUpdate関数

初期化処理は以上です。続いていよいよ、力学計算による変形などを行う、更新処理の内容を見ていきましょう。

更新処理の大まかな流れは、onUpdate関数に実装しています。

この関数は、プログラム開始から終了するまでの間、一秒間に数十回(設定可能)の割合、フレームワークから繰り返し呼ば続けるという仕組みになっています。画面更新タイミングの間に呼ばれるため、ここでモデルを少しずつ変形させる事で、アニメーションの原理で画面を滑らかに動かす事ができるというわけです。

onUpdate関数の内容は、以下のようになっています。

先頭では、単位面積あたりの質量密度 DENSITY から、質点1個あたりの質量 m を求めています。グローバルに置いても良いのですが、大した計算コストでも無いので可読性優先でローカルに求めています。

その下は for (int cycle=0; cycle< UPDATE_PER_FRAME; cycle++) というループで囲われています。これにより、update関数の中身を、一回コールあたり複数回実行するような形になっています。 update関数は1フレーム(画面更新)ごとに呼ばれるため、これはつまるところ、 画面を一枚描くごとに、複数回の力学演算を行う という事になります。これは、シミュレーションの大体の進行速度を調整するためです。

ループ内では、題材解説で詳しく述べたアルゴリズム通り、質点にかかる力を計算し、そして数値積分によって質点の速度と位置座標を計算しています。

最後に、setModelVertex 関数で、新しい位置座標が格納されている頂点配列を、モデルに再設定しています。これでモデルが少し変形します。

ここまでが、更新処理の大まかな流れになっています。

隣接質点から受ける力の計算 - getForce関数

それでは、具体的に更新処理の詳細な処理内容を見ていきましょう。

まずは質点が、それに隣接する1個の質点から受ける力を求める、getForce関数です。

ここで関数の型宣言部が「 macro 」となっていますが、これはマクロ関数である事を意味します。マクロ関数では、プログラムの読み込み時に、その内容がコール部分にインライン展開されます。これにより、関数コールのオーバーヘッドを回避する事が可能です。

つまりは、マクロ関数の方が、通常の関数よりもコールが軽いという事になります。しかし、エラーメッセージが分かり辛くなる事や、一行の処理しか記述できないなどのデメリットもあります。

今回、このgetForce関数は、後述するupdateForce系 関数内において、2重のforループの中でコールされるので、オーバーヘッドはかなり効いてきます。そのため、デメリットを考慮した上で使用しています。

全質点にかかる力を計算(固定端) - updateForceFixedEnd関数

続いて、上述のgetForce関数を使用し、全質点にかかる力を計算する処理です。

これには固定端と自由端の2通りを実装していますが、まずは簡単な固定端を扱うupdateForceFixedEnd関数を見てみましょう。

この通り、端(辺上)を除く全ての質点について、前後左右で4個の質点とのバネから受ける力を合計し、それに減衰力を加えて求めています。

固定端では力は常に 0(初期値)であるため、端(辺上)の質点については何もしていません。

この通り、固定端だとシンプルな処理になります。

全質点にかかる力を計算(自由端) - updateForceFreeEnd関数

今度は、自由端を扱うupdateForceFreeEnd関数を見てみましょう。今度は少し複雑です。

この通り、前後左右の力の和を取っていく過程で、if による分岐が追加されています。そして、for ループも、端(辺上)の点を含むものになっています。

この処理では、端(辺上)を含むあらゆる質点についてなぞっていき、毎回、その位置の前後左右にバネがあるか(端かどうか)を分岐で判定しています。

分岐によって、その方向にバネがあると分かれば、そのバネから受ける力を加算しています。これにより、端では自然と3個(返上)または2個(カド)のバネから受ける力のみが合計されるようになり、自由端の処理が実現できます。

詳しいVCSSLのプログラミングガイド(無料)はこちらへ!

上記のコードはプログラミング言語VCSSLで記述されており、VCSSLのプログラミングガイドは下記で無料公開しています。 上記のコードを改造したい方や、新しいコードを書いてみたい方はぜひご活用ください!

ブラウザで読めるWeb版だけでなく、PDF版も無料で配布しています!

スタートアップガイド( プログラミングがはじめての方向け )
プログラミングの入門書に相当する内容です。プログラミングが初めての方はこちらがおすすめです。
即席ガイド( C系言語ユーザー向け )
C言語や C++ などのC系の言語を扱われている方が、即席でVCSSLを扱うための簡易ガイドです。
文法ガイド
VCSSLの文法や基本的な機能を淡々とまとめた、リファレンスマニュアル的な位置づけのガイドです。
GUI開発ガイド
ボタンや入力項目などのGUI部品が並ぶ、画面を備えたVCSSLプログラムを開発するためのガイドです。
2DCG開発ガイド
画面上や画像ファイルなどに、2次元的な描画を行うVCSSLプログラムを開発するためのガイドです。
3DCG開発ガイド
画面上や画像ファイルなどに、3次元的な描画を行うVCSSLプログラムを開発するためのガイドです。
標準ライブラリ 仕様書
コード内で呼び出される関数は、大半が標準ライブラリのものです。その詳細仕様を掲載しています。

ライセンス

このVCSSLコード( 拡張子が「.vcssl」のファイル )は実質的な著作権フリー(パブリックドメイン) である CC0 の状態で公開しています。 そのままでのご利用はもちろん、言語の種類を問わず、改造や流用などもご自由に行ってください。

※ ただし、このVCSSLコードの配布フォルダ内には、ダウンロード後すぐに実行できるように、 VCSSLの実行環境も同梱されており、そのライセンス文書は「 License 」フォルダ内に同梱されています (要約すると、商用・非商用問わず自由に使用できますが、使用の結果に対して開発元は一切の責任を負いません、といった具合の内容です)。 配布フォルダ内の各構成物の一覧やライセンスについては「 ReadMe_使用方法_必ずお読みください.txt 」をご参照ください。

この記事中の商標などについて

  • OracleとJavaは、Oracle Corporation 及びその子会社、関連会社の米国及びその他の国における登録商標です。文中の社名、商品名等は各社の商標または登録商標である場合があります。
  • Windows は、米国 Microsoft Corporation の米国およびその他の国における登録商標です。この記事は独立著作物であり、Microsoft Corporation と関連のある、もしくはスポンサーを受けるものではありません。
  • Linux は、Linus Torvalds 氏の米国およびその他の国における商標または登録商標です。
  • その他、文中に使用されている商標は、その商標を保持する各社の各国における商標または登録商標です。

[ 前へ | 目次 | 次へ ]
波の干渉(面上の円形波)のアニメーション表示

面上の円形波が干渉する様子を、パラメータを操作しながらアニメーションで見られるプログラムです。
円形波のアニメーション表示

振幅・波長・周期をスライダ―で操作しながら、円形波のグラフをアニメーションで見られるプログラムです。
波の干渉(線上の正弦波)のアニメーション表示

線上(1次元の)の正弦波が干渉する様子を、パラメータを操作しながらアニメーションで見られるプログラムです。
正弦波のアニメーション表示

振幅・波長・周期をスライダ―で操作しながら、正弦波のグラフをアニメーションで見られるプログラムです。
凹レンズを通過する波のシミュレーション

凹レンズ形状の高密度媒質を通過する、波のシミュレーションです。
凸レンズを通過する波のシミュレーション

凸レンズ形状の高密度媒質を通過する、波のシミュレーションです。
乱雑な密度分布における波のシミュレーション

密度分布が乱雑な媒質中における、波の伝播のシミュレーションです。
ローレンツアトラクタ(ファイル出力版)

4次精度ルンゲ=クッタ法により、ローレンツアトラクタを求めるプログラムです。
波の屈折のシミュレーション

密度の異なる領域を、波が屈折しながら通過するシミュレーションです。
力学アルゴリズムによる波のシミュレーション(面上の波)

媒質をバネと格子点で近似し、力学的なアルゴリズムで動かす事による、波のシミュレーションです。
手動で波を発生させるシミュレーション

スライダーをマウスで動かす事により、波を発生させるシミュレーションです。
力学アルゴリズムによる波のシミュレーション(線上の波)

媒質をバネと格子点で近似し、力学的なアルゴリズムで動かす事による、波のシミュレーションです。
二重振り子のシミュレーション

ラグランジュ方程式を用いた、二重振り子のシミュレーションです。
ローレンツアトラクタ(GUI版)

4次精度ルンゲ=クッタ法により、ローレンツアトラクタを求めるプログラムです。
この階層の目次
[ 前へ | 目次 | 次へ ]
お知らせ

Vnanoの公式サイトがオープン、チュートリアルやAPI仕様書等も掲載
2019年08月07日 - オープンソースのアプリケーション組み込み用スクリプトエンジン「 Vnano 」の公式サイトを開設しました。チュートリアルや、スクリプトエンジンのAPI仕様書などが参照できます。その概要をお知らせします。

リニアングラフ3D/2Dが連番ファイルのアニメーションに標準で対応
2019年07月17日 - リニアングラフ3D/2Dでは、7月17日公開の最新版より、連番ファイルを連続的に読み込みながらアニメーション描画するプログラムを同梱し、メニューから標準で使用可能になりました。その概要をお知らせします。

Vnanoのスクリプトエンジンアーキテクチャ解説2: コンパイラ
2019年07月03日 - オープンソースで開発中のスクリプトエンジン「 Vnano 」のアーキテクチャを解説する連載の第2回です。今回は、スクリプトを中間コードへと変換する、コンパイラ部分の内部をクローズアップして解説します。

新着
[公式ガイドサンプル] ユーザーのGUI操作に対して処理を行う

「VCSSL GUI開発ガイド」内のサンプルコードです。ユーザーがGUIを操作した際に行う処理を実装します。
2019年07月28日
[公式ガイドサンプル] 各種GUIコンポーネントを画面上に配置する

「VCSSL GUI開発ガイド」内のサンプルコードです。色々な種類のGUI部品を画面上に配置します。
2019年07月28日
連番ファイルから3Dグラフをアニメーション描画するツール

フォルダ内の連番データファイルを読み込み、3Dグラフを高速で連続描画して、アニメーションさせるツールです。グラフを連番の画像ファイルに保存する事もできます。
2019年06月03日
連番ファイルから2Dグラフをアニメーション描画するツール

フォルダ内の連番データファイルを読み込み、2Dグラフを高速で連続描画して、アニメーションさせるツールです。グラフを連番の画像ファイルに保存する事もできます。
2019年05月24日
[公式ガイドサンプル] 立体モデルを生成して3D空間に配置する

「VCSSL 3DCG開発ガイド」内のサンプルコードです。立体モデルを生成し、3D空間に配置します。
2019年05月21日
開発元Twitterアカウント