約 35,002 件
https://w.atwiki.jp/system_daba/pages/315.html
衝突 カードテキスト 《衝突》 コスト:0 タイミング:FF EffectCard 追加コスト(未配備兵1) 列にあるカードひとつを対象とする。対戦相 手は①を支払ってもよい。そうしない場合、 そのカードをオーナーの手札に戻す。 コメント ピブー このカードの性質上、使用できるタイミングは、相手が兵士も兵站もコストがない状態になっているときだけである。ゲーム開始時は確実にその状態にある。相手が後攻1ターン目にネズミをならべてこようとした場合はこのカードで応戦しよう。 また、列のカードを「手札に戻す」効果であり、「打ち消し」ているわけではない。相手が天呪「アポロ13」を使ってきた場合でも、このカードでなかったことにできる。
https://w.atwiki.jp/mizcremorne/pages/127.html
はじめに 衝突イベント 衝突版自動ドア 今回のポイント 最後に はじめに 初級スクリプトとして触れておきたい事項も最後となりました。 最後に扱うのはオブジェクトの衝突についてです。 物理オブジェクトを扱いだすと、いろいろな場面で衝突判定をしたりするのですが、通常のオブジェクトにおける衝突判定も実は結構有用です。 例えば以前、センサーを利用した自動ドアを作りました。 あのスクリプトは衝突を用いて書き直すことが可能です。 衝突・・・なんていうと猛スピードで激突するイメージかもしれませんが、lslで言う衝突はもっと軽いものも含みます。 例えばアバターが歩いてきてオブジェクトを踏んだとき、それだけで衝突のイベントが起きるのです。 自動ドアの前にマットを用意しておいて、それを踏んだらドアが開く、という古典的な仕掛けが実現できます。 実際に衝突を使った自動ドアを作ってみましょう。 衝突イベント 衝突イベントには3種類あります。 いや、正確には6種類ですが、まずは基本の3つからで良いでしょう。 collision_start(integer num_detected){ // 衝突が始まったときの処理 } collision(integer num_detected){ // 衝突し続けているときの処理 } collision_end(integer num_detected){ // 衝突が終わったときの処理 } タッチイベントと似ていますね。 実際、それぞれのイベントの意味は3つのタッチイベントと同じです。 通常使うのはcollision_start?イベントです。 ぶつかった瞬間に発生するイベントですので、単発的に「ぶつかったとき」の処理をするにはこれを使います。 引数num_detectedは「衝突している数」を意味します。 このあたりもタッチイベントと同様です。 具体的に「誰/何が衝突したのか」「衝突した位置はどこか」「衝突したもののUUIDは何か」などは、先日センサーのときに出てきたDetected系の関数を使って取得します。 例えば衝突したものの名前を得るにはllDetectedName()関数、UUIDを得るにはllDetectedKey()です。 それほど難しくないと思いますので少々余談をします。 これらの衝突イベントは、ファントム・オブジェクトでは通常発生しません。 ファントム・オブジェクトとは、buildツールの「オブジェクト」タグで「ファントム」にチェックが入っているオブジェクトのことです。 そこにあるように見えますが、ぶつかろうとするとスルリと通り抜けてしまうオブジェクトですね。 要するに「幻」であるため、衝突イベントも起こらないようになっているのですが、時にはファントム・オブジェクトでも衝突判定を行いたい場合があります。 例えば目に見えないファントム・オブジェクトを特定位置に配置しておいて、そこを誰かが通ったときに何か仕掛けを動かしたい、なんて時ですね。 その場合は、以下の関数を使います。 llVolumeDetect?(integer detect); 引数にはTRUEかFALSEを指定します。 TRUEを指定すると、ファントム・オブジェクトで衝突イベントが起こるようになります。 FALSEにすると衝突イベントが起こらなくなります。 この関数はルートプリム内のスクリプトで実行しなければなりません。 ただし、この方法で発生するのはcollision_start?イベントとcollision_end?イベントのみです。 ファントムオブジェクトでcollision?イベントを発生させることはできませんので注意して下さい。 また、ファントムではないオブジェクトでllVolumeDetect?関数を使うと、オブジェクトがファントムになってしまいます(^^; ま、余談はこのくらいで・・・。 衝突版自動ドア では自動ドアを作ってみましょう。 前に作ったドアを再利用してもいいですが、衝突判定するためのマット等を追加して下さい。 ルートプリムはマットに設定します。 今回はドアの部分だけをスライドさせますが、複数の子プリムをまとめて動かすことはできません。 それぞれをバラバラに動かしますので、あまりプリムの数が多いと動きが怪しくなります。 こんな感じのドアがベストではないでしょうか。 autodoor_prim.jpg ではスクリプトです。 ルートプリムに仕込むメインのスクリプトと、子プリムに仕込むスクリプトの二種類があります。 メインスクリプトは衝突判定を行い、子プリムのスクリプトは開く/閉じる動作を行います。 スクリプト間の通信は、以前使ったllMessageLinked関数を使います。 まずはメインのスクリプトから。 default { collision_start(integer num_detected){ llMessageLinked(LINK_SET, 1, "", NULL_KEY); } } いいのかこれだけで・・・って感じですが(^^; ルートプリム(マット部分)に仕込むメインスクリプトは、あくまでも衝突の判定だけを行い、誰かがぶつかったらリンクメッセージを飛ばすだけです。 これだけですとアバターだけでなく、オブジェクトがぶつかっただけでも反応しますので、アバター限定にするのであれば、 default { collision_start(integer num_detected){ if (llDetectedType(0) AGENT){ llMessageLinked(LINK_SET, 1, "", NULL_KEY); } } } このようにします。 llDetectedType()関数は衝突したのが何なのか(アバター?オブジェクト?)を取得するための関数です。 これに「 AGENT」と付けてやることで、アバターかどうかの判定ができます。 続いて子プリム(ドア部分)のスクリプトです。 vector close_pos; vector open_pos = 0.0, 1.0, 0.0 ; integer opened = FALSE; default{ state_entry(){ close_pos = llGetLocalPos(); } link_message(integer sender, integer num, string str, key id) { if (!opened){ llSetPos(close_pos + open_pos); opened = TRUE; } llSetTimerEvent(5.0); } timer() { if (opened){ llSetPos(close_pos); opened = FALSE; } llSetTimerEvent(0.0); } } こちらも複雑ではないですね。 前に作ったセンサーのドアからの改造です。 センサーのときは、誰かを検知したらオープン、誰も検知しなかったらクローズにしていましたが、今回はリンクメッセージを受け取ったらオープンし、最後にメッセージを受け取ってから5秒たつと自動的にクローズします。 また、ステートエントリー内で「閉まったときの位置」を取得している部分に注意して下さい。 センサーのときはここでllGetPos()を使っていましたが、今回はllGetLocalPos()を使っています。 llGetLocalPos()関数は、子プリムの相対位置を取得するための関数です。 子プリムでllSetPos?()を使うときには、相対位置での指定になりますので、close_posに絶対位置を保持してしまうとおかしなことになります。 autodoor.jpg 最終回にして説明する基本的なことですが(^^; 相対座標と絶対座標とは、上記のような関係です。 llSetPos?()はルートプリムで使うときには絶対座標を使いますが、子プリムで使うときには相対座標です。 今回は子プリムをllSetPos?()で動かしますので、相対座標を使わなければなりません。 ですので、絶対座標50,25,21ではなく、相対座標0,0,1のほうを取得しているのです。 今回のポイント 衝突イベント: collision_start(integer num_detected){ // 衝突が始まったときの処理 } collision(integer num_detected){ // 衝突し続けているときの処理 } collision_end(integer num_detected){ // 衝突が終わったときの処理 } 絶対座標と相対座標: 関数 ルート 子プリム llSetPos 絶対座標 相対座標 llGetPos 絶対座標 絶対座標 llGetLocalPos 絶対座標 相対座標 これだけでもややこしいかもしれませんが、アタッチメントになるとさらに複雑ですw アタッチメントの場合: 関数 ルート 子プリム llSetPos アバターとの相対座標 ルートとの相対座標 llGetPos アバターの絶対座標 ルートとの相対座標 llGetLocalPos アバターとの相対座標 ルートとの相対座標 最後に 初級スクリプト講座はこれにて一旦幕としたいと思います。 スクリプトを学んでいく上で基本的なことは一通り書いてきたつもりですが、おそらく十分ではないことも承知しています。 今後も単発的に「これは書いておいたほうがいいなぁ」と思うことは記事にしていくつもりでいます。 私がこの一連の記事を書いた動機は、多くの人にlslで遊んでいただきたかったからです。 スクリプトを仕込んだ商品を売っている立場としては、ノウハウを書くことはある意味自分の首を絞めることになるのですが、自分の商品が売れる以上に、多くの面白いものがSL内に出現したほうがSL全体にとってプラスであることは言うまでもないことでしょう。 私のつたない記事を読んでスクリプトに親しんだ皆さんが、楽しいアイテムをいろいろと開発して下さったなら、それ以上に嬉しいことはありません。 なるべく詳細な解説を心がけたのは、スクリプトはオープンであるべきだと思っていたからです。 lslの解説本を発行する企画などもあるようですが(あるいはもう出版されたりしているのかな?w)、スクリプトのスキルをオープンなものにしていくのが目的ならば、必ずしも書籍化の必要は無いと思っています。 むしろコメントやメール等で読者さんと直接にコミュニケーションを取れるWebのほうが目的にはかなっているはずです。 そういう意味ではSLをネタにして商売しようとする方々に対する挑戦でもありましたw 私はあくまでもSLはツールに過ぎないと思っています。 lslも同じです。 勝負すべきところは「ツールを使って何を作るか」であって、ツールそのものを売りにするのはリンデンだけで十分ですw そのリンデンでさえ、クライアントやサーバーのオープン化を進めているのですから、lslの情報もやはりオープンかつフリーであるべきなのです。 そんな気持ちを隠しつつ連載を続けてきましたが、正直な話、毎日これだけの記事を更新するのは非常に大変でした(^^; 続けてこれたのは読者の皆さんの応援があったからこそです。 特に「書籍になってもおかしくない内容だ」「ガイドブックより詳細だ」などの評価にはニンマリしておりましたw 急いで書き散らしたところもありますので、コード等に不備があったり、十分に説明がなされていなかったりした点については深くお詫びいたします。 気づき次第修正していますので(すぐ直せるのもWebの利点ですよね)、おかしな点などありましたらご指摘下さい。 また、質問等もご遠慮なくコメントしてくださって構いません(^^ では、ほぼ一ヶ月にわたってお付き合い下さった読者の皆様に感謝しつつ、これにて初級スクリプトの終わりと致します。 ありがとうございました。
https://w.atwiki.jp/wendyz/pages/19.html
ODE環境下、 .\ode-0.12\ode\demo\demo_crash.cpp を改変したサンプルプログラムを使ってODEの使い方を確認する。 サンプルコードの実行イメージ ここで使用しているODE API dInitODE2() int dInitODE2( unsigned int uiInitFlags /*=0*/ ); 引数のuiInitFlagsには、dInitODEFlags列挙体の値を指定する。 処理が成功した場合にはゼロ以外の値を返す。 enum dInitODEFlags { // dCleanupODEAllDataForThread()関数の呼び出し時に、 // スレッドのローカルデータが確実に消去されるようにする dInitFlagManualThreadCleanup = 0x00000001, }} dCloseODE() void dCloseODE( void ) ODE終了処理。 このAPIを呼び出す前にほか全てのワールド、スペース、ジョイントグループなどの開放を行う必要がある。 dWorldCreate() dWorldID dWorldCreate( void ); ボディとジョイントを格納する動力学演算世界を生成する。 dWorldDestroy() void dWorldDestroy ( dWorldID world ); 世界を破棄する。格納されるているボディと、ジョイント グループに含まれないジョイントも同時に破棄される。 dWorldStep() void dWorldStep ( dWorldID world, dReal stepsize ); worldに対してstepsize分の演算を進める。 dWorldQuickStep() void dWorldQuickStep ( dWorldID world, dReal stepsize ); worldに対してstepsize分の処理速度を重視した演算を進める。 dWorldSetQuickStepNumIterations() void dWorldSetQuickStepNumIterations ( dWorldID, int num ); QuickStepのくり返し (iteration) 数を増加させることで、演算の精度を上げることができる。 しかし、その分処理時間がかかる。デフォルトはiteration=20 dSimpleSpaceCreate() dSpaceID dSimpleSpaceCreate ( dSpaceID space ); 新規にスペースを生成する。スペースは物体を格納する空間のこと。 スペースの内部にスペースを配置することも可能。 dHashSpaceCreate() dSpaceID dHashSpaceCreate ( dSpaceID space ); 引数のspace内に新しいスペースを作成する。 新規にスペースを作成するときは、引数に0を指定する。 dSweepAndPruneSpaceCreate() ???? dSpaceDestroy() void dSpaceDestroy ( dSpaceID ); スペースを破棄する。 dSpaceCollide() void dSpaceCollide ( dSpaceID space, // 検査対象とするスペース void *data, // コールバック関数に渡す任意のデータ dNearCallback *callback // 衝突時に呼び出されるコールバック関数 ); シミュレーションステップごとに衝突検出を実行する。 衝突が検出されると渡したコールバック関数が呼ばれる。 衝突する可能性のあるジオメトリが検出されたときには、 そのジオメトリの組ごとにそれを引数として指定のコールバック関数が呼び出される。 衝突コールバック関数 typedef void dNearCallback ( void *data, // dSpaceCollideから渡される任意のデータ dGeomID o1, // 衝突する可能性のあるジオメトリ(スペース)1 dGeomID o2 // 衝突する可能性のあるジオメトリ(スペース)2 ); この関数はジオメトリが衝突する可能性があるときに呼び出される。 本当に衝突しているかどうかは、接触情報を調べて確認する必要がある。 dCreateBox() dGeomID dCreateBox ( dSpaceID space, dReal lx, dReal ly, dReal lz ); 直方体の生成。 dCreateSphere() dGeomID dCreateSphere ( dSpaceID space, dReal radius ); 球体の生成。 dCreateCapsule() dGeomID dCreateCapsule ( dSpaceID space, dReal radius, dReal length ); カプセルの生成。 dCreateCylinder() dGeomID dCreateCylinder ( dSpaceID space, dReal radius, dReal length ); 円柱の生成。 dCreatePlane() dGeomID dCreatePlane ( dSpaceID space, dReal a, dReal b, dReal c, dReal d ); 平面の生成。 dBodyCreate() dBodyID dBodyCreate ( dWorldID ); ボディーの生成。ワールドの破棄によって自動破棄される。 dBodySetPosition() void dBodySetPosition ( dBodyID, dReal x, dReal y, dReal z ); ボディの座標を指定する。 dBodySetLinearVel() void dBodySetLinearVel ( dBodyID, dReal x, dReal y, dReal z ); ボディに速度を設定する。 dBodySetAngularVel() void dBodySetAngularVel ( dBodyID, dReal x, dReal y, dReal z ); ボディに角速度を設定する。 dBodyEnable() void dBodyEnable ( dBodyID ); ボディを有効化する。生成時は基本的に有効化状態。 dBodyDisable() void dBodyDisable ( dBodyID ); ボディを無効化する。無効化されたボディはシミュレーション対象外となる。 dBodyIsEnabled() int dBodyIsEnabled ( dBodyID ); ボディの有効化状態を確認する。1=有効 0=無効 dBodySetMass() void dBodySetMass ( dBodyID, const dMass *mass ); ボディに質量パラメータを設定する。 dMassSetSphereTotal() void dMassSetSphereTotal ( dMass *mass, dReal total_mass, // 質量 dReal radius // 半径 ); 球体 (Sphere) dMassSetBoxTotal() void dMassSetBoxTotal ( dMass *mass, dReal total_mass, // 質量 dReal lx, // x軸方向の長さ dReal ly, // y軸方向の長さ dReal lz // z軸方向の長さ ); 直方体 (Box) dMassSetCapsuleTotal() void dMassSetCapsuleTotal ( dMass *mass, dReal total_mass, // 質量 int direction, // 長軸方向(1=x軸 2=y軸 3=z軸) dReal radius, // 半径 dReal length // 長さ ); カプセル (Capsule) dMassSetCylinderTotal() void dMassSetCylinderTotal ( dMass *mass, dReal total_mass, // 質量 int direction, // 長軸方向(1=x軸 2=y軸 3=z軸) dReal radius, // 半径 dReal length // 長さ ); 円柱 (Cylinder) dGeomSetBody() void dGeomSetBody ( dGeomID geom, dBodyID body ); ボディとジオメトリを関連付ける。 dGeomGetBody() dBodyID dGeomGetBody ( dGeomID geom ); ジオメトリに関連付けられたボディを取得する。 dJointCreateContact() dJointCreateContact( dWorldID, dJointGroupID, const dContact * // 接触面の定義 ); 接触のジョイントを生成する。 dJointAttach() void dJointAttach ( dJointID joint, // 接続するジョイント dBodyID body1, // 接続されるボディ1 dBodyID body2 // 接続されるボディ2 ); 2つのボディをジョイントで接続する。 指定したジョイントがすでに他のボディの接続に使用されていた場合には、そのボディの接続は解除される。 body1またはbody2に0が指定された場合には、他方のボディは静的な環境 (static environment) と接続され固定される。 dJointGroupCreate() dJointGroupID dJointGroupCreate ( int max_size ); ジョイントグループを作成する。 max_sizeは互換性のために残されているもので、現在では常に0を指定。 dJointGroupDestroy() void dJointGroupDestroy ( dJointGroupID ); ジョイントグループを破棄する。 dRFromAxisAndAngle() dAreConnected() dAllocateODEDataForThread() dsSimulationLoop() dsDrawBoxD() dsDrawSphereD() dsSetColor() サンプルコード /************************************************************************* * * * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * * All rights reserved. Email russ@q12.org Web www.q12.org * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of EITHER * * (1) The GNU Lesser General Public License as published by the Free * * Software Foundation; either version 2.1 of the License, or (at * * your option) any later version. The text of the GNU Lesser * * General Public License is included with this library in the * * file LICENSE.TXT. * * (2) The BSD-style license that is included with this library in * * the file LICENSE-BSD.TXT. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * * LICENSE.TXT and LICENSE-BSD.TXT for more details. * * * *************************************************************************/ // This is a demo of the QuickStep and StepFast methods, // originally by David Whittaker. #include ode/ode.h #include drawstuff/drawstuff.h #include "texturepath.h" #ifdef _MSC_VER #pragma warning(disable 4244 4305) // for VC++, no precision loss complaints #endif // select correct drawing functions #ifdef dDOUBLE #define dsDrawBox dsDrawBoxD #define dsDrawSphere dsDrawSphereD #define dsDrawCylinder dsDrawCylinderD #define dsDrawCapsule dsDrawCapsuleD #endif // some constants #define LENGTH 3.5// chassis length #define WIDTH 2.5// chassis width #define HEIGHT 1.0// chassis height #define RADIUS 0.5// wheel radius #define STARTZ 1.0// starting height of chassis #define CMASS 1// chassis mass #define WMASS 1// wheel mass #define COMOFFSET -5// center of mass offset #define WALLMASS 1// wall box mass #define BALLMASS 1// ball mass #define FMAX 25// car engine fmax #define ROWS 1// rows of cars #define COLS 1// columns of cars #define ITERS 15 // number of iterations #define WBOXSIZE 0.5// size of wall boxes #define WALLWIDTH 20// width of wall #define WALLHEIGHT 20// height of wall #define DISABLE_THRESHOLD 0.008// maximum velocity (squared) a body can have and be disabled #define DISABLE_STEPS 20 // number of steps a box has to have been disable-able before it will be disabled #define CANNON_X 15// x position of cannon #define CANNON_Y 0// y position of cannon #define CANNON_BALL_MASS 10// mass of the cannon ball #define CANNON_BALL_RADIUS 0.5 #define WALL #define CANNON // dynamics and collision objects (chassis, 3 wheels, environment) static dWorldID world; static dSpaceID space; static dBodyID body[10000]; static int bodies; static dJointID joint[100000]; static int joints; static dJointGroupID contactgroup; static dGeomID ground; static dGeomID box[10000]; static int boxes; static dGeomID sphere[10000]; static int spheres; static dGeomID wall_boxes[10000]; static dBodyID wall_bodies[10000]; static dGeomID cannon_ball_geom; static dBodyID cannon_ball_body; static int wb_stepsdis[10000]; static int wb; static bool doFast; static dBodyID b; static dMass m; // things that the user controls static dReal turn = 0, speed = 0;// user commands static dReal cannon_angle=0,cannon_elevation=-1.2; // this is called by dSpaceCollide when two objects in space are // potentially colliding. static void nearCallback (void *data, dGeomID o1, dGeomID o2) { int i,n; dBodyID b1 = dGeomGetBody(o1); dBodyID b2 = dGeomGetBody(o2); if (b1 b2 dAreConnected(b1, b2)) return; const int N = 4; dContact contact[N]; n = dCollide (o1,o2,N, contact[0].geom,sizeof(dContact)); if (n 0) { for (i=0; i n; i++) { contact[i].surface.mode = dContactSlip1 | dContactSlip2 | dContactSoftERP | dContactSoftCFM | dContactApprox1; if (dGeomGetClass(o1) == dSphereClass || dGeomGetClass(o2) == dSphereClass) contact[i].surface.mu = 20; else contact[i].surface.mu = 0.5; contact[i].surface.slip1 = 0.0; contact[i].surface.slip2 = 0.0; contact[i].surface.soft_erp = 0.8; contact[i].surface.soft_cfm = 0.01; dJointID c = dJointCreateContact (world,contactgroup,contact+i); dJointAttach (c,dGeomGetBody(o1),dGeomGetBody(o2)); } } } // start simulation - set viewpoint static void start() { dAllocateODEDataForThread(dAllocateMaskAll); static float xyz[3] = {3.8548f,9.0843f,7.5900f}; static float hpr[3] = {-145.5f,-22.5f,0.25f}; dsSetViewpoint (xyz,hpr); printf ("Press \t a to increase speed.\n" "\t z to decrease speed.\n" "\t , to steer left.\n" "\t . to steer right.\n" "\t to reset speed and steering.\n" "\t [ to turn the cannon left.\n" "\t ] to turn the cannon right.\n" "\t 1 to raise the cannon.\n" "\t 2 to lower the cannon.\n" "\t x to shoot from the cannon.\n" "\t f to toggle fast step mode.\n" "\t r to reset simulation.\n"); } void resetSimulation() { int i; i = 0; // destroy world if it exists if (bodies) { dJointGroupDestroy (contactgroup); dSpaceDestroy (space); dWorldDestroy (world); } for (i = 0; i 1000; i++) wb_stepsdis[i] = 0; // recreate world world = dWorldCreate(); //space = dHashSpaceCreate( 0 ); //space = dSimpleSpaceCreate( 0 ); space = dSweepAndPruneSpaceCreate( 0, dSAP_AXES_XYZ ); contactgroup = dJointGroupCreate (0); dWorldSetGravity (world,0,0,-1.5); dWorldSetCFM (world, 1e-5); dWorldSetERP (world, 0.8); dWorldSetQuickStepNumIterations (world,ITERS); ground = dCreatePlane (space,0,0,1,0); bodies = 0; joints = 0; boxes = 0; spheres = 0; wb = 0; #ifdef WALL bool offset = false; for (dReal z = WBOXSIZE/2.0; z = WALLHEIGHT; z+=WBOXSIZE) { offset = !offset; for (dReal y = (-WALLWIDTH+z)/2; y = (WALLWIDTH-z)/2; y+=WBOXSIZE) { wall_bodies[wb] = dBodyCreate (world); dBodySetPosition (wall_bodies[wb],-20,y,z); dMassSetBox ( m,1,WBOXSIZE,WBOXSIZE,WBOXSIZE); dMassAdjust ( m, WALLMASS); dBodySetMass (wall_bodies[wb], m); wall_boxes[wb] = dCreateBox (space,WBOXSIZE,WBOXSIZE,WBOXSIZE); dGeomSetBody (wall_boxes[wb],wall_bodies[wb]); //dBodyDisable(wall_bodies[wb++]); wb++; } } dMessage(0,"wall boxes %i", wb); #endif #ifdef CANNON cannon_ball_body = dBodyCreate (world); cannon_ball_geom = dCreateSphere (space,CANNON_BALL_RADIUS); dMassSetSphereTotal ( m,CANNON_BALL_MASS,CANNON_BALL_RADIUS); dBodySetMass (cannon_ball_body, m); dGeomSetBody (cannon_ball_geom,cannon_ball_body); dBodySetPosition (cannon_ball_body,CANNON_X,CANNON_Y,CANNON_BALL_RADIUS); #endif } // called when a key pressed static void command (int cmd) { switch (cmd) { case a case A speed += 0.3; break; case z case Z speed -= 0.3; break; case , turn += 0.1; if (turn 0.3) turn = 0.3; break; case . turn -= 0.1; if (turn -0.3) turn = -0.3; break; case speed = 0; turn = 0; break; case f case F doFast = !doFast; break; case r case R resetSimulation(); break; case [ cannon_angle += 0.1; break; case ] cannon_angle -= 0.1; break; case 1 cannon_elevation += 0.1; break; case 2 cannon_elevation -= 0.1; break; case x case X { dMatrix3 R2,R3,R4; dRFromAxisAndAngle (R2,0,0,1,cannon_angle); dRFromAxisAndAngle (R3,0,1,0,cannon_elevation); dMultiply0 (R4,R2,R3,3,3,3); dReal cpos[3] = {CANNON_X,CANNON_Y,1}; for (int i=0; i 3; i++) cpos[i] += 3*R4[i*4+2]; dBodySetPosition (cannon_ball_body,cpos[0],cpos[1],cpos[2]); dReal force = 10; dBodySetLinearVel (cannon_ball_body,force*R4[2],force*R4[6],force*R4[10]); dBodySetAngularVel (cannon_ball_body,0,0,0); break; } } } // simulation loop static void simLoop (int pause) { int i, j; dsSetTexture (DS_WOOD); if (!pause) { for (j = 0; j joints; j++) { dReal curturn = dJointGetHinge2Angle1 (joint[j]); //dMessage (0,"curturn %e, turn %e, vel %e", curturn, turn, (turn-curturn)*1.0); dJointSetHinge2Param(joint[j],dParamVel,(turn-curturn)*1.0); dJointSetHinge2Param(joint[j],dParamFMax,dInfinity); dJointSetHinge2Param(joint[j],dParamVel2,speed); dJointSetHinge2Param(joint[j],dParamFMax2,FMAX); dBodyEnable(dJointGetBody(joint[j],0)); dBodyEnable(dJointGetBody(joint[j],1)); } if (doFast) { dSpaceCollide (space,0, nearCallback); dWorldQuickStep (world,0.05); dJointGroupEmpty (contactgroup); } else { dSpaceCollide (space,0, nearCallback); dWorldStep (world,0.05); dJointGroupEmpty (contactgroup); } for (i = 0; i wb; i++) { b = dGeomGetBody(wall_boxes[i]); if (dBodyIsEnabled(b)) { bool disable = true; const dReal *lvel = dBodyGetLinearVel(b); dReal lspeed = lvel[0]*lvel[0]+lvel[1]*lvel[1]+lvel[2]*lvel[2]; if (lspeed DISABLE_THRESHOLD) disable = false; const dReal *avel = dBodyGetAngularVel(b); dReal aspeed = avel[0]*avel[0]+avel[1]*avel[1]+avel[2]*avel[2]; if (aspeed DISABLE_THRESHOLD) disable = false; if (disable) wb_stepsdis[i]++; else wb_stepsdis[i] = 0; if (wb_stepsdis[i] DISABLE_STEPS) { dBodyDisable(b); //dsSetColor(0.5,0.5,1); } //else //dsSetColor(1,1,1); } else dsSetColor(0.4,0.4,0.4); dVector3 ss; dGeomBoxGetLengths (wall_boxes[i], ss); dsDrawBox(dGeomGetPosition(wall_boxes[i]), dGeomGetRotation(wall_boxes[i]), ss); } } else { for (i = 0; i wb; i++) { b = dGeomGetBody(wall_boxes[i]); if (dBodyIsEnabled(b)) dsSetColor(1,1,1); else dsSetColor(0.4,0.4,0.4); dVector3 ss; dGeomBoxGetLengths (wall_boxes[i], ss); dsDrawBox(dGeomGetPosition(wall_boxes[i]), dGeomGetRotation(wall_boxes[i]), ss); } } dsSetColor (0,1,1); dReal sides[3] = {LENGTH,WIDTH,HEIGHT}; for (i = 0; i boxes; i++) dsDrawBox (dGeomGetPosition(box[i]),dGeomGetRotation(box[i]),sides); dsSetColor (1,1,1); for (i=0; i spheres; i++) dsDrawSphere (dGeomGetPosition(sphere[i]), dGeomGetRotation(sphere[i]),RADIUS); // draw the cannon dsSetColor (1,1,0); dMatrix3 R2,R3,R4; dRFromAxisAndAngle (R2,0,0,1,cannon_angle); dRFromAxisAndAngle (R3,0,1,0,cannon_elevation); dMultiply0 (R4,R2,R3,3,3,3); dReal cpos[3] = {CANNON_X,CANNON_Y,1}; dReal csides[3] = {2,2,2}; dsDrawBox (cpos,R2,csides); for (i=0; i 3; i++) cpos[i] += 1.5*R4[i*4+2]; dsDrawCylinder (cpos,R4,3,0.5); // draw the cannon ball dsDrawSphere (dBodyGetPosition(cannon_ball_body),dBodyGetRotation(cannon_ball_body), CANNON_BALL_RADIUS); } int main (int argc, char **argv) { doFast = true; // setup pointers to drawstuff callback functions dsFunctions fn; fn.version = DS_VERSION; fn.start = start; fn.step = simLoop; fn.command = command; fn.stop = 0; fn.path_to_textures = DRAWSTUFF_TEXTURE_PATH; dInitODE2(0); bodies = 0; joints = 0; boxes = 0; spheres = 0; resetSimulation(); // run simulation dsSimulationLoop (argc,argv,1600,900, fn); dJointGroupDestroy (contactgroup); dSpaceDestroy (space); dWorldDestroy (world); dCloseODE(); return 0; }
https://w.atwiki.jp/msrw/pages/77.html
ミッション23:火星衝突 原作:無敵鋼人ダイターン3 ミッション概要 火星を地球に衝突させようという メガノイドたちの作戦を阻止せよ! 作戦情報 フィールド:宇宙 作戦難易度:★★★★★★★★ 参加機体数:最大5機 強制出撃:ダイターン3 成功報酬 資金報酬:60000G GP報酬:300GP 格納庫(初回のみ):ダイターン3 勝利条件 1.司令基地への到着→アイアイ(コロス機)の撃墜→ドン・ザウサーの撃墜 敗北条件 1.ダイターン3の撃墜 EX条件 1.10ターン以内にクリア 2.戦闘被害0でクリア 3.回復行動を行わずにクリア 4.敵を全滅させてクリア 5.コロスを3ターン以内に撃墜 ⇒アイアイの形状変化解禁 6.ダイターン3がノーダメージ 7.EN消費0でクリア 8.格闘武器のみで4ターン以内にクリア 9.ダイターン3のみでクリア
https://w.atwiki.jp/tsfelysion/pages/198.html
【カードナンバー】:TSE-029 【名称】:正面衝突 【属性】:入れ替わり 【コスト】:6 【変化値】:2 【テキスト】:※自分の場にTSパワー2以上のサポートがない場合、このカードは使用できない。 【TSF効果】自分の場の、TSパワー2以上のサポートを一体選んで相手のサポートゾーンに移す。その後、このエフェクトでTSが成立したガーディアンのTS時効果は、このエフェクトの持ち主に適用し、ガーディアンの持ち主には適用されない。 【フレーバー】:「ちこくちこく~! ってあぶなっ――」 【イラストレーター】:あでぃ カードの説明、使用感 拡張フレーバー
https://w.atwiki.jp/gennsousekai/pages/209.html
【派閥間衝突】 上空において飛行船二つ。 雲擦れ擦れの高さで髑髏マークを棚引かせる二大勢力。 二つはこの辺りの空を縄張りにしていたが、この日遂に衝突。 中規模程度のこの船では、双方共倒れが関の山だろうか。 それでも彼らは戦う。自らの悦のために。 era2 事件
https://w.atwiki.jp/fantastical_world/pages/210.html
imageプラグインエラー ご指定のURLはサポートしていません。png, jpg, gif などの画像URLを指定してください。 【派閥間衝突】 上空において飛行船二つ。 雲擦れ擦れの高さで髑髏マークを棚引かせる二大勢力。 二つはこの辺りの空を縄張りにしていたが、この日遂に衝突。 中規模程度のこの船では、双方共倒れが関の山だろうか。 それでも彼らは戦う。自らの悦のために。 era3 事件
https://w.atwiki.jp/wiki8_infinity/pages/20.html
魔術部のスキルへ戻る 延槍衝突 Lv 1 2 3 4 5 6 7 8 9 条件 目標距離 ディレイ 持続時間 適用範囲 適用回数 HP変化 タゲ数 消費護符 MP消費 SP消費 状態異常 発生確率 打撃加算率 機能 距離 確率
https://w.atwiki.jp/potyon/pages/23.html
魔術部のスキルへ戻る 延槍衝突 Lv 1 2 3 4 5 6 7 8 9 条件 目標距離 ディレイ 持続時間 適用範囲 適用回数 HP変化 タゲ数 消費護符 MP消費 SP消費 状態異常 発生確率 打撃加算率 機能 距離 確率
https://w.atwiki.jp/unitymemo/pages/19.html
衝突した時 private void OnCollisionEnter(Collision collision) 衝突中 private void OnCollisionStay(Collision collision) 衝突終わった(離れた) private void OnCollisionExit(Collision collision) collision.gameObjectが衝突相手のオブジェクト 衝突位置の取得 http //kan-kikuchi.hatenablog.com/entry/CollisionEffect void OnCollisionEnter (Collision collision) { foreach (ContactPoint point in collision.contacts) { //衝突位置 Debug.Log (point); } } カメラに写っていない時は衝突を無効にする if(GetComponent Collider ()){ GetComponent Collider ().enabled = _isRendered; } if(GetComponent Collider2D ()){ GetComponent Collider2D ().enabled = _isRendered; } //カメラに映ってる間に呼ばれる private void OnWillRenderObject(){ //メインカメラに映った時だけ_isRenderedを有効に if(Camera.current.tag == MAIN_CAMERA_TAG_NAME){ _isRendered = true; }