↓下記のサイトはCocos2D-Xを利用して流体で海を作成していて 自分はDXライブラリで流体を描画したいのですが、いろ

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
roxas710
記事: 54
登録日時: 10年前

↓下記のサイトはCocos2D-Xを利用して流体で海を作成していて 自分はDXライブラリで流体を描画したいのですが、いろ

#1

投稿記事 by roxas710 » 8年前

↓下記のサイトはCocos2D-Xを利用して流体で海を作成していて
自分はDXライブラリで流体を描画したいのですが、いろいろためしたのですが上手くいきません。
http://wonderpla.net/blog/engineer/Liqu ... Cocos2d-x/

剛体の表示はできたのですが、流体の粒子をどうやって描画すればいいのかがわかりません。
GetPositionBufferという関数で配列に{x1,y1,x2,y2,x3,y3...}というように粒子の座標がとってこれるみたいですが、
どの変数に格納してどうやって描画するのかもわかりません。

どなたかLiquidfunか流体のライブラリを使ったことがある方、
流体の描画の仕方を教えてほしいです。

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: ↓下記のサイトはCocos2D-Xを利用して流体で海を作成していて 自分はDXライブラリで流体を描画したいのです

#2

投稿記事 by ISLe » 8年前

Box2Dの描画は「図形」単位なので剛体の表示ができたのなら同じ手順でできるはずなのですが。

件のページでは
HelloWorld::createSeaParticleGroup関数の41~43行で、スプライト作成してユーザーデータに参照を保存して
HelloWorld::update関数の22~23行で、保存しておいた参照使ってスプライトを操作してます。

DXライブラリでは、適当な描画クラス作って、上記のスプライトと同じようにして
あと適当なタイミングでまとめて描画すれば良いです。

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: ↓下記のサイトはCocos2D-Xを利用して流体で海を作成していて 自分はDXライブラリで流体を描画したいのです

#3

投稿記事 by ISLe » 8年前

座標バッファを使ってまとめて連続で描画したい、ということでしたら
件のページのHelloWorld::update関数の22~23行あたりのことをまとめて描画したいタイミングでやれば良いです。

15行目でvecListに取得しているのが座標バッファの先頭要素へのポインタ
座標バッファの各要素はb2Vec2型。
具体的な使い方は22行目を見れば分かるかと。

roxas710
記事: 54
登録日時: 10年前

Re: ↓下記のサイトはCocos2D-Xを利用して流体で海を作成していて 自分はDXライブラリで流体を描画したいのです

#4

投稿記事 by roxas710 » 8年前

回答ありがとうございます!
実はこのサイト並みのC++がまだよく理解できていません。
この部分をC言語で書く方法はわかりますでしょうか?

剛体はこの書き方で表示できています。
body1[3]ありまして、ポジションとアングルを取得してきてDrawRotaGraphで表示しています。

コード:

 
for (int i = 0; i < 3; i++)
		{
			b2Vec2 pos = g_title.body1[i]->GetPosition();
			float angle = g_title.body1[i]->GetAngle();
			DrawRotaGraph(VIWX(pos.x), VIWY(pos.y), 1, angle, g_images.title_tree, TRUE);
		}


流体でGetPositionBufferで粒子一つ一つの座標を取得できるんだと思うんですが、それをb2Vec2に格納して表示するのかと思ってたんですけどうまくいきません。。

わかりますでしょうか?><

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: ↓下記のサイトはCocos2D-Xを利用して流体で海を作成していて 自分はDXライブラリで流体を描画したいのです

#5

投稿記事 by ISLe » 8年前

流体かどうかではなくて、(パーティクル)グループの扱いの話ですよね。

リンク先のHelloWorld::updateの記述に合わせると

コード:

    //座標バッファ
    b2Vec2* vecList = particleSystem->GetPositionBuffer() + seaGroup->GetBufferIndex();
    for(int i = 0; i < seaGroup->GetParticleCount(); i++, vecList++) {
        b2Vec2 pos = *vecList; // ←要素毎のパーティクルの座標
    }
あるいは

