<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>3Dで自動車を作ろう on Godot 4 レシピ</title><link>https://kamera25.github.io/godot_recipes/4.x/ja/3d/kinematic_car/index.html</link><description>Recent content in 3Dで自動車を作ろう on Godot 4 レシピ</description><generator>Hugo -- gohugo.io</generator><language>ja</language><lastBuildDate>Wed, 09 Dec 2020 20:23:50 -0700</lastBuildDate><atom:link href="https://kamera25.github.io/godot_recipes/4.x/ja/3d/kinematic_car/index.xml" rel="self" type="application/rss+xml"/><item><title>3Dで自動車を作ろう：ベースモデル</title><link>https://kamera25.github.io/godot_recipes/4.x/ja/3d/kinematic_car/car_base/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kamera25.github.io/godot_recipes/4.x/ja/3d/kinematic_car/car_base/index.html</guid><description>&lt;div class="box notices cstyle tips"&gt;
&lt;div class="box-label"&gt;ℹ️ 留意事項&lt;/div&gt;
&lt;div class="box-content"&gt;
&lt;p&gt;この記事は Godot 3から Godot 4 へ内容の書き換え中です。
Godot4では存在しない変数、関数が含まれている場合があります。もしその場合はリポジトリの&lt;a href="https://github.com/kamera25/godot_recipes/issues" target="_blank"&gt;Issues&lt;/a&gt;までご報告ください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="課題"&gt;課題&lt;/h2&gt;
&lt;p&gt;3Dドライビング/レーシングゲームを作りたいが、どこから手をつければいいかわからない。&lt;/p&gt;
&lt;h2 id="解決策"&gt;解決策&lt;/h2&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環境においても、車両は基本的に地面に留まる性質があります。このため、移動処理の多くは実質的に2Dと同様の扱いができます。車の動作コードの大部分は、&lt;a href="https://kamera25.github.io/godot_recipes/4.x/ja/2d/car_steering"&gt;2D用カーステアリングレシピ&lt;/a&gt;と非常に似た構造になります。このチュートリアルに進む前に、必ずそのレシピを確認しておくことをオススメします。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Godotには&lt;i class="gd-VehicleBody3D"&gt;&lt;/i&gt;&lt;code&gt;VehicleBody&lt;/code&gt;ノードが用意されており、これは&lt;i class="gd-RigidBody3D"&gt;&lt;/i&gt;&lt;code&gt;RigidBody&lt;/code&gt;をベースに、エンジン・ブレーキング・サスペンションなど複雑な物理挙動をシミュレートする機能を備えています。ただし、このアプローチは過剰な複雑さを伴うため、一般的なカジュアルレース／ドライビングゲームには不向きです。そこでここでは、CharacterBody3Dベースの解決策を採用します。&lt;/p&gt;
&lt;p&gt;&lt;i class="gd-VehicleBody3D"&gt;&lt;/i&gt;
&lt;div class="box notices cstyle info"&gt;
&lt;div class="box-label"&gt;&lt;i class="fa-fw fas fa-info-circle"&gt;&lt;/i&gt; 情報&lt;/div&gt;
&lt;div class="box-content"&gt;
&lt;p&gt;VehicleBody3D&lt;code&gt;車両ボディ&lt;/code&gt;の操作方法について詳しく知りたい方には、&lt;a href="https://youtu.be/B5vE-nNszxA" target="_blank"&gt;Bastiaan Olij氏によるこのシリーズ動画&lt;/a&gt;を強くオススメします。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;h3 id="車両設定手順"&gt;車両設定手順&lt;/h3&gt;
&lt;p&gt;コーディングを開始する前に、まず自動車の3Dモデルを見つけてGodotにインポートする必要があります。&lt;/p&gt;
&lt;h4 id="モデルのインポート方法"&gt;モデルのインポート方法&lt;/h4&gt;
&lt;p&gt;以下はこのデモンストレーションで使用する車両モデルです。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-ceadbeae905756752c0341470949e39c" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/3d_car_01.png" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-ceadbeae905756752c0341470949e39c"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/3d_car_01.png" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&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;Kenny氏の『カーキット』でこの車種やその他のモデルを見つけることができます。以下のリンクから入手できます。
&lt;a href="https://kenney.nl/assets/car-kit" target="_blank"&gt;https://kenney.nl/assets/car-kit&lt;/a&gt;。キット全体をダウンロードすれば、後で他の車両も使用できます。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;車を読み込むには、&lt;code&gt;&amp;quot;Models/GLTF format&amp;quot;&lt;/code&gt;フォルダ内で該当モデルを探してください。今回は&lt;code&gt;sedanSports.glb&lt;/code&gt;を使用します。このファイルを新規Godotプロジェクトにインポートし、できれば&lt;code&gt;res://assets/cars/&lt;/code&gt;のような専用フォルダにまとめておくと良いでしょう。&lt;/p&gt;
&lt;p&gt;Godotでファイルを選択し、「インポート」タブに移動します。_ルートタイプ_を「CharacterBody3D」に変更し、「再インポート」をクリックします。これでこの車を使用する準備が整いました。&lt;/p&gt;
&lt;h4 id="hahahugoshortcode213s7hbhb-キャラクター用-body3d-の設定"&gt;&lt;i class="gd-KinematicBody3D"&gt;&lt;/i&gt; キャラクター用 Body3D の設定&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;sedanSports.glb&lt;/code&gt;ファイルをダブルクリックし、「新規継承」を選択してください。以下のように新しいシーンが作成されます。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-ed2d899805bd0ea1d0431556c6f3aa8e" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/3d_car_02.png" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-ed2d899805bd0ea1d0431556c6f3aa8e"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/3d_car_02.png" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;※各パーツごとの個別メッシュに注意。なお、余分な「tmpParent」&lt;i class="gd-Node3D"&gt;&lt;/i&gt;&lt;code&gt;Node3D&lt;/code&gt;ノードがありますが、こちらは無視して構いません。&lt;/p&gt;
&lt;p&gt;&lt;i class="gd-KinematicBody3D"&gt;&lt;/i&gt;&lt;code&gt;CharacterBody3D&lt;/code&gt; には衝突形状の欠落に関する警告メッセージが表示されています。まずはこの問題を修正する必要があります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;i class="gd-CollisionShape3D"&gt;&lt;/i&gt;&lt;code&gt;CollisionShape&lt;/code&gt; を追加してください。&lt;/li&gt;
&lt;li&gt;車両本体用に &lt;i class="gd-BoxShape3D"&gt;&lt;/i&gt;&lt;code&gt;BoxShape&lt;/code&gt; を設定します。&lt;/li&gt;
&lt;li&gt;前輪用と後輪用にそれぞれ1つずつ &lt;i class="gd-CylinderShape3D"&gt;&lt;/i&gt;&lt;code&gt;CylinderShape&lt;/code&gt; をおきます。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;形状設定が完了したら、以下のような表示になるはずです。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-63f7d0764b73edc19614be243fc07c7f" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/3d_car_03.png" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-63f7d0764b73edc19614be243fc07c7f"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/3d_car_03.png" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&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;i class="gd-CollisionShape3D"&gt;&lt;/i&gt;&lt;code&gt;CollisionShape&lt;/code&gt;ノードには &lt;code&gt;CollisionBody&lt;/code&gt;、&lt;code&gt;CollisionWheelsFront&lt;/code&gt;、&lt;code&gt;CollisionWheelsRear&lt;/code&gt;といった名称が適切でしょう。&lt;/p&gt;</description></item><item><title>3Dで自動車を作ろう：牽引とドリフト</title><link>https://kamera25.github.io/godot_recipes/4.x/ja/3d/kinematic_car/car_traction/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kamera25.github.io/godot_recipes/4.x/ja/3d/kinematic_car/car_traction/index.html</guid><description>&lt;div class="box notices cstyle tips"&gt;
&lt;div class="box-label"&gt;ℹ️ 留意事項&lt;/div&gt;
&lt;div class="box-content"&gt;
&lt;p&gt;この記事は Godot 3から Godot 4 へ内容の書き換え中です。
Godot4では存在しない変数、関数が含まれている場合があります。もしその場合はリポジトリの&lt;a href="https://github.com/kamera25/godot_recipes/issues" target="_blank"&gt;Issues&lt;/a&gt;までご報告ください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="課題"&gt;課題&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://kamera25.github.io/godot_recipes/4.x/ja/3d/kinematic_car/car_base/"&gt;キネマティックカー&lt;/a&gt;で高速走行時に「レール上を走っている」ような感覚が気にいりません。ドリフトやトラクション損失を可能にするため、ある程度の「スリップ」特性が欲しいです。&lt;/p&gt;
&lt;h2 id="解決策"&gt;解決策&lt;/h2&gt;
&lt;p&gt;車がドリフト走行している場合、進行方向（向いている向き）と速度ベクトル（移動方向）は必ずしも一致しません。ハンドルを切ると車は旋回しますが、速度ベクトルはすぐに追従してくれません。代わりに &lt;code&gt;lerp()&lt;/code&gt; 関数を使用して、徐々に目標方向への速度を調整します。&lt;/p&gt;
&lt;p&gt;以下の新しい変数を&lt;code&gt;car_base.gd&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:#d08770"&gt;@export&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; slip_speed &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;9.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d08770"&gt;@export&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; traction_slow &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0.75&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d08770"&gt;@export&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; traction_fast &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0.02&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; drifting &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;slip_speed&lt;/code&gt;は、車のトラクションが失われる前に到達すべき速度を指定します。この値は、車の他のパラメーターに合わせて調整が必要となります。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;traction_slow&lt;/code&gt; および &lt;code&gt;traction_fast&lt;/code&gt; は、&lt;code&gt;slip_speed&lt;/code&gt; 以下またはそれ以上におけるトラクション特性を表し、値は &lt;code&gt;0&lt;/code&gt;～&lt;code&gt;1&lt;/code&gt; の範囲で設定されます。数値が小さいほど車両は「滑りやすい」感覚が強くなります。これらを &lt;code&gt;1&lt;/code&gt; に設定すると、「レール上を走る」ように全く滑らない状態になります。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;drifting&lt;/code&gt; はドリフト状態を追跡するためのブール変数です。&lt;/p&gt;
&lt;p&gt;次に、&lt;code&gt;car_base.gd&lt;/code&gt; ファイルの &lt;code&gt;calculate_steering()&lt;/code&gt; 関数内で、&lt;code&gt;new_heading&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:#616e87;font-style:italic"&gt;# traction&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; &lt;span style="color:#81a1c1;font-weight:bold"&gt;not&lt;/span&gt; drifting &lt;span style="color:#81a1c1;font-weight:bold"&gt;and&lt;/span&gt; velocity&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;length&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;&amp;gt;&lt;/span&gt; slip_speed&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; drifting &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;true&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; drifting &lt;span style="color:#81a1c1;font-weight:bold"&gt;and&lt;/span&gt; velocity&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;length&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;&amp;lt;&lt;/span&gt; slip_speed &lt;span style="color:#81a1c1;font-weight:bold"&gt;and&lt;/span&gt; steer_angle &lt;span style="color:#81a1c1"&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;span style="display:flex;"&gt;&lt;span&gt; drifting &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;false&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; traction &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; traction_fast &lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; drifting &lt;span style="color:#81a1c1;font-weight:bold"&gt;else&lt;/span&gt; traction_slow
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このコードでは状況に応じて&lt;code&gt;drifting(ドリフト値)&lt;/code&gt;を設定し、その後どのトラクション値を使用するかを決定します。&lt;/p&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;velocity &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; new_heading &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt; velocity&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;length&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;</description></item><item><title>3Dで自動車を作ろう：カメラで追いかけよう</title><link>https://kamera25.github.io/godot_recipes/4.x/ja/3d/kinematic_car/car_camera/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kamera25.github.io/godot_recipes/4.x/ja/3d/kinematic_car/car_camera/index.html</guid><description>&lt;div class="box notices cstyle tips"&gt;
&lt;div class="box-label"&gt;ℹ️ 留意事項&lt;/div&gt;
&lt;div class="box-content"&gt;
&lt;p&gt;この記事は Godot 3から Godot 4 へ内容の書き換え中です。
Godot4では存在しない変数、関数が含まれている場合があります。もしその場合はリポジトリの&lt;a href="https://github.com/kamera25/godot_recipes/issues" target="_blank"&gt;Issues&lt;/a&gt;までご報告ください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="課題"&gt;課題&lt;/h2&gt;
&lt;p&gt;車（またはその他の物体）を追跡できる「追従カメラ」を実装したい。&lt;/p&gt;
&lt;h2 id="解決策"&gt;解決策&lt;/h2&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;Godot には組み込みの &lt;code&gt;InterpolatedCamera&lt;/code&gt; ノードが用意されており、ここで説明している機能の大部分をすでに実装しています。ただし、このノードを使用しない理由は2つあります。まず、キャラクターボディを追いかける際にカクツキが発生しやすい点、次に Godot 4.0 で廃止予定となっている点です。とはいえ、独自のセットアップは非常に簡単ですので、ご安心ください。&lt;i class='far fa-smile-beam'&gt;&lt;/i&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="カメラのセットアップ方法"&gt;カメラのセットアップ方法&lt;/h3&gt;
&lt;p&gt;新しいシーンを&lt;i class="gd-Camera3D"&gt;&lt;/i&gt;&lt;code&gt;Camera3D&lt;/code&gt;で追加してください。名前は&lt;code&gt;ChaseCamera&lt;/code&gt;とし、保存してからスクリプトを追加してください。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ChaseCamera&lt;/code&gt;には追跡対象の&lt;code&gt;target&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;Camera&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:#d08770"&gt;@export&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; lerp_speed &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;10.0&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; target &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;null&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;_physics_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; &lt;span style="color:#81a1c1"&gt;!&lt;/span&gt;target&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; global_transform &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; global_transform&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;interpolate_with&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;target&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;global_transform&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; lerp_speed &lt;span style="color:#81a1c1"&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&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;_on_change_camera&lt;/span&gt;&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; target &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; t
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この設定で重要なのは&lt;code&gt;lerp_speed&lt;/code&gt;パラメーターのみです。これはカメラが位置を更新する速度を調整する値です。値を小さくするとカメラは車の動きに「遅れて」追従し、大きく設定すると常に車両に固定された状態になります。&lt;/p&gt;
&lt;h3 id="ターゲットの設定"&gt;ターゲットの設定&lt;/h3&gt;
&lt;p&gt;複数の異なるカメラポジションを設定したいと考えています。例えば、近距離用と遠距離用の2種類、あるいは真下を見下ろすアングルなどです。車オブジェクトに &lt;i class="gd-Node3D"&gt;&lt;/i&gt;&lt;code&gt;Node3D&lt;/code&gt; を追加し、名前を &lt;code&gt;CameraPositions&lt;/code&gt; とします。さらにこのオブジェクトに、必要な数だけ &lt;i class="gd-Marker3D"&gt;&lt;/i&gt;&lt;code&gt;Marker3D&lt;/code&gt; を配置してください。&lt;/p&gt;
&lt;p&gt;&lt;i class="gd-Marker3D"&gt;&lt;/i&gt;&lt;code&gt;Marker3D&lt;/code&gt; をお好みの位置に移動・配置してください。位置の &lt;strong&gt;-Z&lt;/strong&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;i class="gd-Camera3D"&gt;&lt;/i&gt;&lt;code&gt;Camera&lt;/code&gt; を適切な位置に配置し、「プレビュー」モードを使用して、&lt;i class="gd-Marker3D"&gt;&lt;/i&gt;&lt;code&gt;Marker3D&lt;/code&gt; が正確に狙いたい方向を指すように調整する方法が有効です（作業完了後はカメラを削除してください）。
&lt;a href="#image-a5237857058563dc36e855310ea219c8" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/3d_car_09.png" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-a5237857058563dc36e855310ea219c8"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/3d_car_09.png" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;</description></item><item><title>3Dで自動車を作ろう：傾斜面＆スロープ</title><link>https://kamera25.github.io/godot_recipes/4.x/ja/3d/kinematic_car/car_slopes/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kamera25.github.io/godot_recipes/4.x/ja/3d/kinematic_car/car_slopes/index.html</guid><description>&lt;div class="box notices cstyle tips"&gt;
&lt;div class="box-label"&gt;ℹ️ 留意事項&lt;/div&gt;
&lt;div class="box-content"&gt;
&lt;p&gt;この記事は Godot 3から Godot 4 へ内容の書き換え中です。
Godot4では存在しない変数、関数が含まれている場合があります。もしその場合はリポジトリの&lt;a href="https://github.com/kamera25/godot_recipes/issues" target="_blank"&gt;Issues&lt;/a&gt;までご報告ください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="課題"&gt;課題&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://kamera25.github.io/godot_recipes/4.x/ja/3d/kinematic_car/car_base/"&gt;キネマティックカー&lt;/a&gt; は斜面を登れるようになりましたが、見た目が少し不自然です。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-efc58f5cc42934cfb9251c75a38bfc53" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/3d_car_10.png" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-efc58f5cc42934cfb9251c75a38bfc53"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/3d_car_10.png" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="解決策"&gt;解決策&lt;/h2&gt;
&lt;p&gt;運動体は衝突時に自動で回転しません。画像のように車輪が地面に接触していない場合、手動で車を整列させる必要があります。&lt;/p&gt;
&lt;p&gt;まず、車輪が地面に接触していない状況を検出する必要があります。車に2つの &lt;i class="gd-RayCast3D"&gt;&lt;/i&gt;&lt;code&gt;RayCast&lt;/code&gt; ノードを追加し、以下のように前輪と後輪にそれぞれ配置します。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-d89b9b6f2901b05ca71d9c55e62c60f4" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/3d_car_11.png" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-d89b9b6f2901b05ca71d9c55e62c60f4"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/3d_car_11.png" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;両方の場合、［キャスト先］を（0、-0.25、0）に設定し、「有効」ボックスのチェックを忘れずに行ってください。&lt;/p&gt;
&lt;h3 id="3dオブジェクトの整列方法"&gt;3Dオブジェクトの整列方法&lt;/h3&gt;
&lt;p&gt;[CharacterBody3D: 表面に合わせる]レシピのコードを再利用します。これを&lt;code&gt;car_base.gd&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;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;align_with_y&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;xform&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; new_y&lt;span style="color:#eceff4"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; xform&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;basis&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;y &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; new_y
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; xform&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;basis&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;x &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;xform&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;basis&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;z&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;cross&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;new_y&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; xform&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;basis &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; xform&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;basis&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;orthonormalized&lt;/span&gt;&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; xform
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;_physics_process()&lt;/code&gt; 関数内で &lt;code&gt;move_and_slide_with_snap()&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:#616e87;font-style:italic"&gt;# If either wheel is in the air, align to slope.&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; $FrontRay&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;is_colliding&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;or&lt;/span&gt; $RearRay&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;is_colliding&lt;/span&gt;&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:#616e87;font-style:italic"&gt;# If one wheel is in air, move it down&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; nf &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; $FrontRay&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;get_collision_normal&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; $FrontRay&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;is_colliding&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;else&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;Vector3&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;UP
&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; nr &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; $RearRay&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;get_collision_normal&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; $RearRay&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;is_colliding&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;else&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;Vector3&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;UP
&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; n &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#eceff4"&gt;((&lt;/span&gt;nr &lt;span style="color:#81a1c1"&gt;+&lt;/span&gt; nf&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;/&lt;/span&gt; &lt;span style="color:#b48ead"&gt;2.0&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;normalized&lt;/span&gt;&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;var&lt;/span&gt; xform &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;align_with_y&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;global_transform&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; n&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; global_transform &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; global_transform&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;interpolate_with&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;xform&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0.1&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;h3 id="使用方法"&gt;使用方法&lt;/h3&gt;
&lt;p&gt;どちらの車輪も地面に接していない場合、車はまったく回転しません。&lt;/p&gt;</description></item></channel></rss>