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

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

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

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

Q&A

解決済

1回答

1376閲覧

Unityのコードについての質問

hanako1025

総合スコア7

C#

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

0グッド

1クリップ

投稿2018/01/14 08:11

編集2018/02/05 18:57

###前提・実現したいこと
GAに興味を持ち、こちらの下部で配布されているソースコードを拝見したのですが、足がどのような動きになるのか分からず行き詰まっています。
どなたかご教授いただけないでしょうか?

###該当のソースコード

using UnityEngine; using System.Collections; public class LegRotator : MonoBehaviour { //public int targetCount = 3; //public Vector3[] targetRot; public LegParam Param { get; set; } public float loopCount = 2.0f; protected float count; protected float sleepTime; // Use this for initialization void Start () { //this.rigidbody.maxAngularVelocity = 10; //this.rigidbody.mass = Param.mass; sleepTime = 1.0f; } // Update is called once per frame void FixedUpdate () { if( sleepTime > 0.0f ) { sleepTime -= Time.fixedDeltaTime; return; } count += Time.fixedDeltaTime; if( count >= loopCount ) count -= loopCount; float sc = (count / loopCount) * Param.targetCount; int lid = Mathf.FloorToInt(sc); float lr = sc - lid; int nid = (lid >= Param.targetCount-1) ? 0 : lid + 1; float rr = Mathf.Cos(lr * Mathf.PI) * 0.5f + 0.5f; Vector3 tr1 = Param.targetRot[lid]; Vector3 tr2 = Param.targetRot[nid]; Vector3 cr = tr1 * rr + tr2 * (1.0f - rr); //float rr = Mathf.Cos(r * Mathf.PI) * 0.5f + 0.5f; //float crx = rx1 * rr + rx2 * (1.0f - rr); //float crz = rz1 * rr + rz2 * (1.0f - rr); Quaternion q = Quaternion.Euler(cr); this.transform.localRotation = q; //this.rigidbody.angularVelocity = cr * Time.fixedDeltaTime * 200; } }

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

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

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

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

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

guest

回答1

0

ベストアンサー

プロジェクト全体をしっかり見たわけではないですが、私の解釈だと下記のような感じです。
コメントアウトされていたコードは、見やすくするため省略しました。
変数名は多分何かの省略語だと思うのですが、何を表すのかちょっとイメージしづらかったですね...

C#

1 void FixedUpdate () 2 { 3 // 世代開始後1秒間は何もせず待機 4 if (sleepTime > 0.0f) { 5 sleepTime -= Time.fixedDeltaTime; 6 return; 7 } 8 9 // ウォーカーの脚は4本、各脚は上部下部から構成されている 10 // この8つの脚セグメントにそれぞれLegRotatorがアタッチされている 11 // Param内に1周期の脚モーション中の各時点で 12 // この脚セグメントをどの向きに向けるかが記録されている 13 14 // countが0秒〜2秒までを周期的に繰り返すようにする 15 // 2秒間でこの脚セグメントが1周期のモーションを行う 16 count += Time.fixedDeltaTime; 17 if (count >= loopCount) 18 count -= loopCount; 19 20 // Param.targetCountは1周期中の脚セグメントの向きの数...「キーフレームの数」みたいなものと考えるといいかもしれません 21 // scは現在のサイクル時間(0秒〜2秒)から求めたモーション位置(targetCountが4の場合0=<sc<4)...名前の由来は何なんでしょうか? 22 float sc = (count / loopCount) * Param.targetCount; 23 24 // lidはscの整数部分→向き補間のベースとなる向きのインデックス...名前の由来は「leg index」でしょうか 25 int lid = Mathf.FloorToInt (sc); 26 // lrはscの小数部分→ベースの向きと次の向きのブレンド比の算出に使う...名前の由来は「leg ratio」? 27 float lr = sc - lid; 28 29 // nidはlidの次、つまり次の向きのインデックス...名前の由来は「next index」でしょうか 30 int nid = (lid >= Param.targetCount - 1) ? 0 : lid + 1; 31 // lrにπを乗じコサインを得る→lrが0〜1に変化すると、コサインは1〜-1に変化する 32 // コサインに0.5を乗じ0.5を足す→コサインが1〜-1に変化すると、rrは1〜0に変化する 33 // このrrを「ベースの向き」と「次の向き」をブレンドする比率とする...名前の由来は「rotation ratio」? 34 // rrは下図のようなカーブを描くはず 35 // 36 // rr 37 // 1|*** 38 // | ** 39 // | * 40 // | * 41 // | * 42 // | ** 43 // | *** 44 // 0+------------- 45 // 0 1 lr 46 // 47 float rr = Mathf.Cos (lr * Mathf.PI) * 0.5f + 0.5f; 48 49 //「ベースの向き」と「次の向き」を比率rrでブレンド、結果をcrに格納...名前の由来は「current rotation」? 50 Vector3 tr1 = Param.targetRot [lid]; 51 Vector3 tr2 = Param.targetRot [nid]; 52 Vector3 cr = tr1 * rr + tr2 * (1.0f - rr); 53 54 // セグメントの向きをcrにする 55 Quaternion q = Quaternion.Euler (cr); 56 this.transform.localRotation = q; 57 }

投稿2018/01/14 11:37

Bongo

総合スコア10807

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

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

hanako1025

2018/01/14 18:54

丁寧な解説をありがとうございます。 とてもわかり易く助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問