From 7a78c835f04a7880ea820281de8e1de1685571fc Mon Sep 17 00:00:00 2001 From: rekut Date: Mon, 15 Jul 2024 23:05:37 +0900 Subject: [PATCH 01/13] add 11-Why-sutera-need-to-maintain-idempotence --- ...Why-sutera-need-to-maintain-idempotence.md | 26 +++++ sutera/image/idempotence.drawio | 91 ++++++++++++++++++ sutera/image/idempotence.drawio.png | Bin 0 -> 34567 bytes sutera/image/unidempotence.drawio | 82 ++++++++++++++++ sutera/image/unidempotence.drawio.png | Bin 0 -> 31508 bytes 5 files changed, 199 insertions(+) create mode 100644 sutera/11-Why-sutera-need-to-maintain-idempotence.md create mode 100644 sutera/image/idempotence.drawio create mode 100644 sutera/image/idempotence.drawio.png create mode 100644 sutera/image/unidempotence.drawio create mode 100644 sutera/image/unidempotence.drawio.png diff --git a/sutera/11-Why-sutera-need-to-maintain-idempotence.md b/sutera/11-Why-sutera-need-to-maintain-idempotence.md new file mode 100644 index 0000000..55faa71 --- /dev/null +++ b/sutera/11-Why-sutera-need-to-maintain-idempotence.md @@ -0,0 +1,26 @@ +# なぜsuteraは冪等性を維持する必要があるのか +## 概要 +Suteraでは個人を認証する方法として電子署名を使用します。 +しかし、冪等性を保たなければ他人を偽装した操作(リプレイ攻撃など)の危険性があります。 +そのため電子署名にバージョン情報を追加することで冪等性を保っています。 + +## 冪等性とは +情報工学において冪等性(べきとうせい、英: idempotence)とは、ある操作を一度行っても複数回行っても同じ結果となることです。 +特に何回実行しても結果や応答が変わらない操作を指します。[1] +冪等の例として絶対値関数があります。絶対値関数をある値に複数回適用しても返り値は変わらないためこの関数は冪等であるといえます。 +## 冪等性がない場合 +Suteraで冪等性が維持されない場合の例としてリプレイ攻撃があります。リプレイ攻撃とは標的が送信した情報を入手し、その情報を再送信することで不正なアクセスを実現する攻撃手法です。[2] +以下の図が冪等性がない場合の例です。この場合では最初にある人物Aが電子署名を付加したファイルを送信し、その後にAがそのファイルを更新して再び送信したと仮定します。 +ここで一番最初に送信したデータを悪意ある第三者が入手して、それを再送します。この場合、第三者が送信したファイルに付加されている電子署名は正常なものなのでサーバ側はこの更新を正常なものとして処理します。 +このように、電子署名だけでは同じファイルの送信を複数回行っても正常に処理してしまうため冪等性がないと言えます。 +![figure of discription unidempotence](image/unidempotence.drawio.png) + +## 冪等性がある場合 +冪等性がある場合の例が以下の図です。Suteraでは冪等性を保つために電子署名にバージョン情報を追加しています。 +この例では先程の例と同様にある人物Aが電子署名を付加したファイルを送信、その後更新しています。そのため、悪意のある第三者からリプレイ攻撃を行われていてもバージョン情報の整合性が取れず、サーバでの処理が拒否されます。 +このように、電子署名にバージョン情報を追加すると同じファイルを複数回送信しても処理されないため冪等性が保たれていると言えます。 +![figure of discription idepotence](image/idempotence.drawio.png) + +## 参考文献 +[1]冪等性,デジタル大辞泉,ジャパンナレッジ,閲覧2024-07-13,https://japanknowledge.com/library/ +[2]リプレイ攻撃、SOMPO CYBER SECURITY サイバーセキュリティ用語集,閲覧2024-07-15, https://www.sompocybersecurity.com/column/glossary/replay-attack \ No newline at end of file diff --git a/sutera/image/idempotence.drawio b/sutera/image/idempotence.drawio new file mode 100644 index 0000000..e1620a0 --- /dev/null +++ b/sutera/image/idempotence.drawio @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sutera/image/idempotence.drawio.png b/sutera/image/idempotence.drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..dffeb8fc27159687a21b7d16dd97456e34128113 GIT binary patch literal 34567 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 &k{B!-b(bp@w3RSR-Jkolw?Je|pfw(2mgcc{ z%pYGx<6U;cA4Lxslij7-jJru^Q(RFEqDf?EFw!5*U_NLmi@^i_a!dL70C>BOYJYe; z!)nmg0FS>JcUMjiiEv(V&lOOWF=V2Zbv~_^{Km7OpV92%jG|^}hwlv4~ z%oGr=@wp7a1xQ(0S%rbNgc&2!?I-&_LufqoD>M=yG>QbTaFsu}5Oz|Fw5?Bz>kI(o zV2F8A6EsyDNlxy2C`08IMh3wL#J|p=Ul{n_A{-80tyc$8I#M^;Qszp}-**XRe5Z#< zq5Ro*-qSzeW{pVvfBw-1pM~qc5p@>g<210#_mBDgBUC$bDY{rZb1-Uaqh&|1-dWic zc=vt1rA-5hxCTgCie7`|I4r+Z_`~BjPL%A2m7*HZor6xE~OHZ5$T~^o7kvD zi^9#MT>%9yJdl(Nh}Rk=Injt-?YU}WNAiym9Lh;vRI(c<8I}k#3H)K3?TI0m-VJ=! z5dF0aKClbiCTxOPMh7OPJ^%jc{t2-(J;vbh``hA4!|@hz|0bb7{-1=B6VYEPPYPet z%Pn-SLhm`n+fCH)%g_lu5&;3D2MXYeH{L$$`}rJ23wHii^deT`umcA3Q`u2=djfTt z6pP*U<uKfOa3iF#W$+0y}fAa)DXn%EErNMsaavslV$D$BBUC2WT*d}3vtZifQ z$~84LEpK0y7M_`kRjLi47yI?F0IWPn!W8T_B#kYXA2hIH$RJ{r9mSx5vs+4QKz3jIXyz12Q4u?dX6RUyB;paR z9ZXukb0D>s=)>8mDE%|wL4C^Z+6QAQdN)|Ds((bTW7zEvUMoPaT2|Qx(Q&}jMSOIY zyQRT@+d3cmdkjsBYcNk<#ijaef0-W)p<4jwmNnGgd0|mup9>u+btjpeFW2Vk(z0%{ zn&ZMv+nPVgP|rNx_okMd#&~xwLDG zHdjw+uawCmn36WUB%p&7csq{Z8hql-+Vj*k zYD0ZvN`K3$JWwxlA@fRc?v2?m3cPum5oHFdFvP^Q64XA$gOrt#=;7J9&L_NhWyh|W z%T~it!VDQIp!>3VtM^b{LIE}Te32g{vU4!Jh$U%jQucAW@3HVjzf~vzb|aS~0`+E2 zZ!{C0?LOr4PfwkDQ)(xy-|$;siG8ZhMD}`GNFo>q;{xx8f>I?P#C9!~L?85y{4pLh z#aaBy=A)`=Q<4Pok(_7@DvP|o(BsG3LLcvlN(Jo z*4F96NR(dT`q;-6{LAD+wI{T)>tGaL3mr + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sutera/image/unidempotence.drawio.png b/sutera/image/unidempotence.drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..668fd936d51636d8b6ecdd7a9068007833cd6a51 GIT binary patch literal 31508 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 z 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 UD;-6_&s;C~!wJ9jw! Date: Tue, 16 Jul 2024 21:31:11 +0900 Subject: [PATCH 02/13] docs(idea/sutera):11-Why-sutera-need-to-maintain-idempotence.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit change title Co-authored-by: AsPulse / あすぱる --- sutera/11-Why-sutera-need-to-maintain-idempotence.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sutera/11-Why-sutera-need-to-maintain-idempotence.md b/sutera/11-Why-sutera-need-to-maintain-idempotence.md index 55faa71..99ed737 100644 --- a/sutera/11-Why-sutera-need-to-maintain-idempotence.md +++ b/sutera/11-Why-sutera-need-to-maintain-idempotence.md @@ -1,4 +1,4 @@ -# なぜsuteraは冪等性を維持する必要があるのか +# なぜSuteraネットワーク内の通信には羃等性が必要なのか ## 概要 Suteraでは個人を認証する方法として電子署名を使用します。 しかし、冪等性を保たなければ他人を偽装した操作(リプレイ攻撃など)の危険性があります。 From 38d24cacb2a52890a63264cdca05b7f1742efa93 Mon Sep 17 00:00:00 2001 From: rekut Date: Wed, 17 Jul 2024 21:37:22 +0900 Subject: [PATCH 03/13] update 11 --- ...Why-sutera-need-to-maintain-idempotence.md | 29 ++++++++++--------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/sutera/11-Why-sutera-need-to-maintain-idempotence.md b/sutera/11-Why-sutera-need-to-maintain-idempotence.md index 99ed737..5bca5b5 100644 --- a/sutera/11-Why-sutera-need-to-maintain-idempotence.md +++ b/sutera/11-Why-sutera-need-to-maintain-idempotence.md @@ -1,26 +1,29 @@ # なぜSuteraネットワーク内の通信には羃等性が必要なのか -## 概要 -Suteraでは個人を認証する方法として電子署名を使用します。 -しかし、冪等性を保たなければ他人を偽装した操作(リプレイ攻撃など)の危険性があります。 -そのため電子署名にバージョン情報を追加することで冪等性を保っています。 - +## 概要 +Suteraネットワークでは多くのコンポーネントが情報を保持・中継する上、認証を行う中央サーバーが存在しません。そのため、電子署名以外にリクエストの正当性を保つ手段をもちません。 +しかし、まったく内容の同じリクエストならば電子署名を使い回すことが可能であり、リプレイ攻撃[^1]などが成立します。 +Suteraネットワークでは、このような任意のタイミングで過去のメッセージが送信されることによる悪意ある攻撃に耐性を持つことが必要です。この耐性を確保するために、すべての通信仕様で冪等性を保つ必要があります。 + ## 冪等性とは 情報工学において冪等性(べきとうせい、英: idempotence)とは、ある操作を一度行っても複数回行っても同じ結果となることです。 -特に何回実行しても結果や応答が変わらない操作を指します。[1] -冪等の例として絶対値関数があります。絶対値関数をある値に複数回適用しても返り値は変わらないためこの関数は冪等であるといえます。 +特に何回実行しても結果や応答が変わらない操作を指します。[^3] +冪等性の例として動画プレイヤーの一時停止ボタンを考えてみましょう。 +ある動画プレイヤーに一時停止ボタンが有り、そのボタンを押すたびに一時停止と再生が切り替わると仮定します。この場合では、「一時停止ボタンを押す」という同じ操作を複数回行うたびに応答が変わるため、冪等性はないと言えます。 +次に一時停止ボタンと再生ボタンが分かれている場合を仮定します。この場合は一時停止ボタンを複数回押しても動画は停止したままであり、複数回同じ操作を行っても応答が変わらない、すなわち冪等性が保たれていると言えます。 ## 冪等性がない場合 -Suteraで冪等性が維持されない場合の例としてリプレイ攻撃があります。リプレイ攻撃とは標的が送信した情報を入手し、その情報を再送信することで不正なアクセスを実現する攻撃手法です。[2] +Suteraネットワーク内で頻繁に行われる「特定のユーザーが保持しているファイルの内容更新」を例に、リプレイ攻撃が有効となるような通信仕様を考えてみましょう。 以下の図が冪等性がない場合の例です。この場合では最初にある人物Aが電子署名を付加したファイルを送信し、その後にAがそのファイルを更新して再び送信したと仮定します。 ここで一番最初に送信したデータを悪意ある第三者が入手して、それを再送します。この場合、第三者が送信したファイルに付加されている電子署名は正常なものなのでサーバ側はこの更新を正常なものとして処理します。 このように、電子署名だけでは同じファイルの送信を複数回行っても正常に処理してしまうため冪等性がないと言えます。 ![figure of discription unidempotence](image/unidempotence.drawio.png) ## 冪等性がある場合 -冪等性がある場合の例が以下の図です。Suteraでは冪等性を保つために電子署名にバージョン情報を追加しています。 +冪等性がある場合の例が以下の図です。Suteraネットワークでは冪等性を保つために電子署名にバージョン情報を追加しています。 この例では先程の例と同様にある人物Aが電子署名を付加したファイルを送信、その後更新しています。そのため、悪意のある第三者からリプレイ攻撃を行われていてもバージョン情報の整合性が取れず、サーバでの処理が拒否されます。 -このように、電子署名にバージョン情報を追加すると同じファイルを複数回送信しても処理されないため冪等性が保たれていると言えます。 +このように、電子署名にバージョン情報を追加することで、同じ通信が複数回送信されても過去のバージョンに対する通信であることを認識でき、現在の状態を変更することはないため、冪等性が保たれていると言えます。 ![figure of discription idepotence](image/idempotence.drawio.png) -## 参考文献 -[1]冪等性,デジタル大辞泉,ジャパンナレッジ,閲覧2024-07-13,https://japanknowledge.com/library/ -[2]リプレイ攻撃、SOMPO CYBER SECURITY サイバーセキュリティ用語集,閲覧2024-07-15, https://www.sompocybersecurity.com/column/glossary/replay-attack \ No newline at end of file +## 参考文献、脚注 +[^1]: リプレイ攻撃とは標的が送信した情報を入手し、その情報を再送信することで不正なアクセスを実現する攻撃手法です。 [^2] +[^2]:リプレイ攻撃、SOMPO CYBER SECURITY サイバーセキュリティ用語集,閲覧2024-07-15, https://www.sompocybersecurity.com/column/glossary/replay-attack +[^3]:冪等性,デジタル大辞泉,ジャパンナレッジ,閲覧2024-07-13,https://japanknowledge.com/library/ \ No newline at end of file From 74d8bc75bd63226960ffef5686f14692fae7b79c Mon Sep 17 00:00:00 2001 From: rekut Date: Thu, 18 Jul 2024 04:32:19 +0900 Subject: [PATCH 04/13] update_sugesstion --- sutera/11-Why-sutera-need-to-maintain-idempotence.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sutera/11-Why-sutera-need-to-maintain-idempotence.md b/sutera/11-Why-sutera-need-to-maintain-idempotence.md index 5bca5b5..bcc9276 100644 --- a/sutera/11-Why-sutera-need-to-maintain-idempotence.md +++ b/sutera/11-Why-sutera-need-to-maintain-idempotence.md @@ -6,14 +6,14 @@ Suteraネットワークでは、このような任意のタイミングで過 ## 冪等性とは 情報工学において冪等性(べきとうせい、英: idempotence)とは、ある操作を一度行っても複数回行っても同じ結果となることです。 -特に何回実行しても結果や応答が変わらない操作を指します。[^3] +特に何回実行しても内部状態が変わらない操作を指します。[^3] 冪等性の例として動画プレイヤーの一時停止ボタンを考えてみましょう。 -ある動画プレイヤーに一時停止ボタンが有り、そのボタンを押すたびに一時停止と再生が切り替わると仮定します。この場合では、「一時停止ボタンを押す」という同じ操作を複数回行うたびに応答が変わるため、冪等性はないと言えます。 -次に一時停止ボタンと再生ボタンが分かれている場合を仮定します。この場合は一時停止ボタンを複数回押しても動画は停止したままであり、複数回同じ操作を行っても応答が変わらない、すなわち冪等性が保たれていると言えます。 +ある動画プレイヤーに一時停止ボタンが有り、そのボタンを押すたびに一時停止と再生が切り替わると仮定します。この場合では、「一時停止ボタンを押す」という同じ操作を複数回行うたびに応内部状態が変わるため、冪等性はないと言えます。 +次に一時停止ボタンと再生ボタンが分かれている場合を仮定します。この場合は一時停止ボタンを複数回押しても動画は停止したままであり、複数回同じ操作を行っても内部状態が変わらない、すなわち冪等性が保たれていると言えます。 ## 冪等性がない場合 Suteraネットワーク内で頻繁に行われる「特定のユーザーが保持しているファイルの内容更新」を例に、リプレイ攻撃が有効となるような通信仕様を考えてみましょう。 以下の図が冪等性がない場合の例です。この場合では最初にある人物Aが電子署名を付加したファイルを送信し、その後にAがそのファイルを更新して再び送信したと仮定します。 -ここで一番最初に送信したデータを悪意ある第三者が入手して、それを再送します。この場合、第三者が送信したファイルに付加されている電子署名は正常なものなのでサーバ側はこの更新を正常なものとして処理します。 +ここで一番最初に送信した電子署名付きのファイルを悪意ある第三者が入手して、それを再送します。この場合、第三者が送信したファイルに付加されている電子署名は正常なものなのでサーバ側はこの更新を正常なものとして処理します。 このように、電子署名だけでは同じファイルの送信を複数回行っても正常に処理してしまうため冪等性がないと言えます。 ![figure of discription unidempotence](image/unidempotence.drawio.png) From 049cc8915539dd7596a95c0024d259113c6d270e Mon Sep 17 00:00:00 2001 From: rekut Date: Thu, 18 Jul 2024 04:47:19 +0900 Subject: [PATCH 05/13] change_discription_of_idempotence --- sutera/11-Why-sutera-need-to-maintain-idempotence.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sutera/11-Why-sutera-need-to-maintain-idempotence.md b/sutera/11-Why-sutera-need-to-maintain-idempotence.md index bcc9276..82b118e 100644 --- a/sutera/11-Why-sutera-need-to-maintain-idempotence.md +++ b/sutera/11-Why-sutera-need-to-maintain-idempotence.md @@ -19,7 +19,7 @@ Suteraネットワーク内で頻繁に行われる「特定のユーザーが ## 冪等性がある場合 冪等性がある場合の例が以下の図です。Suteraネットワークでは冪等性を保つために電子署名にバージョン情報を追加しています。 -この例では先程の例と同様にある人物Aが電子署名を付加したファイルを送信、その後更新しています。そのため、悪意のある第三者からリプレイ攻撃を行われていてもバージョン情報の整合性が取れず、サーバでの処理が拒否されます。 +この例では先程の例と同様にある人物Aが電子署名を付加したファイルを送信し、その後に更新しています。しかし、この例では先程の例ではなかったバージョン情報が電子署名に追加されています。そのため、悪意のある第三者からリプレイ攻撃を行われていてもバージョン情報の整合性が取れず、サーバでの処理が拒否されます。 このように、電子署名にバージョン情報を追加することで、同じ通信が複数回送信されても過去のバージョンに対する通信であることを認識でき、現在の状態を変更することはないため、冪等性が保たれていると言えます。 ![figure of discription idepotence](image/idempotence.drawio.png) From 591c055a52d2259e298c30ef95a7b7bd81d64ea5 Mon Sep 17 00:00:00 2001 From: rekut Date: Tue, 23 Jul 2024 18:53:22 +0900 Subject: [PATCH 06/13] add model yaml ver1 --- ...bout_model_of_sutera_package_using_yaml.md | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 package/About_model_of_sutera_package_using_yaml.md diff --git a/package/About_model_of_sutera_package_using_yaml.md b/package/About_model_of_sutera_package_using_yaml.md new file mode 100644 index 0000000..08098c2 --- /dev/null +++ b/package/About_model_of_sutera_package_using_yaml.md @@ -0,0 +1,87 @@ +# suteraパッケージのモデルについて(yamlフォーマット) + +## 概要 +suteraパッケージではワールド内に設置された3Dモデルの情報を本項目で説明してるyamal^[1]フォーマットを用いて管理しています。 + +## モデルのyamlファイルに必要な要素 +suteraパッケージにおいてワールド内で設置されたオブジェクトの位置や、3Dモデルへのパスといったオブジェクトに関する様々な情報を保持する必要があります。suteraパッケージではそれらオブエジェクトに関する情報を以下のような要素を持ったyamlファイルを用いて管理しています。 + +### metadata +ファイルの基本的な情報が記載される部分です +- type オブジェクトの場合sutera-objectと記載されます +- sutera_version 使用されているsuteraのバージョンが記載されます +- name オブジェクトの名前が記載されます +- version オブジェクトのバージョンが記載されます +- id オブジェクトに割り振られたidが記載されます + +### model +使用する3Dモデルに関して記述される部分です +- type 使用する3Dモデルのファイルタイプを記載してください +- path 使用する3Dモデルのファイルへの絶対パスを指定してください + +### material +3Dモデルで使用するマテリアルに関して記述する部分です +- type マテリアルに使用するファイルのタイプを記述してください +- path マテリアルに使用するファイルの絶対パスを記述してください + +### physics +モデルの物理的挙動の設定に関して記述する部分です +- coliders +コライダーに関して設定する部分です。配列であるため、設定しない場合は空配列[]を設定してください + - type コライダーのタイプについて記述します。 +- gravity 重力について記述します。 + - mass 質量の設定で単位は[kg]です。 + +### specs +ocjectをワールドに設置した際の位置や回転などを記述する部分です +- location ワールドにおけるオブジェクトのグローバル座標です。x,y,zの3次元直行座標系で記載します +- rotation オブジェクトの回転を表します。x,y,z,wのクォータニオンで記載します +- scale オブジェクトのスケールです。locationと同じくx,y,zの3次元直行座標系で記載します。 +- object_origin ワールドにおけるオブジェクトの原点です。グローバル座標で表され、オブジェクトをリスポーンした際にはこの位置にオブジェクトが移動します +## yamlファイルの例 +``` +metadata: + type: sutera-object + sutera_version: 0.1.0 + name: # + version: 0.2.0 + +model: + type: gltf #ファイルのタイプを記述 + path: models/sofa.gltf #ファイルの置いてあるフォルダへの絶対パスを指定 + +material: + type: sbsar #マテリアルのファイルタイプについて記述 + path: materials/sofa.sbsar #マテリアルのファイルへの絶対パス + +physics: + colliders: # 配列だから、明記しない場合 `colliders: []` + - type: box #コライダーのタイプを記載 + gravity: + mass: 5000 ##明記しない場合0(つまり重力なし) + +specs: + location: + x:5 + y:5 + z:0 + rotation: + x:0 + y:0 + z:0 + w:0 + scale: + x:1 + y:1 + z:1 + obejct_origin: + x:1 + y:1 + z:0 + + +``` + +## 参考文献,脚注 +^[1~] YAML (「YAML Ain't Markup Language」の再帰的頭字語) は、人間に優しく、日常の一般的なタスクで最新のプログラミング言語とうまく連携するように設計されたデータシリアル化言語です。^[2] +^[2~] yaml公式サイトspecification v1.2.2 https://yaml.org/spec/1.2.2/ 閲覧2024/7/23 \ No newline at end of file From b83bc01e3281d77cace59edf5ad0102c669996fa Mon Sep 17 00:00:00 2001 From: rekut Date: Tue, 23 Jul 2024 21:21:00 +0900 Subject: [PATCH 07/13] change_text --- ...bout_model_of_sutera_package_using_yaml.md | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/package/About_model_of_sutera_package_using_yaml.md b/package/About_model_of_sutera_package_using_yaml.md index 08098c2..fd065ab 100644 --- a/package/About_model_of_sutera_package_using_yaml.md +++ b/package/About_model_of_sutera_package_using_yaml.md @@ -1,42 +1,42 @@ -# suteraパッケージのモデルについて(yamlフォーマット) +# Suteraパッケージのモデルについて(yamlフォーマット) ## 概要 -suteraパッケージではワールド内に設置された3Dモデルの情報を本項目で説明してるyamal^[1]フォーマットを用いて管理しています。 +Suteraパッケージではワールド内に設置された3Dモデルの情報を本項目で説明してるyamal^[1]フォーマットを用いて管理しています。 ## モデルのyamlファイルに必要な要素 -suteraパッケージにおいてワールド内で設置されたオブジェクトの位置や、3Dモデルへのパスといったオブジェクトに関する様々な情報を保持する必要があります。suteraパッケージではそれらオブエジェクトに関する情報を以下のような要素を持ったyamlファイルを用いて管理しています。 +Suteraパッケージにおいてワールド内で設置されたオブジェクトの位置や、3Dモデルへのパスといったオブジェクトに関する様々な情報を保持する必要があります。Suteraパッケージではそれらオブエジェクトに関する情報を以下のような要素を持ったyamlファイルを用いて管理しています。 ### metadata -ファイルの基本的な情報が記載される部分です -- type オブジェクトの場合sutera-objectと記載されます -- sutera_version 使用されているsuteraのバージョンが記載されます +ファイルの基本的な情報が記載される部分です。 +- type オブジェクトの場合Sutera-objectと記載されます +- Sutera_version 使用されているsuteraのバージョンが記載されます - name オブジェクトの名前が記載されます - version オブジェクトのバージョンが記載されます - id オブジェクトに割り振られたidが記載されます ### model -使用する3Dモデルに関して記述される部分です +使用する3Dモデルに関して記述される部分です。 - type 使用する3Dモデルのファイルタイプを記載してください - path 使用する3Dモデルのファイルへの絶対パスを指定してください ### material -3Dモデルで使用するマテリアルに関して記述する部分です +3Dモデルで使用するマテリアルに関して記述する部分です。 - type マテリアルに使用するファイルのタイプを記述してください - path マテリアルに使用するファイルの絶対パスを記述してください ### physics -モデルの物理的挙動の設定に関して記述する部分です +モデルの物理的挙動の設定に関して記述する部分です。 - coliders -コライダーに関して設定する部分です。配列であるため、設定しない場合は空配列[]を設定してください - - type コライダーのタイプについて記述します。 -- gravity 重力について記述します。 - - mass 質量の設定で単位は[kg]です。 +コライダーに関して設定する部分です。配列なので、設定しない場合は空配列[]を設定してください。 + - type コライダーのタイプについて記述します +- gravity 重力について記述します + - mass 質量の設定で単位は[kg]です ### specs -ocjectをワールドに設置した際の位置や回転などを記述する部分です -- location ワールドにおけるオブジェクトのグローバル座標です。x,y,zの3次元直行座標系で記載します +ocjectをワールドに設置した際の位置や回転などを記述する部分です。 +- location ワールドにおけるオブジェクトのグローバル座標です。x,y,zの3次元直交座標系で記載します - rotation オブジェクトの回転を表します。x,y,z,wのクォータニオンで記載します -- scale オブジェクトのスケールです。locationと同じくx,y,zの3次元直行座標系で記載します。 +- scale オブジェクトのスケールです。locationと同じくx,y,zの3次元直交座標系で記載します。 - object_origin ワールドにおけるオブジェクトの原点です。グローバル座標で表され、オブジェクトをリスポーンした際にはこの位置にオブジェクトが移動します ## yamlファイルの例 ``` From a57a6eec28699a4a1230097b4bb16d1d48dd98a4 Mon Sep 17 00:00:00 2001 From: rekut Date: Sun, 4 Aug 2024 18:34:31 +0900 Subject: [PATCH 08/13] fix text --- ...bout_model_of_sutera_package_using_yaml.md | 90 ++++++++----------- package/model.yaml | 48 ++++++++++ 2 files changed, 86 insertions(+), 52 deletions(-) create mode 100644 package/model.yaml diff --git a/package/About_model_of_sutera_package_using_yaml.md b/package/About_model_of_sutera_package_using_yaml.md index fd065ab..dce5659 100644 --- a/package/About_model_of_sutera_package_using_yaml.md +++ b/package/About_model_of_sutera_package_using_yaml.md @@ -9,13 +9,13 @@ Suteraパッケージにおいてワールド内で設置されたオブジェ ### metadata ファイルの基本的な情報が記載される部分です。 - type オブジェクトの場合Sutera-objectと記載されます -- Sutera_version 使用されているsuteraのバージョンが記載されます +- Sutera_version 使用されているSteraのバージョンが記載されます - name オブジェクトの名前が記載されます - version オブジェクトのバージョンが記載されます -- id オブジェクトに割り振られたidが記載されます +- id オブジェクトに割り振るidを記載します ### model -使用する3Dモデルに関して記述される部分です。 +使用する3Dモデルのモデルデータに関して記述される部分です. - type 使用する3Dモデルのファイルタイプを記載してください - path 使用する3Dモデルのファイルへの絶対パスを指定してください @@ -27,60 +27,46 @@ Suteraパッケージにおいてワールド内で設置されたオブジェ ### physics モデルの物理的挙動の設定に関して記述する部分です。 - coliders -コライダーに関して設定する部分です。配列なので、設定しない場合は空配列[]を設定してください。 - - type コライダーのタイプについて記述します -- gravity 重力について記述します - - mass 質量の設定で単位は[kg]です +コライダーに関して設定する部分です。配列であるため、設定しない場合は空配列[]を設定してください。コライダーを設定する際はコライダーのtypeと各タイプごとのパラメータを記述してください。以下にSuteraで使用できる主要なコライダーのタイプと設定項目の例を記載します。 + #### box + 箱型のコライダーです。x,y,z軸方向のboxの大きさを指定してください。 + ``` + type: box + x: 1 + y: 1 + z: 1 + ``` + #### sphere + 球形のコライダーです。球の半径rを指定してください + ``` + type: sphere + r: 1 + ``` + + #### cupsule + カプセル方のコライダーです。球の半径rと高さhを指定してください + ``` + type: sphere + r: 1 + h: 2 + ``` + + +- rigidbody 物理演算について記述する項目です + - gravity Trueに設定すると重力の影響を受けます + - mass 質量の設定で単位は[kg]です。明記しない場合は0となり重力がないという扱いになります + - Drag オブジェクトに影響する空気抵抗の大きさです。0の場合空気抵抗が0となります + - Angular_Drag トルクによって回転する際に、オブジェクトに影響する空気抵抗の大きさです。0の場合空気抵抗は0となります ### specs -ocjectをワールドに設置した際の位置や回転などを記述する部分です。 +ocjectをワールドに設置した際の位置や回転などといった情報を記述する部分です。 - location ワールドにおけるオブジェクトのグローバル座標です。x,y,zの3次元直交座標系で記載します - rotation オブジェクトの回転を表します。x,y,z,wのクォータニオンで記載します -- scale オブジェクトのスケールです。locationと同じくx,y,zの3次元直交座標系で記載します。 -- object_origin ワールドにおけるオブジェクトの原点です。グローバル座標で表され、オブジェクトをリスポーンした際にはこの位置にオブジェクトが移動します +- scale オブジェクトのスケールです。locationと同じくx,y,zの3次元直交座標系で記載します +- origin ワールドにおけるオブジェクトの原点です。グローバル座標で表され、オブジェクトをリスポーンした際にはこの位置にオブジェクトが移動します +- origin_rotation ワールドにオブジェクトがスポーンした際の角度を指定します。rotationと同様にx,y,z,wのクォータニオンで記載します ## yamlファイルの例 -``` -metadata: - type: sutera-object - sutera_version: 0.1.0 - name: # - version: 0.2.0 - -model: - type: gltf #ファイルのタイプを記述 - path: models/sofa.gltf #ファイルの置いてあるフォルダへの絶対パスを指定 - -material: - type: sbsar #マテリアルのファイルタイプについて記述 - path: materials/sofa.sbsar #マテリアルのファイルへの絶対パス - -physics: - colliders: # 配列だから、明記しない場合 `colliders: []` - - type: box #コライダーのタイプを記載 - gravity: - mass: 5000 ##明記しない場合0(つまり重力なし) - -specs: - location: - x:5 - y:5 - z:0 - rotation: - x:0 - y:0 - z:0 - w:0 - scale: - x:1 - y:1 - z:1 - obejct_origin: - x:1 - y:1 - z:0 - - -``` +[model.yaml](./model.yaml)に本項目で説明したワールドに設置する3Dモデルに関するyamlファイルの例が記載されています。 ## 参考文献,脚注 ^[1~] YAML (「YAML Ain't Markup Language」の再帰的頭字語) は、人間に優しく、日常の一般的なタスクで最新のプログラミング言語とうまく連携するように設計されたデータシリアル化言語です。^[2] diff --git a/package/model.yaml b/package/model.yaml new file mode 100644 index 0000000..387c037 --- /dev/null +++ b/package/model.yaml @@ -0,0 +1,48 @@ +metadata: + type: Sutera-object + sutera_version: 0.1.0 + name:sofa + version: 0.2.0 + id: ball + +model: + type: gltf #ファイルのタイプを記述 + path: models/sofa.gltf #ファイルの置いてあるフォルダへの絶対パスを指定 + +material: + type: sbsar #マテリアルのファイルタイプについて記述 + path: materials/sofa.sbsar #マテリアルのファイルへの絶対パス + +physics: + colliders: + - type: sphere + radius: 3 + rigidbody: + gravity: true + mass: 5000 + Drag: 1 + Angular_Drag: 0 + +specs: + location: + x:5 + y:5 + z:0 + rotation: + x:0 + y:0 + z:0 + w:0 + scale: + x:1 + y:1 + z:1 + origin: + x:1 + y:1 + z:0 + origin_rotation: + x:0 + y:0 + z:0 + w:0 \ No newline at end of file From 6c255ffc257e6c4524990f5780b9bbc10bb70f36 Mon Sep 17 00:00:00 2001 From: rekut Date: Sun, 4 Aug 2024 18:38:37 +0900 Subject: [PATCH 09/13] fix_text --- package/About_model_of_sutera_package_using_yaml.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/About_model_of_sutera_package_using_yaml.md b/package/About_model_of_sutera_package_using_yaml.md index dce5659..30c8fee 100644 --- a/package/About_model_of_sutera_package_using_yaml.md +++ b/package/About_model_of_sutera_package_using_yaml.md @@ -15,7 +15,7 @@ Suteraパッケージにおいてワールド内で設置されたオブジェ - id オブジェクトに割り振るidを記載します ### model -使用する3Dモデルのモデルデータに関して記述される部分です. +使用する3Dモデルのモデルデータに関して記述される部分です。 - type 使用する3Dモデルのファイルタイプを記載してください - path 使用する3Dモデルのファイルへの絶対パスを指定してください From 11606803db222f71921a1b466c9bf5596b40b454 Mon Sep 17 00:00:00 2001 From: rekut Date: Sun, 4 Aug 2024 18:43:56 +0900 Subject: [PATCH 10/13] fix --- package/About_model_of_sutera_package_using_yaml.md | 4 ++-- package/model.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package/About_model_of_sutera_package_using_yaml.md b/package/About_model_of_sutera_package_using_yaml.md index 30c8fee..081eaa8 100644 --- a/package/About_model_of_sutera_package_using_yaml.md +++ b/package/About_model_of_sutera_package_using_yaml.md @@ -4,12 +4,12 @@ Suteraパッケージではワールド内に設置された3Dモデルの情報を本項目で説明してるyamal^[1]フォーマットを用いて管理しています。 ## モデルのyamlファイルに必要な要素 -Suteraパッケージにおいてワールド内で設置されたオブジェクトの位置や、3Dモデルへのパスといったオブジェクトに関する様々な情報を保持する必要があります。Suteraパッケージではそれらオブエジェクトに関する情報を以下のような要素を持ったyamlファイルを用いて管理しています。 +Suteraパッケージにおいてワールド内で設置されたオブジェクトの位置や、3Dモデルへのパスといったオブジェクトに関する様々な情報を保持する必要があります。Suteraパッケージではそれらオブジェクトに関する情報を以下のような要素を持ったyamlファイルを用いて管理しています。 ### metadata ファイルの基本的な情報が記載される部分です。 - type オブジェクトの場合Sutera-objectと記載されます -- Sutera_version 使用されているSteraのバージョンが記載されます +- Sutera_version 使用されているSuteraのバージョンが記載されます - name オブジェクトの名前が記載されます - version オブジェクトのバージョンが記載されます - id オブジェクトに割り振るidを記載します diff --git a/package/model.yaml b/package/model.yaml index 387c037..764686b 100644 --- a/package/model.yaml +++ b/package/model.yaml @@ -19,7 +19,7 @@ physics: radius: 3 rigidbody: gravity: true - mass: 5000 + mass: 50 Drag: 1 Angular_Drag: 0 From 030c025dfc590f933f8adb3655f2ff462c802014 Mon Sep 17 00:00:00 2001 From: rekut Date: Mon, 12 Aug 2024 21:07:21 +0900 Subject: [PATCH 11/13] fix see2et --- ...bout_model_of_sutera_package_using_yaml.md | 45 +++++++++---------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/package/About_model_of_sutera_package_using_yaml.md b/package/About_model_of_sutera_package_using_yaml.md index 081eaa8..318357d 100644 --- a/package/About_model_of_sutera_package_using_yaml.md +++ b/package/About_model_of_sutera_package_using_yaml.md @@ -1,5 +1,4 @@ -# Suteraパッケージのモデルについて(yamlフォーマット) - +# モデルのSuteraパッケージについて(yamlフォーマット) ## 概要 Suteraパッケージではワールド内に設置された3Dモデルの情報を本項目で説明してるyamal^[1]フォーマットを用いて管理しています。 @@ -8,25 +7,25 @@ Suteraパッケージにおいてワールド内で設置されたオブジェ ### metadata ファイルの基本的な情報が記載される部分です。 -- type オブジェクトの場合Sutera-objectと記載されます -- Sutera_version 使用されているSuteraのバージョンが記載されます -- name オブジェクトの名前が記載されます -- version オブジェクトのバージョンが記載されます -- id オブジェクトに割り振るidを記載します +- type: Suteraパッケージのタイプを示します。オブジェクトの場合Sutera-objectと記載されます +- Sutera_version: 使用されているSuteraのバージョンが記載されます +- name: オブジェクトの名前が記載されます +- version: オブジェクトのバージョンが記載されます +- id: オブジェクトに割り振るidを記載します ### model 使用する3Dモデルのモデルデータに関して記述される部分です。 -- type 使用する3Dモデルのファイルタイプを記載してください -- path 使用する3Dモデルのファイルへの絶対パスを指定してください +- type: 使用する3Dモデルのファイルタイプを記載してください +- path: 使用する3Dモデルのファイルへの絶対パスを指定してください ### material 3Dモデルで使用するマテリアルに関して記述する部分です。 -- type マテリアルに使用するファイルのタイプを記述してください -- path マテリアルに使用するファイルの絶対パスを記述してください +- type: マテリアルに使用するファイルのタイプを記述してください +- path: マテリアルに使用するファイルの絶対パスを記述してください ### physics モデルの物理的挙動の設定に関して記述する部分です。 -- coliders +- coliders: コライダーに関して設定する部分です。配列であるため、設定しない場合は空配列[]を設定してください。コライダーを設定する際はコライダーのtypeと各タイプごとのパラメータを記述してください。以下にSuteraで使用できる主要なコライダーのタイプと設定項目の例を記載します。 #### box 箱型のコライダーです。x,y,z軸方向のboxの大きさを指定してください。 @@ -35,7 +34,7 @@ Suteraパッケージにおいてワールド内で設置されたオブジェ x: 1 y: 1 z: 1 - ``` + ``` #### sphere 球形のコライダーです。球の半径rを指定してください ``` @@ -52,19 +51,19 @@ Suteraパッケージにおいてワールド内で設置されたオブジェ ``` -- rigidbody 物理演算について記述する項目です - - gravity Trueに設定すると重力の影響を受けます - - mass 質量の設定で単位は[kg]です。明記しない場合は0となり重力がないという扱いになります - - Drag オブジェクトに影響する空気抵抗の大きさです。0の場合空気抵抗が0となります - - Angular_Drag トルクによって回転する際に、オブジェクトに影響する空気抵抗の大きさです。0の場合空気抵抗は0となります +- rigidbody: 物理演算について記述する項目です + - gravity: Trueに設定すると重力の影響を受けます + - mass: 質量の設定で単位は[kg]です。明記しない場合は0となり重力がないという扱いになります + - Drag: オブジェクトに影響する空気抵抗の大きさです。0の場合空気抵抗が0となります + - Angular_Drag: トルクによって回転する際に、オブジェクトに影響する空気抵抗の大きさです。0の場合空気抵抗は0となります ### specs ocjectをワールドに設置した際の位置や回転などといった情報を記述する部分です。 -- location ワールドにおけるオブジェクトのグローバル座標です。x,y,zの3次元直交座標系で記載します -- rotation オブジェクトの回転を表します。x,y,z,wのクォータニオンで記載します -- scale オブジェクトのスケールです。locationと同じくx,y,zの3次元直交座標系で記載します -- origin ワールドにおけるオブジェクトの原点です。グローバル座標で表され、オブジェクトをリスポーンした際にはこの位置にオブジェクトが移動します -- origin_rotation ワールドにオブジェクトがスポーンした際の角度を指定します。rotationと同様にx,y,z,wのクォータニオンで記載します +- location: ワールドにおけるオブジェクトのグローバル座標です。x,y,zの3次元直交座標系で記載します +- rotation: オブジェクトの回転を表します。x,y,z,wのクォータニオンで記載します +- scale: オブジェクトのスケールです。locationと同じくx,y,zの3次元直交座標系で記載します +- origin: ワールドにおけるオブジェクトの原点です。グローバル座標で表され、オブジェクトをリスポーンした際にはこの位置にオブジェクトが移動します +- origin_rotation: ワールドにオブジェクトがスポーンした際の角度を指定します。rotationと同様にx,y,z,wのクォータニオンで記載します ## yamlファイルの例 [model.yaml](./model.yaml)に本項目で説明したワールドに設置する3Dモデルに関するyamlファイルの例が記載されています。 From 45b9b43d21f14e8b650cd8a7ca3802f46c1529ac Mon Sep 17 00:00:00 2001 From: rekut Date: Sun, 18 Aug 2024 14:41:04 +0900 Subject: [PATCH 12/13] fix prh --- ...bout_model_of_sutera_package_using_yaml.md | 58 +++++++++---------- package/model.yaml | 6 +- 2 files changed, 32 insertions(+), 32 deletions(-) diff --git a/package/About_model_of_sutera_package_using_yaml.md b/package/About_model_of_sutera_package_using_yaml.md index 318357d..b36c8b0 100644 --- a/package/About_model_of_sutera_package_using_yaml.md +++ b/package/About_model_of_sutera_package_using_yaml.md @@ -1,33 +1,33 @@ # モデルのSuteraパッケージについて(yamlフォーマット) ## 概要 -Suteraパッケージではワールド内に設置された3Dモデルの情報を本項目で説明してるyamal^[1]フォーマットを用いて管理しています。 +Suteraパッケージではワールド内に設置された3Dモデルの情報を本項目で説明してるyaml^[1]フォーマットを用いて管理しています。 ## モデルのyamlファイルに必要な要素 Suteraパッケージにおいてワールド内で設置されたオブジェクトの位置や、3Dモデルへのパスといったオブジェクトに関する様々な情報を保持する必要があります。Suteraパッケージではそれらオブジェクトに関する情報を以下のような要素を持ったyamlファイルを用いて管理しています。 ### metadata ファイルの基本的な情報が記載される部分です。 -- type: Suteraパッケージのタイプを示します。オブジェクトの場合Sutera-objectと記載されます -- Sutera_version: 使用されているSuteraのバージョンが記載されます -- name: オブジェクトの名前が記載されます -- version: オブジェクトのバージョンが記載されます -- id: オブジェクトに割り振るidを記載します +- `type`: Suteraパッケージのタイプを示します。オブジェクトの場合Sutera-objectと記載されます +- `sutera_version`: 使用されているSuteraのバージョンが記載されます +- `name`: オブジェクトの名前が記載されます +- `version`: オブジェクトのバージョンが記載されます +- `id`: オブジェクトに割り振るidを記載します ### model 使用する3Dモデルのモデルデータに関して記述される部分です。 -- type: 使用する3Dモデルのファイルタイプを記載してください -- path: 使用する3Dモデルのファイルへの絶対パスを指定してください +- `type`: 使用する3Dモデルのファイルタイプを記載してください +- `path`: 使用する3Dモデルのファイルへの絶対パスを指定してください ### material 3Dモデルで使用するマテリアルに関して記述する部分です。 -- type: マテリアルに使用するファイルのタイプを記述してください -- path: マテリアルに使用するファイルの絶対パスを記述してください +- `type`: マテリアルに使用するファイルのタイプを記述してください +- `path`: マテリアルに使用するファイルの絶対パスを記述してください ### physics モデルの物理的挙動の設定に関して記述する部分です。 -- coliders: -コライダーに関して設定する部分です。配列であるため、設定しない場合は空配列[]を設定してください。コライダーを設定する際はコライダーのtypeと各タイプごとのパラメータを記述してください。以下にSuteraで使用できる主要なコライダーのタイプと設定項目の例を記載します。 - #### box +- `coliders`: +コライダーに関して設定する部分です。配列であるため、設定しない場合は空配列[]を設定してください。コライダーを設定する際はコライダーの`type`と各タイプごとのパラメータを記述してください。以下にSuteraで使用できる主要なコライダーのタイプと設定項目の例を記載します。 + #### `box` 箱型のコライダーです。x,y,z軸方向のboxの大きさを指定してください。 ``` type: box @@ -35,15 +35,15 @@ Suteraパッケージにおいてワールド内で設置されたオブジェ y: 1 z: 1 ``` - #### sphere - 球形のコライダーです。球の半径rを指定してください + #### `sphere` + 球形のコライダーです。球の半径`r`を指定してください ``` type: sphere r: 1 ``` - #### cupsule - カプセル方のコライダーです。球の半径rと高さhを指定してください + #### `cupsule` + カプセル方のコライダーです。球の半径`r`と高さ`h`を指定してください ``` type: sphere r: 1 @@ -51,19 +51,19 @@ Suteraパッケージにおいてワールド内で設置されたオブジェ ``` -- rigidbody: 物理演算について記述する項目です - - gravity: Trueに設定すると重力の影響を受けます - - mass: 質量の設定で単位は[kg]です。明記しない場合は0となり重力がないという扱いになります - - Drag: オブジェクトに影響する空気抵抗の大きさです。0の場合空気抵抗が0となります - - Angular_Drag: トルクによって回転する際に、オブジェクトに影響する空気抵抗の大きさです。0の場合空気抵抗は0となります +- `rigidbody`: 物理演算について記述する項目です + - `gravity`: `True`に設定すると重力の影響を受けます + - `mass`: 質量の設定で単位は`[kg]`です。明記しない場合は0となり重力がないという扱いになります + - `drag`: オブジェクトに影響する空気抵抗の大きさです。0の場合空気抵抗が0となります + - `angular_drag`: トルクによって回転する際に、オブジェクトに影響する空気抵抗の大きさです。0の場合空気抵抗は0となります -### specs -ocjectをワールドに設置した際の位置や回転などといった情報を記述する部分です。 -- location: ワールドにおけるオブジェクトのグローバル座標です。x,y,zの3次元直交座標系で記載します -- rotation: オブジェクトの回転を表します。x,y,z,wのクォータニオンで記載します -- scale: オブジェクトのスケールです。locationと同じくx,y,zの3次元直交座標系で記載します -- origin: ワールドにおけるオブジェクトの原点です。グローバル座標で表され、オブジェクトをリスポーンした際にはこの位置にオブジェクトが移動します -- origin_rotation: ワールドにオブジェクトがスポーンした際の角度を指定します。rotationと同様にx,y,z,wのクォータニオンで記載します +### `specs` +オブジェクトをワールドに設置した際の位置や回転などといった情報を記述する部分です。 +- `location`: ワールドにおけるオブジェクトのグローバル座標です。`x,y,z`の3次元直交座標系で記載します +- `rotation`: オブジェクトの回転を表します。`x,y,z,w`のクォータニオンで記載します +- `scale`: オブジェクトのスケールです。locationと同じく`x,y,z`の3次元直交座標系で記載します +- `origin`: ワールドにおけるオブジェクトの原点です。グローバル座標で表され、オブジェクトをリスポーンした際にはこの位置にオブジェクトが移動します +- `origin_rotation`: ワールドにオブジェクトがスポーンした際の角度を指定します。`rotation`と同様に`x,y,z,w`のクォータニオンで記載します ## yamlファイルの例 [model.yaml](./model.yaml)に本項目で説明したワールドに設置する3Dモデルに関するyamlファイルの例が記載されています。 diff --git a/package/model.yaml b/package/model.yaml index 764686b..6635848 100644 --- a/package/model.yaml +++ b/package/model.yaml @@ -1,7 +1,7 @@ metadata: type: Sutera-object sutera_version: 0.1.0 - name:sofa + name: sofa version: 0.2.0 id: ball @@ -20,8 +20,8 @@ physics: rigidbody: gravity: true mass: 50 - Drag: 1 - Angular_Drag: 0 + drag: 1 + angular_drag: 0 specs: location: From 81a9e6f19151b1b1e75d9330155bba33c4d49dd4 Mon Sep 17 00:00:00 2001 From: rekut Date: Mon, 2 Sep 2024 21:12:29 +0900 Subject: [PATCH 13/13] fix sentence see2et --- package/About_model_of_sutera_package_using_yaml.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package/About_model_of_sutera_package_using_yaml.md b/package/About_model_of_sutera_package_using_yaml.md index b36c8b0..7ea3c6d 100644 --- a/package/About_model_of_sutera_package_using_yaml.md +++ b/package/About_model_of_sutera_package_using_yaml.md @@ -36,14 +36,14 @@ Suteraパッケージにおいてワールド内で設置されたオブジェ z: 1 ``` #### `sphere` - 球形のコライダーです。球の半径`r`を指定してください + 球形のコライダーです。球の半径`r`を指定してください。 ``` type: sphere r: 1 ``` #### `cupsule` - カプセル方のコライダーです。球の半径`r`と高さ`h`を指定してください + カプセル方のコライダーです。球の半径`r`と高さ`h`を指定してください。 ``` type: sphere r: 1