<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>ゲーム数学 on Godot 4 レシピ</title><link>https://kamera25.github.io/godot_recipes/4.x/ja/math/index.html</link><description>Recent content in ゲーム数学 on Godot 4 レシピ</description><generator>Hugo -- gohugo.io</generator><language>ja</language><lastBuildDate>Tue, 09 Apr 2019 19:49:14 -0700</lastBuildDate><atom:link href="https://kamera25.github.io/godot_recipes/4.x/ja/math/index.xml" rel="self" type="application/rss+xml"/><item><title>補間</title><link>https://kamera25.github.io/godot_recipes/4.x/ja/math/interpolation/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kamera25.github.io/godot_recipes/4.x/ja/math/interpolation/index.html</guid><description>&lt;p&gt;&lt;strong&gt;線形補間&lt;/strong&gt;（リニア・インターポレーション）、あるいはその略称である&lt;strong&gt;lerp&lt;/strong&gt;は、ゲーム開発の現場で頻繁に用いられる概念です。初めて耳にする方には難解で技術的に聞こえてしまうかもしれませんが、このチュートリアルを通じてご覧いただけるように、実際には理解しやすいシンプルな原理でありながら、ゲームプログラミングにおいて幅広く応用可能な強力なツールなのです。&lt;/p&gt;
&lt;h2 id="数値補間処理"&gt;数値補間処理&lt;/h2&gt;
&lt;p&gt;線形補間の基本式は以下のようになります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript" data-lang="gdscript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;lerp&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;a&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; b&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; t&lt;span style="color:#eceff4"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#b48ead"&gt;1&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;-&lt;/span&gt; t&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt; a &lt;span style="color:#81a1c1"&gt;+&lt;/span&gt; t &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt; b
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この数式において、&lt;code&gt;a&lt;/code&gt; と &lt;code&gt;b&lt;/code&gt; は2つの値を表し、&lt;code&gt;t&lt;/code&gt; は補間量を示します。通常、&lt;code&gt;0&lt;/code&gt;（結果は&lt;code&gt;a&lt;/code&gt;）から&lt;code&gt;1&lt;/code&gt;（結果は&lt;code&gt;b&lt;/code&gt;）までの範囲で指定します。この関数は、指定された比率に基づいて2つの値の間に適切な中間値を求めます。具体例を挙げると以下となります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript" data-lang="gdscript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;x &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;lerp&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#b48ead"&gt;0&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;1&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0.75&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;# x is 0.75&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;x &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;lerp&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#b48ead"&gt;0&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;100&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0.5&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;# x is 50&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;x &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;lerp&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#b48ead"&gt;10&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;75&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0.3&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;# x is 29.5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;x &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;lerp&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#b48ead"&gt;30&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;2&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0.75&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;# x is 9&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この手法が「線形補間」と呼ばれる理由は、2点間の経路が直線であるためです。&lt;/p&gt;
&lt;p&gt;ノードのプロパティを&lt;code&gt;lerp()&lt;/code&gt;でアニメーション化できます。例えば、経過時間を希望する持続時間で割ると、0から1の間の値が得られ、これを使ってプロパティを滑らかに変化させることができます。このスクリプトでは、スプライトを開始サイズの5倍まで拡大しつつ、2秒間かけて徐々にフェードアウトさせます（&lt;code&gt;modulate.a&lt;/code&gt;を使用して)。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript" data-lang="gdscript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;extends&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;Sprite2D&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; time &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; duration &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;2&lt;/span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;# length of the effect&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;_process&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;delta&lt;span style="color:#eceff4"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; time &lt;span style="color:#81a1c1"&gt;&amp;lt;&lt;/span&gt; duration&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; time &lt;span style="color:#81a1c1"&gt;+=&lt;/span&gt; delta
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; modulate&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;a &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;lerp&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#b48ead"&gt;1&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; time &lt;span style="color:#81a1c1"&gt;/&lt;/span&gt; duration&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; scale &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;Vector2&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;ONE &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;lerp&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#b48ead"&gt;1&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;5&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; time &lt;span style="color:#81a1c1"&gt;/&lt;/span&gt; duration&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ベクトル補間"&gt;ベクトル補間&lt;/h2&gt;
&lt;p&gt;また、ベクトル間での補間もできます。&lt;code&gt;Vector2&lt;/code&gt; および &lt;code&gt;Vector3&lt;/code&gt; はどちらも &lt;code&gt;lerp()&lt;/code&gt; メソッドを提供しています。&lt;/p&gt;
&lt;p&gt;例：&lt;code&gt;Node3D&lt;/code&gt;ノードの前方方向ベクトルと左方向ベクトルのちょうど中間に位置するベクターを取得するには。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript" data-lang="gdscript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; forward &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;transform&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;basis&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;z
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; left &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; transform&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;basis&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;x
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; forward_left &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; forward&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;lerp&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;left&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0.5&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以下の例では、スプライトノードをマウスクリック位置に移動させています。各フレームごとにノードは目標位置まで10%ずつ近づきます。これにより、オブジェクトが近づくにつれて速度が徐々に減速する「接近」効果が得られます。&lt;/p&gt;</description></item><item><title>トランスフォーム</title><link>https://kamera25.github.io/godot_recipes/4.x/ja/math/transforms/index.html</link><pubDate>Tue, 09 Apr 2019 19:49:14 -0700</pubDate><guid>https://kamera25.github.io/godot_recipes/4.x/ja/math/transforms/index.html</guid><description>&lt;p&gt;このチュートリアルを読み進める前に、まずベクトルの概念とゲーム開発における使用方法を理解する必要があります。もし不十分と感じている場合、Godotドキュメントの、以下の入門記事を読むことを強くオススメします。
&lt;a href="https://docs.godotengine.org/ja/latest/tutorials/math/vector_math.html" target="_blank"&gt;ベクトル演算&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="2dトランスフォーム"&gt;2Dトランスフォーム&lt;/h2&gt;
&lt;p&gt;2D空間では、おなじみのX軸・Y軸座標平面を使用します。Godotでは（ほとんどのコンピュータグラフィックスアプリケーションと同様に）、&lt;strong&gt;Y&lt;/strong&gt;軸は下向きに定義されていることに注意してください。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-b32a70d103aa2530691449bd4a452df9" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/0_2d_coordinate_plane.png?width=250px" alt="alt" style="height: auto; width: 250px;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-b32a70d103aa2530691449bd4a452df9"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/0_2d_coordinate_plane.png?width=250px" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;まず、宇宙空間を漂流しているこの宇宙船について考えてみます。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-ad4041b36de94c4b08f5fa843b850b83" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/0_2d_rocket1.png?width=250px" alt="alt" style="height: auto; width: 250px;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-ad4041b36de94c4b08f5fa843b850b83"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/0_2d_rocket1.png?width=250px" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;船の進行方向は座標軸の&lt;strong&gt;X軸&lt;/strong&gt;と同じ方向を向いています。これを前進させたい場合は、&lt;strong&gt;X座標&lt;/strong&gt;に値を加えることで右方向へ移動させられます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript" data-lang="gdscript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;position &lt;span style="color:#81a1c1"&gt;+=&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;Vector2&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#b48ead"&gt;10&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;しかし、船が回転した場合はどうなるのでしょうか？&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-0d9f9914616f399b7586d94efb2356df" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/0_2d_rocket2.png?width=250px" alt="alt" style="height: auto; width: 250px;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-0d9f9914616f399b7586d94efb2356df"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/0_2d_rocket2.png?width=250px" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;船を前方に移動させるにはどうすれば良いでしょうか？学校で三角関数を学んでいた方なら、角度やサイン・コサインの概念を思い出し、&lt;code&gt;position += Vector2(10 * cos(angle), 10 * sin(angle))&lt;/code&gt;のような計算式を考えつくかもしれません。この方法でも実現できますが、より便利な方法があります。それは &lt;em&gt;トランスフォーム(Transform)&lt;/em&gt; です。&lt;/p&gt;
&lt;p&gt;もう一度回転した船を見てみてください。今回は、その船が独自の &lt;strong&gt;X&lt;/strong&gt; 軸と &lt;strong&gt;Y&lt;/strong&gt; 軸を持っており、それらは世界的な座標系とは独立して移動していることを想定します。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-e1c1c34fb9c129b9bb2fd6c9adc29819" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/0_2d_rocket3.png?width=250px" alt="alt" style="height: auto; width: 250px;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-e1c1c34fb9c129b9bb2fd6c9adc29819"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/0_2d_rocket3.png?width=250px" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;これらの「ローカル」座標軸は、オブジェクトの &lt;code&gt;transform&lt;/code&gt; プロパティに含まれています。&lt;/p&gt;
&lt;p&gt;この特性を利用すれば、船を&lt;strong&gt;X軸&lt;/strong&gt;に沿って移動させることで簡単に前進できます。角度計算や三角関数を気にする必要もありません。Godotでこれを実現するには、すべての&lt;a href="[https://link]%28https://docs.godotengine.org/ja/latest/classes/class_node2d.html%29"&gt;&lt;i class="gd-Node2D"&gt;&lt;/i&gt;&lt;code&gt;Node2D&lt;/code&gt;&lt;/a&gt; の派生ノードで利用できる&lt;code&gt;transform&lt;/code&gt;プロパティを使用します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript" data-lang="gdscript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; position &lt;span style="color:#81a1c1"&gt;+=&lt;/span&gt; transform&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;x &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt; &lt;span style="color:#b48ead"&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このコードは「変換の x ベクトルに 10 を乗算した結果を追加する」という意味です。これを分解して説明します。&lt;code&gt;transform&lt;/code&gt; オブジェクトには &lt;code&gt;x&lt;/code&gt; と &lt;code&gt;y&lt;/code&gt; プロパティがあり、これらはローカル座標軸を表しています。これらは「単位ベクトル」であり、その長さは &lt;code&gt;1&lt;/code&gt; です。単位ベクトルは別の言い方で「方向ベクトル」とも呼ばれます。これは船の &lt;strong&gt;x&lt;/strong&gt; 軸が指し示す方向を示しています。この値に &lt;code&gt;10&lt;/code&gt; を掛けることで、より長い距離に対応するようにスケール変換しています。&lt;/p&gt;
&lt;div class="box notices cstyle tip"&gt;
&lt;div class="box-label"&gt;&lt;i class="fa-fw fas fa-lightbulb"&gt;&lt;/i&gt; ヒント&lt;/div&gt;
&lt;div class="box-content"&gt;
&lt;p&gt;ノードの &lt;code&gt;transform&lt;/code&gt; プロパティは親ノードに対する相対値です。グローバル座標が必要な場合は、&lt;code&gt;global_transform&lt;/code&gt; を参照してください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;ローカル座標系に加えて、この変換には &lt;code&gt;origin(原点)&lt;/code&gt; と呼ばれるコンポーネントも含まれています。原点は位置の &lt;em&gt;移動量&lt;/em&gt;、すなわち変化した位置を表します。&lt;/p&gt;</description></item><item><title>ベクトル：内積と外積の活用</title><link>https://kamera25.github.io/godot_recipes/4.x/ja/math/dot_cross_product/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kamera25.github.io/godot_recipes/4.x/ja/math/dot_cross_product/index.html</guid><description>&lt;h2 id="課題"&gt;課題&lt;/h2&gt;
&lt;p&gt;「内積」と「外積」の意味を理解したい。&lt;/p&gt;
&lt;h2 id="解決策"&gt;解決策&lt;/h2&gt;
&lt;p&gt;このレシピでは、ベクトルの「内積」と「外積」の概念を紹介し、それらがどのように活用できるかを説明します。&lt;/p&gt;
&lt;h3 id="内積"&gt;内積&lt;/h3&gt;
&lt;p&gt;内積は二つのベクトルに対して行われる演算で、スカラー値を返します。これは通常、ベクトルAがベクトルBに投影される様子として視覚化されます。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-3058cd9822e07673775629b64a44f50c" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/dot_cross_04.png" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-3058cd9822e07673775629b64a44f50c"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/dot_cross_04.png" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;以下が内積を計算するための公式です。&lt;/p&gt;
&lt;p&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML" display="block" mathsize="200%"&gt;&amp;gt;
&lt;mi&gt;A&lt;/mi&gt;
&lt;mo&gt;⋅&lt;/mo&gt;
&lt;mi&gt;B&lt;/mi&gt;
&lt;mo&gt;=&lt;/mo&gt;
&lt;mo fence="true" form="prefix"&gt;∥&lt;/mo&gt;
&lt;mi&gt;A&lt;/mi&gt;
&lt;mo fence="true" form="postfix"&gt;∥&lt;/mo&gt;
&lt;mo fence="true" form="prefix"&gt;∥&lt;/mo&gt;
&lt;mi&gt;B&lt;/mi&gt;
&lt;mo fence="true" form="postfix"&gt;∥&lt;/mo&gt;
&lt;mi&gt;cos&lt;/mi&gt;
&lt;mi&gt;θ&lt;/mi&gt;
&lt;/math&gt;&lt;/p&gt;
&lt;p&gt;ここで&lt;code&gt;θ&lt;/code&gt;は2つのベクトル間の角度、&lt;code&gt;||A||&lt;/code&gt;は&lt;code&gt;A&lt;/code&gt;の大きさを表します。&lt;/p&gt;
&lt;p&gt;これは両方のベクトルが正規化されている場合（つまり、その大きさがすべて&lt;code&gt;1&lt;/code&gt;である場合）に特に有用です。その場合、公式は以下のように簡略化されます。&lt;/p&gt;
&lt;p&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML" display="block" mathsize="200%"&gt;&amp;gt;
&lt;mi&gt;A&lt;/mi&gt;
&lt;mo&gt;⋅&lt;/mo&gt;
&lt;mi&gt;B&lt;/mi&gt;
&lt;mo&gt;=&lt;/mo&gt;
&lt;mi&gt;cos&lt;/mi&gt;
&lt;mi&gt;θ&lt;/mi&gt;
&lt;/math&gt;&lt;/p&gt;
&lt;p&gt;この結果から、内積が二つのベクトル間の角度と直接関係していることがわかります。&lt;code&gt;cos(0) == 1&lt;/code&gt; かつ &lt;code&gt;cos(180) == -1&lt;/code&gt; であることから、内積の値は二つのベクトルがどれだけ平行しているかを示します。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-3ee5ef67690edf790657a50ebbd59e36" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/dot_cross_05.png" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-3ee5ef67690edf790657a50ebbd59e36"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/dot_cross_05.png" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;以下に、この事実を実際の事例でどのように活用できるかご説明します。&lt;/p&gt;
&lt;h3 id="外積"&gt;外積&lt;/h3&gt;
&lt;p&gt;二つのベクトルの外積は、それらに垂直な第三のベクトルであり、その大きさは各ベクトルの大きさとそれらの間の角度によって決まります。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-62d365b784c922b193194a12b267b7f2" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/dot_cross_06.gif" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-62d365b784c922b193194a12b267b7f2"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/dot_cross_06.gif" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;もう一度確認しますが、正規化ベクトルを使用している場合、結果は以下のように簡略化されます。これは角度と完全に関連しており、その値は-1から1の範囲で変化します。&lt;/p&gt;
&lt;div class="box notices cstyle note"&gt;
&lt;div class="box-label"&gt;&lt;i class="fa-fw fas fa-exclamation-circle"&gt;&lt;/i&gt; メモ&lt;/div&gt;
&lt;div class="box-content"&gt;
&lt;p&gt;クロス積は両方のベクトルに垂直な値となるため、この計算するには3D空間で作業している必要があります。Godotを含むほとんどの2Dフレームワークでは、&lt;code&gt;Vector2.cross()&lt;/code&gt; メソッドは結果の大きさを表すスカラー値を返します。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="実用的な応用例"&gt;実用的な応用例&lt;/h3&gt;
&lt;p&gt;以下のアニメーションをご覧ください。これは &lt;code&gt;Vector2.dot()&lt;/code&gt; と &lt;code&gt;Vector2.cross()&lt;/code&gt; の結果が、角度の変化に伴ってどのように変わるかを視覚的に示しています。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-acbab421382e1242988dfdc5de70bb62" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/dot_cross_01.gif" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-acbab421382e1242988dfdc5de70bb62"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/dot_cross_01.gif" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;この例は、これらの手法の2つのよくある応用事例を示しています。赤色ベクトルが対象物の前方方向を表し、緑色ベクトルが他の物体に向かう方向を示す場合。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;内積：結果から、対象物体が前方（&lt;code&gt;＞0&lt;/code&gt;）にあるか後方（&lt;code&gt;＜0&lt;/code&gt;）にあるかを判断できます。&lt;/li&gt;
&lt;li&gt;外積：結果から、対象物体が左側（&lt;code&gt;＞0&lt;/code&gt;）にあるか右側（&lt;code&gt;＜0&lt;/code&gt;）にあるかを判定できます。&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>