質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Q&A

解決済

1回答

1865閲覧

[Unity3D] 揚力を実装したがこの値をどうやってゲーム内に組み込むべきなのか知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

0グッド

0クリップ

投稿2021/04/08 12:23

編集2021/04/08 23:53

揚力をサイト通りに記述して取得しているのですがこの値をどうやってゲーム内に組み込めばいいのでしょうか?
揚力が一定の値にすれば一定の高度で飛ぶことができると説明ありますが少なくなった場合多くなった場合また1揚力にたいしてどのくらい上昇すればいいのか?

質問ですが適当に適当に数字を割るなりしてそれなりの数値を算出すればいいのでしょうか?それとも何かちゃんとした上昇の公式等があるのでしょうか?

参考サイト: http://www.cfijapan.com/study/html/to099/html-to035/017b-Lift_CL.htm

cs

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class PlayerController : MonoBehaviour 6{ 7 [SerializeField] float wingsArea; //翼の面積 8 [SerializeField] float airDensity; //空気密度 9 [SerializeField] float speed; //速度 10 [SerializeField] float cl; //揚力係数 11 12 13 Rigidbody rb; 14 15 float L; //揚力 16 Vector3 moveVec; //向き 17 18 19 20 // Start is called before the first frame update 21 void Start() 22 { 23 rb = GetComponent<Rigidbody>(); 24 moveVec = new Vector3(0,0,0); 25 L = 0; 26 27 } 28 29 // Update is called once per frame 30 void Update() 31 { 32 if(Input.GetKey(KeyCode.W)) 33 { 34 cl += 1; 35 } 36 else if (Input.GetKey(KeyCode.S)) 37 { 38 cl += -1; 39 } 40 41 /////////////////////////////////////////////////////////////////////////// 42 L = (airDensity / 2) * wingsArea * speed * speed * cl; //揚力計算 43 moveVec.y = L / 1000; 44 /////////////////////////////////////////////////////////////////////////// 45 Debug.Log(L); 46 47 moveVec.z = speed; 48 } 49 50 51 void FixedUpdate() 52 { 53 rb.AddForce(moveVec); 54 55 56 } 57 58} 59

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2021/04/09 02:26

解決したように見えないのに解決済みとしたのはなぜですか? 回答者の返答待ちですよね。 理解できてないなら解決したとは到底言えません。結局同じ質問繰り返してるだけでリソースの無駄遣いです。
guest

回答1

0

ベストアンサー

※リンク先は読んでもわからなかった為揚力計算部分は正しいと仮定します。

適用自体はmoveVec.y = L / 1000;ここで行われています。(moveVec分の力をAddForceしている為)
但し「整数で割り算すると答えも整数になる」という仕様がある為小数点以下が切り捨てられてしまうのと、Update内の計算なのでTime.deltaTimeの掛け算が必要かなと思います。
Time.deltaTimeは0.16とかなのでとりあえず掛けてみた後、Debug.Log等でこの値を確認しながら値調整用の定数を掛け算するといいと思います。どれぐらい上昇するか等はそこで分かると思います。
moveVec.y = L * Time.deltaTime * 定数;

投稿2021/04/09 00:05

sakura_hana

総合スコア11427

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/04/09 01:15

つまり数式的なものはなく適当に気持ちいように修正しろということでしょうか?
sakura_hana

2021/04/11 10:12

あなたが算出した「L」が揚力として正しいのかどうか私にはわかりません。「/1000」がどこから出て来たかわかりませんが、計算上必要なら「/1000.0f」とすれば小数点以下もちゃんと出ます。 (ぱっと見数式としては合ってそうですが、正しい値が入っているかは不明なので正しい挙動をするかも不明) Time.deltaTimeを掛け算する理由は「毎フレームかける力」とする為です。ただ改めて見ると力の適用はFixedUpdateなので不要かもしれません。 「値がどう変わったらどう動きが変わるのか知りたいならまず試してみろ」というのが定数を掛けている理由なので、無くていいなと思ったら無くてもいいです。これはリアルな挙動を優先するかゲーム的な気持ち良さを優先するかの差なのであなたのお好みでどうぞ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問