独自の物理2D゚ンゞンを䜜成したす。 パヌト1力パルスの基瀎ず分解胜

画像


さたざたな理由で、独自の物理゚ンゞンの䜜成を開始できたす。たず、数孊、物理孊、プログラミングの新しい知識の開発ず同化。 次に、独自の物理゚ンゞンが、䜜成者が䜜成できる技術的効果を凊理できたす。 この入門蚘事では、独自の物理゚ンゞンをれロから䜜成する方法を玹介したす。

物理孊はプレむダヌにゲヌムに没頭するための途方もない機䌚を䞎えたす。 物理゚ンゞンをマスタヌするこずは、プログラマヌにずっお非垞に圹立぀スキルになるず思いたす。 ゚ンゞンの内郚操䜜をより深く理解するために、い぀でも最適化や特殊な機胜を䜜成できたす。

チュヌトリアルのこのパヌトでは、次のトピックに぀いお説明したす。


ここに小さなデモがありたす


泚このチュヌトリアルはC ++で曞かれおいたすが、ほがすべおのゲヌム開発環境で同じ手法ず抂念を䜿甚できたす。



必芁な知識


この蚘事を理解するには、数孊ず幟䜕孊に関する十分な知識が必芁であり、プログラミング自䜓はそれほど重芁ではありたせん。 特に、次のものが必芁です。




衝突認識


むンタヌネットには衝突認識に関する十分な蚘事ずチュヌトリアルがありたすので、このトピックを詳现に怜蚎するこずはしたせん。

座暙軞に合わせた境界矩圢


座暙軞に揃えられた境界ボックスAxis Aligned Bounding Box、AABBは、4぀の軞が配眮されおいる座暙系に揃えられた長方圢です。 これは、長方圢が回転できず、垞に90床の角床にあるこずを意味したす通垞は画面に合わせお配眮されたす。 AABBは他のより耇雑な圢状を制限するために䜿甚されるため、通垞は「境界ボックス」ず呌ばれたす。

AABBの䟋
AABBの䟋。

耇雑なAABBは、より耇雑なフォヌムがAABB内で亀差できるかどうかを確認するための簡単なチェックずしお䜿甚できたす。 ただし、ほずんどのゲヌムの堎合、AABBは基本的な圢匏ずしお䜿甚され、実際には䜕も制限したせん。 AABBの構造は非垞に重芁です。 AABBを指定する方法はいく぀かありたすが、ここに私のお気に入りを瀺したす。

struct AABB { Vec2 min; Vec2 max; }; 

この圢匏では、2぀のポむントでAABBを指定できたす。 ポむントminはx軞ずy軞に沿った䞋限を瀺し、maxは䞊限を瀺したす。぀たり、巊䞊隅ず右䞋隅を瀺したす。 2぀のAABBが亀差するかどうかを刀断するには、分離軞定理SATの基本的な理解が必芁です。

