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

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

新規登録して質問してみよう
ただいま回答率
85.49%
アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Unity

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

Q&A

1回答

8026閲覧

Unity 波動のようなモーションを作りたい

seri

総合スコア422

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Unity

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

0グッド

1クリップ

投稿2016/05/20 22:37

編集2016/05/26 21:57

↓画像のような波動を作りたいと思っています。
イメージ説明

Graphics.DrawMeshとfor文を使って大量のBoxMeshを描画した後、それぞれのBoxの位置とカメラの位置を使って波動のモーションにしたかったのですが上手くいきません。。

C#

1 public Mesh mesh; 2 public Material material; 3 Vector3 nami1=new Vector3 (0,0,80f); 4 5 Vector3 pos; 6 public float tim; 7 8 Vector3 vec=new Vector3(0,0,0); 9 void Update(){ 10 int a = 0; 11 int z = 0; 12//ここでBoxをFor文で設置しています 13 for (int i=0; i<10000;i++){ 14 vec=new Vector3(a*20-500,-300f,3100-z*2f);//この数はゲームシステムによるものなので、あまり気にしないでください。 15 16 if (Input.GetMouseButtonDown (0)) { 17 tim=Time.time; 18 pos=Camera.main.transform.position; 19 20 } 21 //↓ここが問題です。。 22 if(nami1.sqrMagnitude<(vec-pos).sqrMagnitude){ 23 vec.y-=(tim-Time.time)*(vec-pos).sqrMagnitude*0.0009f; 24 if(vec.y<-300f){ 25 vec.y=-300; 26 } 27 } 28 //↓ここは単にBoxの数を決めているだけですので、あまり関係ありません 29 a+=1; 30 if(a==50){ 31 a=0;z+=10; 32 } 33 Graphics.DrawMesh(mesh,vec,Quaternion.identity, material,0); 34 } 35 36 37 }

追記:うまくいかないとは具体的にどのような事なのか記載してほしいとの意見をいただきました
やはり一番に気になるのは、モーションです。均等な間隔で、均等な動きでは、波のような少しずつ波が穏やかになる動きとはかけはなれてしまいます。
次に気になるのは、一度マウスクリック後に、またマウスクリックした場合リセットされることです

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

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

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

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

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

urahimono

2016/05/22 09:57

このコードの処理が上手くいかないとのことですが、どのように上手くいっていないのでしょうか。 波動のように見えない、波動が繰り返さないなど問題点の情報の追加をお願い致します。
guest

回答1

0

波動のモーションが気になるということでしたら、力学を使った波の動きを参考にするのはいかがでしょうか。
以下のリンク先に波の動きのプログラムのサンプルがあります。
このサンプルは2次元ですが、動きの参考になるかもしれません。
力学アルゴリズムによる波のシミュレーション(線上の波)

上記のプログラムをUnityで使える形改良したものを下記に記述しておきます。
ご参考になればと思います。

C#

1using UnityEngine; 2 3public class WaveTest : MonoBehaviour 4{ 5 [SerializeField] 6 private Mesh mesh = null; 7 [SerializeField] 8 private Material material = null; 9 10 // 媒質の長さ 11 [SerializeField] 12 private float LENGTH = 20.0f; 13 // 自由端かどうか 14 [SerializeField] 15 private bool FREE_END = false; 16 // シミュレーションの時間刻み 17 [SerializeField] 18 private float DT = 0.2f; 19 // 減衰力係数 20 [SerializeField] 21 private float FRICTION = 2.0f; 22 // 張力 23 [SerializeField] 24 private float TENSION = 30.0f; 25 26 27 // ラインの頂点数 28 const int N = 128; 29 30 // ラインの頂点の座標 31 private Vector3[] vertex = new Vector3[N]; 32 33 // ラインの頂点の速度 34 float[] vertexVY = new float[N]; 35 36 // ラインの頂点に働く力 37 float[] vertexFY = new float[N]; 38 39 // 単位長さあたりの質量密度 40 const float DENSITY = 100.0f; 41 42 // 初期パルスの幅 43 const float PULSE_WIDTH = 0.3f; 44 45 // 初期パルスの高さ 46 const float PULSE_HEIGHT = 1.0f; 47 48 49 void Start() 50 { 51 // 頂点Xの初期値設定 52 for( int i = 0; i < N; i++ ) 53 { 54 float x = i * LENGTH / N; 55 vertex[ i ].x = x; 56 } 57 58 // 頂点Yの初期値設定(ガウス波束) 59 float centerX = LENGTH / 2; 60 for( int i = 0; i < N; i++ ) 61 { 62 63 float x = i * LENGTH / N; 64 65 // ガウス関数 66 vertex[ i ].y = PULSE_HEIGHT * Mathf.Exp( -( x - centerX ) * ( x - centerX ) / ( 2 * PULSE_WIDTH * PULSE_WIDTH ) ); 67 68 // 初期速度は 0(静止状態) 69 vertexVY[ i ] = 0.0f; 70 } 71 } 72 73 74 void Update() 75 { 76 UserInput(); 77 78 79 // 質点間の距離 80 float dx = LENGTH / N; 81 82 // 質点1個あたりの質量 83 float m = DENSITY * LENGTH / ( N + 1 ); 84 85 // 端以外の頂点にかかる力の計算 86 for( int i = 1; i < N - 1; i++ ) 87 { 88 89 vertexFY[ i ] = 90 ( vertex[ i + 1 ].y + vertex[ i - 1 ].y - 2.0f * vertex[ i ].y ) * TENSION / dx 91 - FRICTION * vertexVY[ i ]; 92 } 93 94 // 両端にかかる力の計算 95 if( FREE_END ) 96 { // 自由端 97 98 // 隣接する1個の質点からのみ力を受ける 99 vertexFY[ 0 ] = 100 ( vertex[ 1 ].y - vertex[ 0 ].y ) * TENSION / dx - FRICTION * vertexVY[ 0 ]; 101 102 vertexFY[ N - 1 ] = 103 ( vertex[ N - 2 ].y - vertex[ N - 1 ].y ) * TENSION / dx - FRICTION * vertexVY[ N - 1 ]; 104 105 } 106 else 107 { //固定端 108 109 // 壁から固定する抗力を受けるので、合力は0で動かない 110 vertexFY[ 0 ] = 0.0f; 111 vertexFY[ N - 1 ] = 0.0f; 112 } 113 114 // 位置と速度の計算 115 for( int i = 0; i < N; i++ ) 116 { 117 118 // 頂点の速度変化の計算 119 vertexVY[ i ] += vertexFY[ i ] / m * DT; 120 121 // 頂点の座標変化の計算 122 vertex[ i ].y += vertexVY[ i ] * DT; 123 } 124 125 foreach( var vec in vertex ) 126 { 127 Graphics.DrawMesh( mesh, vec, Quaternion.identity, material, 0 ); 128 } 129 } 130 131 132 private void UserInput() 133 { 134 if( Input.GetMouseButtonDown( 0 ) ) 135 { 136 vertexVY[ N / 2 ] = -5.0f; 137 } 138 } 139 140} // class WaveTest

イメージ説明

投稿2016/05/28 00:25

urahimono

総合スコア714

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問