コード:

    //座標バッファ
    b2Vec2* vecList = particleSystem->GetPositionBuffer() + seaGroup->GetBufferIndex();
    for(int i = 0; i < seaGroup->GetParticleCount(); i++) {
        b2Vec2 pos = vecList[i]; // ←要素毎のパーティクルの座標
    }
C言語の基本的な文法の範疇ではないでしょうか。

roxas710
記事: 54
登録日時: 10年前

Re: ↓下記のサイトはCocos2D-Xを利用して流体で海を作成していて 自分はDXライブラリで流体を描画したいのです

#6

投稿記事 by roxas710 » 8年前

seaGroup->GetBufferIndex()が何をしているかがよく分からないです><
自分なりに描いたプログラムでは粒子一粒だけ表示(あたり判定はある)されていて、一粒以外は実体はある(当たり判定はある)のですが表示はされていません。

粒子ボディを作成する関数

コード:

b2ParticleSystem* CreateSea()
{
	//ボディの定義
	b2ParticleSystemDef psdef;
	psdef.density = 1.5;
	psdef.radius = 0.17f;
	psdef.dampingStrength = 0.1f;
	//ボディ作成
	b2ParticleSystem* particleSystem = g_world.CreateParticleSystem(&psdef);



	//粒子配置

	b2CircleShape shape;
	shape.m_radius = 3.0f;

	b2ParticleGroupDef groupDef;
	groupDef.shape = &shape;
	groupDef.flags = b2_waterParticle;
	groupDef.color = b2ParticleColor(100, 150, 255, 255);
	groupDef.position = b2Vec2(7.0, 2.0);
	
	
	return particleSystem;
}
ここで関数を使用しています

コード:

//流体の表示
		g_title.water = CreateSea();

		b2Vec2* pos = g_title.water->GetPositionBuffer();				//流体の粒子のポジションを取得
		DrawGraph(VIWX(pos->x), VIWY(pos->y), g_images.water, TRUE);	//描画
		
1つ上に書いていただいたコードをためしたのですが、
seaGroupはどこからきたのかとGetBufferIndex()を使う意味がわかりませんでした。。。

何度もすみません


追記

コード:

これでいけるかなと思ったんですけどね。。。。。
だめでした。
b2Vec2* vecList = g_title.water->GetPositionBuffer();				//流体の粒子のポジションを取得

		for (int i = 0; i < g_title.water->GetPairCount(); i++)
		{
			b2Vec2 *pos = &vecList[i];
			DrawGraph(VIWX(pos->x), VIWY(pos->y), g_images.water, TRUE);	//描画
		}
辛い

roxas710
記事: 54
登録日時: 10年前

Re: ↓下記のサイトはCocos2D-Xを利用して流体で海を作成していて 自分はDXライブラリで流体を描画したいのです

#7

投稿記事 by roxas710 » 8年前

できましたーーーーーーーーーーーーーーーーーーーーー!
なんとか自分でできました!
回答ありがとうございました!!

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: ↓下記のサイトはCocos2D-Xを利用して流体で海を作成していて 自分はDXライブラリで流体を描画したいのです

#8

投稿記事 by ISLe » 8年前

具体的にどうやって解決したか書いていただくのがこの掲示板のルールなのですが。

No.6に足りないのは、
b2ParticleSystem::CreateParticleGroup
でグループを登録する処理ですね。

パーティクルシステムには複数のグループを登録できるので、
b2ParticleGroup::GetBufferIndex
でインデックス(=パーティクルシステム全体でのバッファ先頭からのオフセット)を得て、
そのグループに対してのバッファの先頭を求めることができます。

リンク先の記事のコードを見れば、変数seaGroupに代入している箇所があります。
seaGroup自体の宣言がなくても、呼び出している関数の定義から戻り値の型は分かりますし。


適当にやってうまくいくという経験を繰り返すとどんどんコードを読めなくなるので注意したほうが良いと思いますよ。

配列(状のメモリ領域)にオフセットを足すという、基本的な文法から
seaGroup->GetBufferIndex()が配列に対する何らかのオフセットだというのは自明です。

seaGroup->GetBufferIndex()が何なのか分からないので基本的な文法から目を反らすというのは
分かり切ったことから放棄していく行為ですから、基本が疎かになっていくということです。

閉鎖

“C言語何でも質問掲示板” へ戻る