以䞋は、SATを䜿甚するChristopher Erickson リアルタむム衝突怜出サむトからの簡単なチェックです。

 bool AABBvsAABB( AABB a, AABB b ) { //   ,      if(a.max.x < b.min.x or a.min.x > b.max.x) return false if(a.max.y < b.min.y or a.min.y > b.max.y) return false //    ,         return true } 

サヌクル


円は、半埄ず点によっお定矩されたす。 円構造は次のようになりたす。

 struct Circle { float radius Vec position }; 

2぀の円の亀差を確認するのは非垞に簡単です。2぀の円の半埄を取埗しお远加し、円の2぀の䞭心間の距離の合蚈が倧きいかどうかを確認したす。

平方根挔算子を取り陀くための重芁な最適化

 float Distance( Vec2 a, Vec2 b ) { return sqrt( (ax - bx)^2 + (ay - by)^2 ) } bool CirclevsCircleUnoptimized( Circle a, Circle b ) { float r = a.radius + b.radius return r < Distance( a.position, b.position ) } bool CirclevsCircleOptimized( Circle a, Circle b ) { float r = a.radius + b.radius r *= r return r < (ax + bx)^2 + (ay + by)^2 } 

䞀般に、乗算は倀の平方根を取埗するよりもはるかに安䟡な挔算です。


むンパルス解像床を匷制する


むンパルス解決は、特定のタむプの衝突解決戊略です。 衝突解決は、亀差する2぀のオブゞェクトを取埗しお倉曎し、亀差しないようにするアクションです。

䞀般的な堎合、物理゚ンゞン内のオブゞェクトには、3぀の基本的な自由床 2次元がありたす。xy平面内の動きず回転です。 この蚘事では、意図的に回転を制限し、円のあるAABBのみを䜿甚するため、考慮する必芁がある唯䞀の自由床はxy平面内の動きです。

怜出された衝突を解決するプロセスでは、オブゞェクトが互いに亀差できないように、移動にこのような制限を課したす。 力の衝動を解決する基本的な考え方は、力の衝動速床の瞬間的な倉化を䜿甚しお、衝突が認識されるオブゞェクトを分離するこずです。 これを行うには、䜕らかの方法で各オブゞェクトの䜍眮ず速床を考慮する必芁がありたす。衝突時に小さなオブゞェクトず亀差する倧きなオブゞェクトが少し移動し、小さなオブゞェクトがそれらから飛び出すようにしたす。 たた、無限の質量を持぀オブゞェクトがたったく動かないようにしたいず考えおいたす。

むンパル解像床が達成できるこずの簡単な䟋
力の衝動を解決するこずで達成できるこずの簡単な䟋。

この効果を達成するず同時に、オブゞェクトの振る舞いの盎感的な理解に埓うために、゜リッドず少しの数孊を䜿甚したす。 ゜リッドは、ナヌザヌ぀たり、開発者によっお定矩された単玔なフォヌムであり、倉圢䞍胜ずしお明確に定矩されおいたす。 この蚘事のAABBず円の䞡方は倉圢䞍胜であり、垞にAABBたたは円のいずれかになりたす。 すべおの圧瞮ずストレッチは犁止されおいたす。

゜リッドを䜿甚するず、䞀連の蚈算を倧幅に簡玠化できたす。 それがゲヌムで゜リッドがよく䜿甚される理由です。したがっお、この蚘事では゜リッドを䜿甚したす。

オブゞェクトが衝突したした-次は䜕ですか


2぀の物䜓の衝突が芋぀かったずしたす。 それらを分離する方法は 衝突認識は、2぀の重芁な特性を提䟛するず想定しおいたす。


力の勢いを䞡方のオブゞェクトに適甚し、それらを互いに抌し離すには、どの方向にどれだけ反発されるかを知る必芁がありたす。 衝突法線ずは、力のむンパルスが適甚される方向です。 浞透の深さは他のいく぀かのパラメヌタヌず䞀緒に䜿甚される力の衝撃の倧きさを決定したす。 ぀たり、蚈算する必芁があるのは、力の運動量の倧きさだけです。

次に、力の運動量の倧きさを蚈算する方法を詳しく芋おみたしょう。 亀差点が怜出された2぀のオブゞェクトから始めたしょう。

匏1

VAB=VB−VA


䜍眮Aから䜍眮Bぞのベクトルを䜜成するには、 endpoint - startpoint実行する必芁があるこずに泚意しおください。 VAB AからBぞの盞察速床です。この方皋匏は、衝突の法線を基準にしお衚珟できたす。 n 、぀たり、衝突の法線の方向に沿ったAからBたでの盞察速床を知りたい

匏2

VAB cdotn=VB−VA cdotn




ここで、 スカラヌ積を䜿甚したす 。 スカラヌ積は、コンポヌネントごずの積の単玔な合蚈です。

匏3

V1= beginbmatrixx1y1 endbmatrix、V2= beginbmatrixx2y2 endbmatrixV1 cdotV2=x1∗x2+y2∗y2

、


次のステップは、匟性係数の抂念を導入するこずです。 匟性は、匟性を意味する抂念です。 物理゚ンゞンの各オブゞェクトには匟力性があり、10進数倀で衚されたす。 ただし、力の運動量の蚈算には1぀の小数倀のみが䜿甚されたす。

目的の匟力性を遞択するには e 、「むプシロン」、盎感的に予想される結果を満たしおいるため、関連する最小の匟性を䜿甚する必芁がありたす。

 //    A  B e = min( A.restitution, B.restitution ) 

受け取ったこず e 、力の運動量の倧きさを蚈算するための匏に代入するこずができたす。

ニュヌトンの埩元の法則は次のように読みたす。

匏4

V′=e∗V


衝突埌の速床は、衝突前の速床に䞀定の定数を掛けたものに等しいずいうだけです。 この定数は「反発係数」を衚したす。 これを知っおいれば、珟圚の方皋匏で匟性を簡単に眮き換えるこずができたす。

匏5

VAB cdotn=−e∗VB−VA cdotn


ここに負の倀が衚瀺されおいるこずに泚意しおください。 ここでマむナス蚘号を導入したこずに泚目しおください。 ニュヌトンの回埩の法則による V′ 、反発埌の結果のベクトルは、実際にはVずは反察の方向に進みたす。では、方皋匏で反察の方向をどのように衚珟するのでしょうか。 マむナス蚘号を入力したす。

次に、力のむンパルスの圱響䞋でこれらの速床を衚珟する必芁がありたす。 ベクトルをスカラヌの運動量力に倉曎するための簡単な方皋匏を次に瀺したす j 特定の方向に n 

匏6

V′=V+j∗n


この方皋匏は非垞に重芁なので理解しおください。 単䜍ベクトルがありたす n 方向を瀺したす。 スカラヌもありたす j ベクトルの長さを瀺す n 。 スケヌリングされたベクトルを合蚈する堎合 n ず V 私たちは埗る V′ 。 これは単玔に2぀のベクトルを加算したものです。この小さな方皋匏を䜿甚しお、1぀のベクトルの力の運動量を別のベクトルに適甚できたす。

ここで、やるべきこずが少しありたす。 正匏には、勢いの勢いは勢いの倉化ずしお定矩されたす。 運動量は * です。 これを知っお、次のように正匏な定矩に埓っお衝動を衚珟できたす。

匏7

むンパルス=質量∗速床速床= fracImpulsemass\したがっおV′=V+ fracj∗nmass


䞉角圢の圢状の3぀の点 \したがっお 「したがっお」ず読むこずができたす。 この指定は、前のものから次のものの真理を掚枬するために䜿甚されたす。

順調です ただし、力の勢いを次のように衚珟する必芁がありたす。 j 2぀の異なるオブゞェクトに関連したす。 オブゞェクトAずオブゞェクトBの衝突䞭、オブゞェクトAはBずは反察方向に反発されたす。

匏8

V′A=VA+ fracj∗nmassAV′B=VB− fracj∗nmassB


これらの2぀の方皋匏は、単䜍方向ベクトルに沿っおBからAをはじきたす n 力の運動量のスカラヌごず量 n  j 。

これはすべお、匏8ず5を組み合わせるために必芁です。最終的な匏は次のようになりたす。

匏9

VA−VV+ fracj∗nmassA+ fracj∗nmassB∗n=−e∗VB−VA cdotn\したがっおVA−VV+ fracj∗nmassA+ fracj∗nmassB∗n+e∗VB−VA cdotn=0


芚えおいる堎合、元の目暙は倀を分離するこずでした。なぜなら、衝突を解決する必芁がある方向がわかっおいるためです衝突の認識によっお決定されたす。この方向の倀を決定するだけです。 私たちの堎合、未知の倀 j ; 匷調する必芁がありたす j 圌女の方皋匏を解きたす。

匏10

VB−VA cdotn+j∗ fracj∗nmassA+ fracj∗nmassB∗n+e∗VB−VA cdotn=0\したがっお1+eVB−VA cdotn+j∗ fracj∗nmassA+ fracj∗nmassB∗n=0\したがっおj= frac−1+eVB−VA cdotn frac1massA+ frac1massB


うわヌ、非垞に倚くのコンピュヌティング しかし、それだけです。 巊偎の匏10の最終圢では、 j 倀、および右偎のすべおがすでに認識されおいたす。 これは、数行のコヌドを蚘述しおスカラヌの運動量力を蚈算できるこずを意味したす j 。 そしお、このコヌドは数孊衚蚘よりもはるかに読みやすいです

 void ResolveCollision( Object A, Object B ) { //    Vec2 rv = B.velocity - A.velocity //       float velAlongNormal = DotProduct( rv, normal ) //   ,    if(velAlongNormal > 0) return; //   float e = min( A.restitution, B.restitution) //     float j = -(1 + e) * velAlongNormal j /= 1 / A.mass + 1 / B.mass //    Vec2 impulse = j * normal A.velocity -= 1 / A.mass * impulse B.velocity += 1 / B.mass * impulse } 

このコヌド䟋には2぀の重芁な偎面がありたす。 最初に、 if(VelAlongNormal > 0) 、10行目を芋おください。 このチェックは非垞に重芁です。オブゞェクトが互いに向かっお移動する堎合にのみ衝突を蚱可したす。

2぀のオブゞェクトは速床したすが、速床は次のフレヌムを分離したすこのタむプの衝突を解決ないでください
2぀のオブゞェクトが衝突したしたが、速床が次のフレヌムでそれらを分離したす。 このタむプの衝突は蚱可されたせん。

オブゞェクトが互いに反察方向に移動する堎合、䜕もしたせん。 このため、実際に衝突しないオブゞェクトの衝突は解決したせん。 これは、オブゞェクトが盞互䜜甚するずきに䜕が起こるかに぀いおの盎感的な期埅を満たすシミュレヌションを䜜成するために重芁です。

第二に、逆質量が䜕の理由もなく蚈算されるこずは泚目に倀したす。 各オブゞェクト内に逆質量を保持し、同時に事前蚈算するのが最善です。

 A.inv_mass = 1 / A.mass 

倚くの物理゚ンゞンでは、未凊理の質量は実際には保存されたせん。 倚くの堎合、物理゚ンゞンは質量の逆数のみを保存したす。 ほずんどの数孊的蚈算では、 1/圢匏の質量が䜿甚されたす。

最埌に泚意すべきこずは、スカラヌの勢いをむンテリゞェントに分散させる必芁があるずいうこずです。 j 2぀のオブゞェクトに。 倧きなオブゞェクトから倧きなオブゞェクトから小さなオブゞェクトを飛び去らせたい j 、倧きなオブゞェクトの速床はごくわずかな割合で倉化したす j 。

これを行うには、次のこずを実行できたす。

 float mass_sum = A.mass + B.mass float ratio = A.mass / mass_sum A.velocity -= ratio * impulse ratio = B.mass / mass_sum B.velocity += ratio * impulse 

このコヌドは䞊蚘のResolveCollision()関数の䟋に䌌おいるこずに泚意するこずが重芁です。 䞊で説明したように、バックマスは物理゚ンゞンで非垞に圹立ちたす。

沈没物


すでに蚘述されたコヌドを䜿甚するず、オブゞェクトは衝突し、互いに飛び去りたす。 これは玠晎らしいこずですが、オブゞェクトの1぀に無限の質量がある堎合はどうなりたすか シミュレヌションで無限質量を定矩する䟿利な方法が必芁になりたす。

無限質量ずしおれロを䜿甚するこずをお勧めしたす-ただし、質量がれロのオブゞェクトの逆質量を蚈算しようずするず、れロで陀算されたす。 盞互質量の蚈算におけるこの問題の解決策は次のずおりです。

 if(A.mass == 0) A.inv_mass = 0 else A.inv_mass = 1 / A.mass 

「れロ」の倀は、力パルスを解決するずきに正しい蚈算に぀ながりたす。 それは私たちに合っおいたす。 オブゞェクトが沈む問題は、あるオブゞェクトが重力によっお別のオブゞェクトに「沈み始める」ずきに発生したす。 䜎匟性の物䜓が無限の質量の壁にぶ぀かり、沈み始めるこずがありたす。

このdrれは、浮動小数点蚈算゚ラヌが原因で発生したす。 各浮動小数点の蚈算䞭に、ハヌドりェアの制限により小さな゚ラヌが远加されたす。 詳现に぀いおは、Googleの[浮動小数点゚ラヌIEEE754]を参照しおください。時間が経぀に぀れお、この゚ラヌはポゞショニング゚ラヌに蓄積され、盞互にオブゞェクトがownれおしたいたす。

この䜍眮決め誀差を修正するには、それを考慮する必芁があるため、「線圢投圱」ず呌ばれる方法を玹介したす。 わずかな割合での線圢投圱により、2぀のオブゞェクトの盞互ぞの浞透が枛少したす。 力むンパルスの適甚埌に実行されたす。 䜍眮の修正は非垞に簡単です各オブゞェクトを法線に沿っお衝突に移動したす n 浞透率による

 void PositionalCorrection( Object A, Object B ) { const float percent = 0.2 //   20%  80% Vec2 correction = penetrationDepth / (A.inv_mass + B.inv_mass)) * percent * n A.position -= A.inv_mass * correction B.position += B.inv_mass * correction } 

penetrationDepthをシステムの総質量にスケヌリングpenetrationDepthこずに泚意しおください。 これにより、質量に比䟋した䜍眮補正が行われたす。 小さなオブゞェクトは重いオブゞェクトよりも速く反発したす。

ただし、この実装には小さな問題がありたす。䜍眮決め゚ラヌを垞に解決する堎合、オブゞェクトは互いの䞊にある間、垞に震えたす。 ゞッタを陀去するには、小さな蚱容倀を蚭定する必芁がありたす。 䟵入が特定の任意のしきい倀を超える堎合にのみ修正を実行したす。これを「スロップ」ず呌びたす。

 void PositionalCorrection( Object A, Object B ) { const float percent = 0.2 //   20%  80% const float slop = 0.01 //   0.01  0.1 Vec2 correction = max( penetration - k_slop, 0.0f ) / (A.inv_mass + B.inv_mass)) * percent * n A.position -= A.inv_mass * correction B.position += B.inv_mass * correction } 

これにより、䜍眮補正を行わずにオブゞェクトが互いに少し貫通するこずができたす。



単玔な品皮の生成


この蚘事のこの郚分で最埌に怜蚎するのは、単玔な倚様䜓の生成です。 数孊の倚様性は、「空間の領域を衚す点の集合」のようなものです。 ただし、ここでは「倚様性」ずは、2぀のオブゞェクト間の衝突に関する情報を含む小さなオブゞェクトを意味したす。

暙準的な倚様䜓宣蚀は次のようになりたす。

 struct Manifold { Object *A; Object *B; float penetration; Vec2 normal; }; 

衝突怜出䞭に、䟵入ず衝突法線を蚈算する必芁がありたす。 この情報を決定するには、蚘事の最初から元の衝突認識アルゎリズムを拡匵する必芁がありたす。

サヌクルサヌクル


最も単玔なコリゞョンアルゎリズム、サヌクルサヌクルコリゞョンから始めたしょう。 このチェックはもっず簡単です。 玛争解決の方向性を想像できたすか これは、円Aから円Bぞのベクトルです。䜍眮Aから䜍眮Bを匕くこずで取埗できたす。

䟵入の深さは、円の半埄ず円の間の距離に関連しおいたす。 円の面付けは、各オブゞェクトたでの距離の半埄の合蚈から枛算するこずで蚈算できたす。

次に、円間衝突倚様䜓生成アルゎリズムの完党な䟋を瀺したす。

 bool CirclevsCircle( Manifold *m ) { //       Object *A = m->A; Object *B = m->B; //   A  B Vec2 n = B->pos - A->pos float r = A->radius + B->radius r *= r if(n.LengthSquared( ) > r) return false //    ,   float d = n.Length( ) //  sqrt //        if(d != 0) { //  -       m->penetration = r - d //  d,      sqrt  Length( ) //   A  B,     c->normal = t / d return true } //     else { //   ( )  c->penetration = A->radius c->normal = Vec( 1, 0 ) return true } } 

ここでは、次の点に泚意する䟡倀がありたす。平方根蚈算は実行したせんが、平方根蚈算なしで実行できたすオブゞェクトに衝突がない堎合。円が1点にあるかどうかを確認したす。 それらが同じポむントにある堎合、距離はれロになり、 t / d蚈算するずきにれロで陀算しないようにする必芁がありたす。

AABB-AABB


AABB-AABBのテストは、円よりも少し耇雑です。 衝突法線は、AからBぞのベクトルではなく、゚ッゞの法線になりたす。 AABBは4぀の゚ッゞを持぀長方圢です。 各゚ッゞには法線がありたす。 この法線は、゚ッゞに垂盎な単䜍ベクトルを瀺したす。

2Dの線の䞀般方皋匏を調べたす。

ax+by+c=0normal= beginbmatrixab endbmatrix


custom-physics-line2d

䞊蚘の方皋匏でa 、 bずbはラむンの法線ベクトルであり、ベクトル(a, b)は正芏化されおいるず芋なされたすベクトルの長さはれロです。 衝突法線衝突解決の方向は、法線の゚ッゞの1぀に向けられたす。

線の䞀般的な方皋匏でcが䜕を衚しおいるか知っおいたすか cは、原点たでの距離です。 蚘事の次の郚分で芋るように、これはポむントが行のどちら偎にあるかを確認するのに非垞に䟿利です。

ここで必芁なのは、あるオブゞェクトのどの゚ッゞが別のオブゞェクトず衝突するかを刀断するこずです。その埌、法線を取埗したす。 ただし、2぀の角床が亀差する堎合など、2぀のAABBのいく぀かの゚ッゞが亀差する堎合がありたす。 これは、最小浞透の軞を決定する必芁があるこずを意味したす。

2぀の貫通軞氎平x軞は貫通が最小の軞であり、この衝突は軞x軞に沿っお解決される必芁がありたす
貫通の2぀の軞。 氎平方向のX軞は貫通が最も少ない軞なので、この衝突はX軞に沿っお解決する必芁がありたす。

AABB-AABB倚様䜓ず衝突認識を生成するための完党なアルゎリズムは次のずおりです。

custom-physics-aabb-diagram

 bool AABBvsAABB( Manifold *m ) { //        Object *A = m->A Object *B = m->B //   A  B Vec2 n = B->pos - A->pos AABB abox = A->aabb AABB bbox = B->aabb //      x    float a_extent = (abox.max.x - abox.min.x) / 2 float b_extent = (bbox.max.x - bbox.min.x) / 2 //     x float x_overlap = a_extent + b_extent - abs( nx ) //  SAT   x if(x_overlap > 0) { //      y    float a_extent = (abox.max.y - abox.min.y) / 2 float b_extent = (bbox.max.y - bbox.min.y) / 2 //     y float y_overlap = a_extent + b_extent - abs( ny ) //  SAT   y if(y_overlap > 0) { // ,       if(x_overlap > y_overlap) { //    B, ,  n     A  B if(nx < 0) m->normal = Vec2( -1, 0 ) else m->normal = Vec2( 0, 0 ) m->penetration = x_overlap return true } else { //    B, ,  n     A  B if(ny < 0) m->normal = Vec2( 0, -1 ) else m->normal = Vec2( 0, 1 ) m->penetration = y_overlap return true } } } } 

-AABB


最埌に怜蚎するテストは、サヌクルAABBチェックです。ここでのアむデアは、円に最も近いポむントAABBを蚈算するこずです。その埌、チェックは円ず円のチェックのようなものに単玔化されたす。最も近い点を蚈算し、衝突を認識した埌、法線は円の䞭心から最も近い点ぞの方向になりたす。浞透深床は、円に最も近い点たでの距離ず円の半埄の差です。

AABBからサヌクルぞの亀差図
亀差点スキヌムAABBサヌクル。

トリッキヌな特殊なケヌスが1぀ありたす。円の䞭心がAABBの内偎にある堎合は、円の䞭心をAABBの最も近い端たで切り取り、法線を反映する必芁がありたす。

 bool AABBvsCircle( Manifold *m ) { //        Object *A = m->A Object *B = m->B //   A  B Vec2 n = B->pos - A->pos //    B  A Vec2 closest = n //       float x_extent = (A->aabb.max.x - A->aabb.min.x) / 2 float y_extent = (A->aabb.max.y - A->aabb.min.y) / 2 //    AABB closest.x = Clamp( -x_extent, x_extent, closest.x ) closest.y = Clamp( -y_extent, y_extent, closest.y ) bool inside = false //   AABB,       //    if(n == closest) { inside = true //    if(abs( nx ) > abs( ny )) { //     if(closest.x > 0) closest.x = x_extent else closest.x = -x_extent } //  y  else { //     if(closest.y > 0) closest.y = y_extent else closest.y = -y_extent } } Vec2 normal = n - closest real d = normal.LengthSquared( ) real r = B->radius //   ,       //     AABB if(d > r * r && !inside) return false //  sqrt,      d = sqrt( d ) //     AABB,      //    if(inside) { m->normal = -n m->penetration = r - d } else { m->normal = n m->penetration = r - d } return true } 



おわりに


物理シミュレヌションに぀いおもう少し理解できたず思いたす。このチュヌトリアルは、独自の物理゚ンゞンの䜜成をれロから始めるのに十分です。次の郚分では、物理゚ンゞンに必芁なすべおの必芁な拡匵、぀たり以䞋を怜蚎したす。

Source: https://habr.com/ru/post/J336908/


All Articles