久しぶりのブログ更新です。 それ以来、私は V で注目に値するほど良くなり、それが構築用の唯一のプログラミング言語に変化するのを見てきました.NodeJS から Vweb へのリンク短縮サービスからバックエンドを書き直して改善するレベルまで. 作成者は、私のプロジェクトの賢明な 1 つについてさえツイートしました!
ありがとうございます! Twitterリンク
私はそれをステップアップして取るよりも早く小さなシミュレーションを完了しましたソフトボディシミュレーションについて。 私は 加圧スプリング マス モデルを実行しました。バルーン。 内側に空気が入った変形可能な外側で、ボールを加圧して球状に保ちます。 これらの部品をシミュレートするには、2 つの同一の時代遅れの物理法則を採用する必要があります。 これらは、フックの法則と完全ガソリンの法則です。 私はそれらのファンダメンタルズをスライドするつもりはありません.理想的なスキームは私のシミュレーションで利用されており、アルゴリズムはそれを丸めています.
より早くフックの法則に集中できるようになり、バネと頂点のデータ構造を覆い隠すことができました.
速度 Vec // 速度ガジェット/秒 力 Vec // ガジェットの強制
質量 f64 = 1.0
頂点量のない非常に小さなレベルですが、質量が含まれています。 それはシミュレーションの最高の部分であり、非常に多くのことを意味するために、公平で静かであることさえあります。 それを住居内の単一のネットサイトとして逸話として取り上げる、それが私たちのシミュレーションの段階です.
struct 春 { mut: あ & バーテックス // への参照
b &バーテックス / / 2 つの拘束頂点 長さ f64 // 余暇の長さ こわばり f64 //交流への抵抗 ダンピング f64 // エネルギー不足、減衰 }
ばねは、フックの法則によって支配されるばねの力によって集合的に 2 つの頂点を拘束します。 これには、静止長、剛性 (または交換に対する抵抗)、および減衰力が含まれます。 スプリングは、必要に応じて 2 つのエンドポイントに力を永続的に適用して、それらを静止長にします
構造体 ベク{ mut ): x f64 や f64 } // 2D ベクトル, passe to // 指示または位置を示す
フックの法則は物理法則であり、バネを伸ばしたり縮めたりする主な力は直線的に変化するというものです。その距離に感心して – ウィキペディア
緑=安静時の長さ、深紅色=長さを超えて伸ばされた状態.
長さの差 :=vertex_A.net サイト.distance_to
(vertex_B.net サイト) – spring.length // エンドポイントの距離とスプリングの違い静止長 力 :=長さの差
* ばね剛性 // 両方のエンドポイントに使用される最大の力 (スカラー インプリント) direction_to_A_from_B := (vertex_A.net サイト – vertex_B.net サイト).normalize() direction_to_B_from_A := (vertex_B.net サイト – vertex_A.net サイト).正規化() // 長さ 1 のベクトル velocity_difference ):= vertex_A.velocity - vertex_B.velocity base_dot := direction_to_A_from_B. dot(velocity_difference)
力 +=ドット *
spring.damping // 内積から減衰力を計算し、それを次の力に追加します 頂点A.力 +=direction_to_B_from_A * 力 vertex_B.force +=direction_to_A_from_B * 力 // 各エンドポイントの最終ばね力
ファーストプライスガソリン法は、同じ時代遅れのガソリン方程式と呼ばれ続けており、仮想のファーストプライスの開示方程式です。ガソリン。 多くの場合、多くの障壁がありますが、これは多くのガスの習性を見事に近似したものです。 – ウィキペディア
気体の流体は応力と量が本質的に結びついており、これをガソリン第一価格法則と呼んでいます.
- P=応力
V=ボリューム
R=賢く好きなガソリン固定
オブジェクトの量が減るので、ストレスが増えます.
この通知のためにお持ち帰りすることにしました
nRT 方程式からそれをさらに単純化し、再構築できるようにします。 これは、アルゴリズム内で単一の固定として表されます。
nrt =1.0 * 8.3144621 * 293.15 // 1.0 モルの物質、293.15 ケルビン (室温、20°C)
ストレスシステム(下)では、おそらくこれを最終的な式の最初の価格のガソリン法則と混合することもできます.
P=F/A
上記のシステムを採用してください場合によっては、理想的な形状のセットアップとボリュームから地面に作用する力を計算することもできます.
- F=A nRT / V
シミュレート()
これが私のシミュレーションの基礎です
マイルは 2D シミュレーションです。オブジェクトの量をその住居に置き換え、顔の住居を長さに置き換えます。 ただし、システムはほとんど変更されていません.
まず、すべてのスプリングをループし、2 つの頂点を取得してそれらの間の長さを計算し、
を掛けます。 nRT 固定。 右 次に、エッジの同一の古いベクトルによって外側に押し出す力を発生させるために、居住しているソフトボディの合計で割った値です。const nrt =1.0 * 8.3144621 * 293.15 )shape_area := ソフトボディ.住居() for i, mut 春 in softbody.sp リング { 長さ :=spring.vertex_A.net サイト.距離 (spring.vertex_B.net サイト) force_float :=(長さ * nrt) / 形状領域 // 同一の古いベクトルを計算します // このフェーズはかなり長引くので省略しました spring.vertex_A.force +=spring_normal_vector * svec(force_float) spring.vertex_B.force += spring_normal_vector * svec(force_float) } // エッジごとに応力を計算
次のように達成された任意の 2D ポリゴン上の合計住居を計算します。 基本的に、すべての頂点の球状の非友好的な積を合計します。 特筆すべきは、三角測量より賢い
fn (c SoftBodyCircle) 住居 () f64 { mut 住居 :=
0.0
ために 私 in 0..c.vertices.len { i_next := (i
+
1) % c.vertices.len 住居 +=c.頂点.net site.y *
c.vertices[i_next].net site.x – c.頂点 .net site.x * c.vertices[i_next].net site.y } 戻る 住居 * –0.5 }
n=0.4 と n=3.5 それぞれ
このボールは弾けませんが、物質の量を増やすと円周に大きな力がかかります。 応力ベクトルは深紅色のひずみで視覚化され、ばねの応力は緑 (余暇の長さ) から赤 (伸ばされた長さ) にスライドします。
この係数の位置を 0.4 にすると、余分なタックルを感じます。半分膨らんだ空気の袋で、時間の経過とともにかかるストレスははるかに少なくなりますが、最初のタッチダウンの期間中は大きな力がかかりました。 最初の転倒の間、n=3.5 の場合、どのように力が緊張し、リラックスした体格がどのように拡大するかを観察してください。 量が増えれば力が減り、逆もまた然りなのでさすがに! 重力は下向きの一定の加速度であり、毎秒 2 乗あたり -9.8 メートルです。 ニュートンの第二法則は、これのために一度作られたものに変わりました.
重力 = Vec{0,–
9.8} fn (mut v 頂点) 重力() { v.force += 重力 * v.mass }
サークル。 ネットサイト以外の至高の特徴とは? 半径です。 では、そこにあるさまざまなエントリは何ですか? 悲しいことに、コンピューターは円に完全に近似することができます。私たちは、コンピューターを焼き尽くすことなく完全にフェッチすることができます.
変数は、近似円に含まれる頂点の数の概要を示します。 ソフトボディを再現するための種類のコンストラクタなので、これを使用します.
ProceduralCircle { mut: ネットサイト Vec 半径 )f64 サンプル int }
ある角度から円の角度をサンプリングすることは、次の場合には慎重に行います。 三角法の期間中、注意を払っていたことがわかります。 単純に単位円を例にとると
cos θ=x, sin θ=y
c.samples * 2.0 * math.pi // ラジアンに変換 // 検索しているレベルのインデックスから角度を取得しますadmiを取得する へのセッション ) 戻る ベク{ c.radius * 数学。 cos(角度), c.radius * math.sin(角度) } + c.net サイト }
はサンプルレベル機能の採用円のすべての位置を選択する場合は、偶然にも (いくつかの追加の値を使用して)、それらを頂点に変換し、それぞれをバネで結合します.
サンプル: 20 }.make_real
( 10, 200.0, 1.0 ) //質量、剛性、減衰
make_real() プロシージャル サークルをシミュレートされたソフトボディに作り直す機能はかなり長くなりますが、理想的なデータ構造は 1 つのデータ構造から他のすべてのデータ構造に変換され、あまり洗練されていません.
衝突のいくつかの構成を生成するために得られる可能性が高いものがあるので、最も簡単なものを慎重に選択します。 度と無限に延長された線の間の衝突。 これを試すには、最初にレベルがラインのどの側面にあるのかを知りたいと思います。衝突している側面が何マイルもある場合は、ラインの最も近いレベルに転送し、その速度を覚えておいてください。
(これが、混合ステップの後に達成される理由です).
struct ライン { mut: ネットサイトVec
) // ラインに触れるレベル コース Vec // ラインのコース で行きます ブール // 衝突アスペクト )}
集中しない衝突レベルからライン上で最も近いレベルを取得する、2 番目のステップと適度に同一であるため、アスペクト チェック。
fn (l Line ) get_closest(vec Vec)Vec { v :=vec – l.net サイト d :=v.dot(l.course) )return l.net サイト + l.コース *d }
ライン上で最も近いレベルを検索するには、strains net サイトにコースを取得し、内積を計算して、ラインに沿った射影ベクトル長を取得します。 次に、その長さにストレイン コースと正味のサイトを掛けた値を使用して、線上にある居住地の程度を計算します。 これは、住居内の任意のレベルが、それ自体、ひずみネット サイト、およびライン上の最も近いレベルの間に正しい角度の三角形を作るため、常に機能します。
統合ステップは、忠実な物理シミュレーション。 これは、フレームのライフサイクル、環境速度、および位置の採用を通じて収集された力を適用します。
速度がネットサイトの置換を表し、デルタ時間がネットサイトの置換を表す方法に簡単に取り組みます。時間。 フレームレートが毎秒60フレームに決まっているからです。 シミュレーションは、おそらく 1 秒あたり 60 ケース計算される可能性が高く、これは、1/60 秒の境界の持続時間についてシミュレートする必要があることを意味します.
オイラー積分にもかかわらずはたくさんの選択肢の中で最も不正確ですが、この採用には最適です
const デルタ =
バーテックス
) ミックス() { v.速度+= v.force * デルタ / v.質量 v.net サイト +=v.速度 * デルタ } 私は、シミュレーションに触れている輝かしい量のトピックについて詳しく説明しました。それは、あなたが考えたことの小さな要約です.
ソフトボディ.simulate() // 内部力をシミュレートします // – ばね力 // – 応力ダイナミクス // – 重力 ソフトボディ. )mix() // オイラー積分 // シミュレーションに混ぜて、 ) // – 速度 // – ネットサイト softbody.line_collide (ライン) // 線 との衝突をテストして対処する ソフトボディ。 与える() // ベール オン ベール/ターミナル
準備()まさにここで、すべての頂点のすべての力ベクトルをリセットします。 ここにあるのは、力のベクトルがフレームの寿命にわたって収集され、体格に影響を与えるあらゆる小さなものが追加されているためです.
ミックス()
- 当分の間蓄積された力が作用し、それぞれの速度が変化しますおよびすべてのタイムステップ/フレーム
トレイルが決定され、すべての頂点のネット サイトが変更されます。 このステップの後、力ベクトルは使用されません
line_collide ()
- 与える()
- 端末内のシーンのイラストを叫びます。 ターミナルにはエビの解像度があり、非常に注目に値するものは、おそらくここに表示される可能性があります. 小数位は整数に丸められ、きらめくピクセルは網掛けされます。
端末は、シミュレーションに明確な座標系を使用します。 シミュレーションでは、ベールの中心に原点が保持されますが、端末座標は頭の左側に原点が得られます。 これは逸話に変換する必要があります.
0.4、1.0、および3.5 それぞれ
2 つのひずみが斜めに衝突します。
それは、最低限の説明としてあなたが期待していた壮観なフェッチではありませんが、それでも私があなたに何かを教えてくれたことを願っています. 実際、これがすべてを終わらせる私の目的です。 私はこのプロジェクトに参加しましたが、このレベルの物理シミュレーションについてはそれほど注目に値するものではありませんが、2 日と多くのタブの後、それは達成されることさえあります。 これは実際にはすべての小さなことに当てはまります。 大学の理想は1回おきに取り上げられたので、私が取り組むほど注目に値する時間はありませんでした. 後で追加のシミュレーションに取り組みたいと思っていますが、流体シミュレーションに取り組みます。 これが実はストレスフリーな企画に変わったのです! 肉感オファーコード