ゲームのエフェクトについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
aio

ゲームのエフェクトについて

#1

投稿記事 by aio » 12年前

パーティクルでエフェクトを作りたいのですが、パーティクルの挙動を制御する関数が記載されてるサイト様を、またご可能でしたら直接…ご存知でしたら教えていただけないでしょうか?
たとえば球状に粒子がランダムに動いていたり、1点から球状に拡散したり、他にも私が発想すらしないようなものまで…

よろしくお願いします。

milla

Re: ゲームのエフェクトについて

#2

投稿記事 by milla » 12年前

ゲームエフェクトにおけるパーティクルは、ほとんどが半透明ビルボードの重ね合わせです。
ビルボードとはポリゴンですが法線が必ずカメラに向いています。(要するに、視点を動かして、どこから見ようが、視野に入る限り裏面が見えないポリゴン)
もちろん粒子という名前のとおり1pixelでも大丈夫ですが。

まずパーティクルには必要なものが3つあります。
一つは、ランダム性です。もう一つは、生存時間です。もう一つは、発生源です。
ランダム性は移動の揺らぎです。生存時間は表示時間の揺らぎです。発生源は初期位置の揺らぎです。

では、仮想的なクラスを書いて見ます。

コード:

// 一つのパーティクルを表示するクラス
class CParticle
{
private:
	float srcX, srcY, srcZ;     // 発生源
	float vecX, vecY, vecZ;     // 動き
	int life;                   // 生存時間

	CBillboard surface;         // ビルボードクラス
	// 外部ファイルにてビルボードが実装済みとする

public:
	void Init();                // 発生源や動き、生存時間を決める
	bool Update();              // 位置情報や生存時間の更新 死んだらtrueを返す。
	void Draw();                // 描画する
};

// エフェクト一つ分のパーティクルを制御するクラス
class CParticleEffect
{
private:
	int num;					// パーティクルの個数
	CParticle* pParticleArray;	// パーティクルの配列

public:
	void Init(int num);			// 個数を指定して、その個数分パーティクルクラスを実体化
	void Update();              // 全体の更新。内部でCParticle::Update()がtrueを返した場合、CParticle::Init()で再度生成する
	void Draw();                // エフェクト全体を描画する
};

aio

Re: ゲームのエフェクトについて

#3

投稿記事 by aio » 12年前

millaさんお返事ありがとうございます。

せっかくコードを書いて頂いて申し訳ないのですが一応事前にパーティクルで使用するテクスチャを渡して、ビルボードを使って発生源、消失時間、動力方向、外力、パーティクルの数を渡せばレンダリングされるモノは実装しています。説明不足で申し訳ありません。
肝心の動き制御の部分( 動力方向、外力(ランダム性と呼ぶもの) )が思いつかないのです…

milla

Re: ゲームのエフェクトについて

#4

投稿記事 by milla » 12年前

物理学や数学の勉強をしてください。
としか、言いようがありません。

外力ですぐに思いつくのはまず重力でしょうね。あとは、風圧などもそうでしょうか。
パーティクルの軌跡についてはベジェ曲線などのパラメトリック曲線でしょうか。

その辺がわかれば、あとは自分の出したい軌跡そってパーティクルを動かすだけです。
そこは試行錯誤してください。これといった決まったものがないので。

アバター
usao
記事: 1892
登録日時: 13年前
連絡を取る:

Re: ゲームのエフェクトについて

#5

投稿記事 by usao » 12年前

オフトピック
例えば
>1点から球状に拡散
ということをしたいときに

最も簡単には(?)初速さえ与えておけばあとはほっといても広がっていくんじゃないかと思うのですが,

いやいや,そんなんじゃ嫌(?)だから
初期配置としてはごく狭い領域に粒子群を詰めておいて
粒子間距離に反比例する強さの反発力を単位時間毎に求めては粒子間に与えてやるぜ!
とかいうのか…

その方法は 表現したいこととかこだわり次第(?)なのではないかな? とか.

aio

Re: ゲームのエフェクトについて

#6

投稿記事 by aio » 12年前

millaさんお返事ありがとうございます。
勉強して下さいと言われれば確かにその通りなのです…
物理よりかは数学の関数で何か流用できないのか(ベジェ曲線も然りです)と思い
私には思いつかないのでご質問させて頂いたのです…

usaoさんお返事ありがとうございます。
粒子間距離に反比例する強さの反発力を単位時間毎に求めては粒子間に与えてやるぜ!
なるほどです!そういう考えもあるのですね!
でも確かにそれだけなら最初の初速だけというのを採用して、徐々に外力で減速させて行く方がよろしいのかもしれませんね。
ただ、どう綺麗に(ある程度のランダム性を含ませて)初速を与えて拡散させればよいのかなと思ってしまいます。

アバター
usao
記事: 1892
登録日時: 13年前
連絡を取る:

Re: ゲームのエフェクトについて

#7

投稿記事 by usao » 12年前

>ただ、どう綺麗に(ある程度のランダム性を含ませて)初速を与えて拡散させればよいのかなと思ってしまいます。

うん,だからそこらへんのことは あなたが作りたい効果の詳細 によって何が良いのかがいろいろ変わってくると思うので
何をどうするか決められるのはエフェクトの具体的イメージを持っているあなただけってことなんじゃないかなー,と.
故に,人に尋ねるのは難しいと思うんですよね.

>1点から球状に拡散
っていう ぼんやりした話での「ランダム」という言葉についてだけでも
ランダムって何がランダムなの?という話すら他人にはわからない気がしますし.

・初速の大きさをランダムに与える?
・初速の向きにもランダム性が要るの?
・外力で減速ってのは,外向き初速で飛び出すけど 湧き出し口の方向への引力が働く みたいな計算だとしたら
 個々の粒子の質量(外力による加減速のしにくさ)をランダムで決める?
・ランダムっていうけど,各粒子で てんでばらばらに 乱数を振ってもいいの?
 動く方向が近い粒子ほど同じような運動にしたい とか なんかそういう話だってあるかも? とか.
 (初速の大きさと方向に何か相関があるような与え方をすれば,なんとなく金平糖みたいな(?)形になったりとか.
  対して,完全にホワイトノイズ的に初速を与えたら 相対的にウニみたいな雰囲気(?)で散るんじゃないかと.)

…とかいろいろと(無限に).

閉鎖

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