ページ 1 / 1
3DゲームのAI
Posted: 2011年11月03日(木) 09:21
by 史上最悪のデスペナ
漠然とした質問ですが、3DゲームでAIのアルゴリズムの作り方や考え方が分かりません。
敵AI
普段は半径10m以内をうろうろしたり立ち止まったりする。
AIで↑のものだけが上手く出来ません。一応、「半径10m」部分は除いて形だけは出来るのですが、すごい違和感がある感じです。
やっていることは単純で
移動速度をランダムに設定して数秒間動き、ランダムに向きを0.何秒間か回転させてまた移動速度を(以下略)
としています。
MMORPGをやっている方はご存知だと思いますが、ノンアクティブMOBみたいなああいう動きをさせたいのです。
残りの
敵AI
半径5m以内に近づいたら攻撃を仕掛ける
味方AI
プレイヤーキャラと基本行動し、プレイヤーと同じ敵を倒したり、プレイヤーが戦っていない敵と交戦する。
は出来ました。
考え方だけでもいいので教えてください
Re: 3DゲームのAI
Posted: 2011年11月03日(木) 10:18
by softya(ソフト屋)
AIと言うより、移動パターンを自然にしたいと言うことですね。
>MMORPGをやっている方はご存知だと思いますが、ノンアクティブMOBみたいなああいう動きをさせたいのです。
すいません、具体的なイメージがわかりません。
普通のゲームの敵も、かなり適当な動きをしている気がしますが移動パターンを作ってしまえば良い気がします。
移動→停止→回転→移動って感じでしょうか。じわっと回転するより目的の方向に一気に向いたほうが良いでしょう。
移動 : 特定の範囲の時間でランダム。移動速度は2~3種類ぐらい(ランダム)。
停止 : 特定の範囲の時間でランダム。
回転 : 一瞬で向きを変える。元の角度とは違和感のない程度の角度に収める(30度~90度程度?)
出来れば移動と停止の間に減速期間があるとなお良い。
あと10mを超えそうになったら、強制的に120度~180度の角度で回れ右or左をする。って感じじゃダメでしょうか?
Re: 3DゲームのAI
Posted: 2011年11月06日(日) 08:18
by 史上最悪のデスペナ
遅くなって申し訳ありません。
なんとか試行錯誤してプログラミング中です。結果は申し訳ありませんがもう少しお待ちください。
Re: 3DゲームのAI
Posted: 2011年11月06日(日) 13:01
by GRAM
①半径10m内のどこかに目標地点を定める。
②目標地点まで敵を移動させる
③目標地点に到達したら①へ戻る
という動作を繰り返すとかはどうですか?
①の目標地点の定め方を調整することである程度調整もできると思います
Re: 3DゲームのAI
Posted: 2011年11月06日(日) 13:19
by 史上最悪のデスペナ
GRAMさん・・・・・私の実力ではそんなこと出来ません・・・・・・orz
もう少しヒントをお願いします。
softya(ソフト屋) さん。一応半径10mうんぬんを除き、やってみましたがやっぱりなんか変な感じがします(歩くモーションはつけてませんが脳内補正有り)。
Re: 3DゲームのAI
Posted: 2011年11月06日(日) 13:40
by softya(ソフト屋)
GRAMさんの方法も見方を変えただけで、さほど難しくないと思いますよ。
先に移動先を決めて、今の位置から移動距離と方向を求めるだけです。
>softya(ソフト屋) さん。一応半径10mうんぬんを除き、やってみましたがやっぱりなんか変な感じがします(歩くモーションはつけてませんが脳内補正有り)。
動画で見せてもらえるとどういう状況か分かるのですが出来ませんか?
Re: 3DゲームのAI
Posted: 2011年11月06日(日) 14:05
by 史上最悪のデスペナ
AVI形式です。
ついでに、かつてのトピック「
不思議な波々を無くすには?」の見え方もついでに撮りました
1分40秒ほどありますが、お願いします。
そういえば
softya(ソフト屋) さんが書きました:出来れば移動と停止の間に減速期間があるとなお良い。
これはやってません。後で新・サンプルプログラミングの館を参考にする予定です。
Re: 3DゲームのAI
Posted: 2011年11月06日(日) 14:14
by softya(ソフト屋)
どうやら再生できないコーディックの様です。
一般的なコーディックに変換してもらえますか?
Re: 3DゲームのAI
Posted: 2011年11月06日(日) 14:23
by 史上最悪のデスペナ
すみません・・・・・やり方がわかりません。
申し訳ありませんが
http://www.google.co.jp/#hl=ja&q=MPC-Ho ... 66&bih=681
でMPC-HomeCinemaをダウンロードしていただいてもよろしいでしょうか?
一応こちらでも変換のを探して見ます。
Re: 3DゲームのAI
Posted: 2011年11月06日(日) 14:25
by 史上最悪のデスペナ
あ、出来そうです。
MP4かWMVかFLVでいけそうです。
大丈夫ですか?
Re: 3DゲームのAI
Posted: 2011年11月06日(日) 14:54
by GRAM
コンパイルして実行できるようにまとめました。
よろしければどうぞ
► スポイラーを表示
コード:
#include <DxLib.h>
#include <math.h>
#define OFFS_X 320
#define OFFS_Y 240
// 1/100の精度でランダムな数を得る
double GetRandomD( double max ){
return (double)GetRand( max * 100 ) /100.0;
}
//xとyの値を持つ構造体
struct Vector{
double x,y;
};
//円
struct Circle{
Vector Position;
double radius;
};
//敵
struct Enemy{
Circle c;
Vector Speed;
};
//円同士のあたり判定
bool CollisionDetection( Circle& lhs, Circle& rhs);
//円を表示
void ShowCircle(Circle& c, int color, int flag);
//目標地点までの移動量を計算
void CalculateMove( Circle& target, Enemy& enemy, double time);
//敵を移動させる
void MoveEnemy( Enemy& e );
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
//移動するエリア
Circle area;
area.Position.x = 0;
area.Position.y = 0;
area.radius = 150;
//移動先の目標
Circle target;
target.Position.x = 30;
target.Position.y = 30;
target.radius = 5;
//敵
Enemy enemy;
enemy.c.Position.x = -50;
enemy.c.Position.y = -50;
enemy.c.radius = 5;
//敵の速度を計算
CalculateMove( target, enemy, 3 );
//待機時間
double time = -1.0;
while(ProcessMessage()==0 && ClearDrawScreen()==0){
//目標に到達していれば、目標地点と速度を更新して、待機時間も設定
if( CollisionDetection( enemy.c, target ) ){
double d = GetRandomD( 150.0 );
double rad = GetRandomD( TWO_PHI );
CollisionDetection( enemy.c, target );
target.Position.x = d*cos(rad);
target.Position.y = d*sin(rad);
CalculateMove( target, enemy, GetRandomD( 2.0 ) + 2.0 );
time = GetRandomD( 2.0 ) + 0.5;
}else if( time < 0.0 ){
//待機時間がないときは移動
MoveEnemy( enemy );
}else{
//待機時間中は待機
time -= 1.0 / 60.0;
}
//描写
ShowCircle( enemy.c , 0x00ff00, 1 );
ShowCircle( area , 0xffffff, 0 );
ShowCircle( target , 0xff0000, 1 );
ScreenFlip();
}
DxLib_End();
return 0;
}
bool CollisionDetection( Circle& lhs, Circle& rhs){
double dx = lhs.Position.x - rhs.Position.x;
double dy = lhs.Position.y - rhs.Position.y;
double r = lhs.radius + rhs.radius;
return r*r > dx*dx + dy*dy;
}
void ShowCircle(Circle& c, int color, int flag = 1 ){
DrawCircle( c.Position.x + OFFS_X, c.Position.y + OFFS_Y, c.radius, color, flag );
}
void CalculateMove( Circle& target, Enemy& enemy, double time){
double dx = target.Position.x - enemy.c.Position.x;
double dy = target.Position.y - enemy.c.Position.y;
time *= 60.0;
enemy.Speed.x = dx / time;
enemy.Speed.y = dy / time;
}
void MoveEnemy( Enemy& e ){
e.c.Position.x += e.Speed.x;
e.c.Position.y += e.Speed.y;
}
Re: 3DゲームのAI
Posted: 2011年11月06日(日) 15:11
by 史上最悪のデスペナ
凄いですね。これを3次元空間で行えばいいのですね。問題はキャラの向き設定ですがそれは何とかなりそうです。
わざわざあんな長いソースを書いていただいて恐縮ですが
自分の知ってるMMORPGのMOBを当てはめて想像するとやはり無機物感が抜けませんね^^;(我儘言って申し訳ありません)。
Re: 3DゲームのAI
Posted: 2011年11月06日(日) 15:37
by softya(ソフト屋)
史上最悪のデスペナ さんが書きました:あ、出来そうです。
MP4かWMVかFLVでいけそうです。
大丈夫ですか?
大丈夫です。
あと史上最悪のデスペナさん的にGJ!なMOBの動画もありましたらお願いします。
Re: 3DゲームのAI
Posted: 2011年11月06日(日) 15:42
by 史上最悪のデスペナ
最近MMORPGをやってない上、空き領域が少なくなってきたので全部消してしまったので今インストーラーをダウンロードしてるとこですが1時間ほど経ってやっと2/3・・・・
ずっと残り4分のまま変わりません・・・・・・
Re: 3DゲームのAI
Posted: 2011年11月06日(日) 15:46
by 史上最悪のデスペナ
とりあえずMP4変換したものです。
Re: 3DゲームのAI
Posted: 2011年11月06日(日) 16:03
by softya(ソフト屋)
ざっと動画を見た感じでは、動き出しの加速と止まるときの減速が欲しいと思います。
あと止まったときに止まったとき専用のアニメーションをしていれば違和感は少ない気がします。
停止時間は、敵ごとに調整できるようにしたほうが良いでしょうね。
それとずっと動きづつけるキャラを作る場合はベジェ曲線などで補完してやるとなめらかに移動できます。
「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ]」
http://dixq.net/g/s_01.html
「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ]」
http://dixq.net/g/s_02.html
このベジェ曲線をつかって例にあるように速度の変化に応用することも出来ますよ。
角度も補完してやれば、なめらかに角度を変えることも可能です。
テントが壁抜けする現象はZ値だと思います。SetCameraNearFar()でZバッファの精度を調整してみてください。
Re: 3DゲームのAI
Posted: 2011年11月06日(日) 16:26
by 史上最悪のデスペナ
なるほど。
史上最悪のデスペナ さんが書きました:後で新・サンプルプログラミングの館を参考にする予定です。
は
http://dixq.net/g/04_04.html
で考えてましたがそちらのほうがよさそうですね。
せっかくキャプチャしたのでUp
Re: 3DゲームのAI
Posted: 2011年11月06日(日) 17:10
by softya(ソフト屋)
MMORPGの動画見ました。
違いと言えば止まった時専用のアニメがある事と、180度ターン時に1コマ途中の角度のコマが補完されている様にみえます。
止まった時専用のアニメがある場合はアニメコマの再生が終わるまで移動を停止する仕組みが必要ですね。
Re: 3DゲームのAI
Posted: 2011年11月06日(日) 19:02
by 史上最悪のデスペナ
なるほど。さらに止まっている時間と進むスピードや距離とかでも印象が変わるでしょうね。
人間も歩き方で人の区別がある程度出来ますし(私だけですかね?)
運動工学とか人間工学、動物行動学を勉強したほうがいいかなぁ^^;
Re: 3DゲームのAI
Posted: 2011年11月06日(日) 19:42
by softya(ソフト屋)
史上最悪のデスペナ さんが書きました:なるほど。さらに止まっている時間と進むスピードや距離とかでも印象が変わるでしょうね。
変わりますね。これはモンスターごとに違う行動パターンを当てはめるべき問題です。
史上最悪のデスペナ さんが書きました:人間も歩き方で人の区別がある程度出来ますし(私だけですかね?)
大体の人は歩き方で知り合いかどうかを無意識に区別していると思います。
たぶん、本能によるものでしょう。
史上最悪のデスペナ さんが書きました:運動工学とか人間工学、動物行動学を勉強したほうがいいかなぁ^^;
やりすぎですが確実に有効なのは動物の行動はビデオをたくさん見て勉強してください。
これはゲーム業界・アニメ業界・映画業界にとっても未だに課題の奥の深い世界です。
リアリティを与えるには、観察がすべてだと思います。
そうですね。CGのピクサー社の人たちがファインディング・ニモの時などひたすら魚を観察したって言ってましたよ。
やり過ぎると、「人喰いの大鷲トリコ」の上田文人氏のこだわりのように何時までも完成しません。
「人喰いの大鷲トリコ | プレイステーション® オフィシャルサイト」
http://www.jp.playstation.com/scej/title/trico/
最近やったゲームの中ではwiiのゼノブレイドのフィールドの敵がなかなか良い感じでした。
[youtube]
[/youtube]
[youtube]
[/youtube]
Re: 3DゲームのAI
Posted: 2011年11月07日(月) 08:30
by 史上最悪のデスペナ
MMORPGのPVを集めて研究してるんですけどなかなかモンスターの歩いてるシーンとか無いんですよね
戦闘シーンはエフェクトでよく見えませんし^^;
Sculptrisで作るとまるでキメラみたいにいろんな動物の混ざったようなのが出来てしまいますが地球上の動物と似たような動きじゃないと凄い違和感を感じますね。
4本足を観察するならうちの庭をたまにうろつく野良猫でも見てようかな・・・・・
長々とお付き合いいただきありがとうございました。またよろしくお願いします。