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

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

新規登録して質問してみよう
ただいま回答率
85.46%
Unity3D

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

2019閲覧

Unityで微分するにはどうすればいいのでしょうか?

integral2ydx

総合スコア7

Unity3D

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2021/12/23 09:37

前提・実現したいこと

Unityで速度を微分して加速度を求めたいです。
最終的には張力を求めたいのでT=maからmとaが必要です。

現在速度を表示させるところまではできています。

該当のソースコード

// 前のフレームでの位置を記録しておくフィールド private Vector2 previousPosition; // 計算された速度 public Vector2 velocity; void FixedUpdate() { // 前のフレームからどれだけ移動したかを求め、それを経過時間で割って速度とする this.velocity = (this.rigidbody2D.position - this.previousPosition) / Time.deltaTime; // その後、次回の更新に備えて現在の位置をpreviousPositionに保存する this.previousPosition = this.rigidbody2D.position; Debug.Log(gameObject.name+"の速度は"+this.velocity.magnitude); }

試したこと

”Unity微分”等のキーワードで調べてみたのですが、積分についての記事は見つかるのですが微分に関しての記事が見つかりませんでした。

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

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

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

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

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

guest

回答1

0

ベストアンサー

経過時間で増加した速度が加速度になるので、算出した速度を保存しておき、差分を経過時間で割ることで算出できるかと思います。

float lastVelocity = 0.0f; void FixedUpdate(){ ... // 加速度 float a = (this.velocity - lastVelocity) / Time.deltaTime; lastVelocity = this.velocity ... }

https://www.try-it.jp/chapters-8001/sections-8002/lessons-8018/

投稿2021/12/23 16:17

Kapustin

総合スコア1186

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

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

integral2ydx

2021/12/25 16:44

返信ありがとうございます!遅くなり申し訳ございません。 高校でそこらへん習いました!完全に忘れてました、、
integral2ydx

2022/01/10 10:51

/// float lastVelocity = 0.0f; void FixedUpdate() { // 前のフレームからどれだけ移動したかを求め、それを経過時間で割って速度とする this.velocity = (this.rigidbody2D.position - this.previousPosition) / Time.deltaTime; // その後、次回の更新に備えて現在の位置をpreviousPositionに保存する this.previousPosition = this.rigidbody2D.position; // 加速度 float a = (velocity - lastVelocity) / Time.deltaTime; lastVelocity = this.velocity // 速度を表示 Debug.Log(gameObject.name+"の加速度: " ); } /// すいません、こんな感じで打ってみたのですが、演算子"-"を"Vector2"と"float"型のオペランドに適用することができませんとあったのですがVector2では使えないのでしょうか?
Kapustin

2022/01/10 16:10 編集

失礼しました。。 速度ベクトルとして保存していましたね。この場合 Vector2 lastVelocity = 0.0f; void FixedUpdate(){ ... // 加速度 Vector2 a = (this.velocity - lastVelocity) / Time.deltaTime; lastVelocity = this.velocity ... } で求められるかと思います。もし速さ(ベクトルの長さ)で処理したい場合はmagunitudeを使うと良いです。 https://docs.unity3d.com/ja/current/ScriptReference/Vector2-magnitude.html Vector2 lastVelocity = 0.0f; void FixedUpdate(){ ... // 加速度 float a = (this.velocity.magnitude - lastVelocity.magnitude) / Time.deltaTime; lastVelocity = this.velocity ... }
integral2ydx

2022/01/11 01:05

なるほどです。時間がたっているのに丁寧に答えてくださりありがとうございます! Unity初心者から見るとfloatの部分をVector2に変えただけに見えるんですけど、floatは小数型の変数を定義するときに使うと習ったのですが、Vector2というものはfloatと同じ役割を果たすのでしょうか? 逆にベクトルの長さで求めるときは、floatでいいのがよくわかりません。
integral2ydx

2022/01/11 02:02

Vector2 a = (this.velocity - lastVelocity) / Time.deltaTime; すいません。まだこの部分でエラーがあります。
Kapustin

2022/01/11 13:51 編集

> Vector2というものはfloatと同じ役割を果たすのでしょうか? 「同じ役割」ではなく、Vector2はその名の通り2次元ベクトルを処理するクラスです。 x成分とy成分がそれぞれfloat型で表現されています。 > 逆にベクトルの長さで求めるときは、floatでいいのがよくわかりません。 長さの場合はスカラー値なので、floatで大丈夫です。 > まだこの部分でエラーがあります。 どのようなエラーでしょうか?
integral2ydx

2022/01/12 06:18

自分の前提知識が浅いのであっているのかわかりませんが、 Vector2 lastVelocity = 0.0f;のところはvelocityがスカラー値ではないからfloatがつかえないから仕方なくVector2にしているということでしょうか?
integral2ydx

2022/01/12 06:20

// 加速度 Vector2 a = (this.velocity - lastVelocity) / Time.deltaTime;の this.velocity - lastVelocityでCS0034;Vecor3およびVector2のオペランド演算子-があいまいです。といわれています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問