サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
TGS2024
www.sousakuba.com
まず、ポリゴンのどちらを表側と定義するかについて... ・右手座標系のOPenGLでは視点から見て反時計回りだと表 ・左手座標系のDirectXでは視点から見て時計回りだと表 とされています。なぜ逆なのかというと、外積(AB×BC)のベクトルがポリゴンの表側を示すからです。 つまり外積で表裏を判定できます。 外積(AB×BC)がポリゴンの表側ベクトル 三角形ABCのベクトルABとBCを外積することで直交するベクトルが作れます。 表裏の定義を逆にしたことで、座標系にかかわらず直交ベクトルはポリゴンの表側を向きます。 この直交ベクトルと、視点の方向ベクトルで内積を求めれば表裏が判定できます。 外積によるベクトルの向き( 右手座標系では3角形の反時計周り側を向く) ポリゴンの回り順を逆にすると外積ベクトルは反対を向く。裏表も入れ替わります。 カメラや太陽光となるベクトルvに対して、ポリゴンが表裏
作文、ネーム、絵コンテ等の原稿用紙を無料ダウンロード
平面方程式を計算する プログラミング例 #include <math.h> //平面の定義 class Plane { //ax+by+cz+d=0 public: double a,b,c,d; Plane(){} Plane(double a,double b,double c,double d){ this->a = a; this->b = b; this->c = c; this->d = d; } }; //ベクトルの定義 class Vector3D{ public: double x,y,z; Vector3D(){} Vector3D( double x, double y, double z) {this->x = x; this->y = y; this->z = z; } //ベクトル引き算( this - v ) Vector3D operator - ( con
#include <math.h> //平面の定義 class Plane { //ax+by+cz+d=0 public: double a,b,c,d; Plane(){} Plane(double a,double b,double c,double d){ this->a = a; this->b = b; this->c = c; this->d = d; } }; //ベクトルの定義 class Vector3D{ public: double x,y,z; Vector3D(){} Vector3D( double x, double y, double z) {this->x = x; this->y = y; this->z = z; } }; //頂点の定義(ベクトルと同じ) #define Vertex3D Vector3D //線分ABと平面の交点を計算する boo
アニメーションGIFをコマ送りで再生したり静止画像を保存できます。動画の研究にどうぞ。 画像データはアップロードされませんので安心してご利用ください(ユーザーのPCで処理しています)
ABCの3点で構成されるポリゴンから、法線ベクトルを求めるには... 外積で直交ベクトルを作ることができるので、これを利用します。 ポリゴンの法線を計算する プログラミング例 #include <math.h> //ベクトルの定義と各種計算 class Vector3D{ public: double x; double y; double z; Vector3D(){} Vector3D( double x, double y, double z) {this->x = x; this->y = y; this->z = z; } Vector3D( const Vector3D& v ) { x = v.x; y = v.y; z = v.z; } //ベクトル引き算( this - v ) Vector3D operator - ( const Vector3D& v ) const
単位ベクトルの使い方: たとえばAからBへ向けて、dだけ進む位置を知りたい場合... ABベクトルを単位ベクトルにしてdをかけると、その位置が分かります。 単位ベクトルを計算する プログラミング例 (2次元) 3次元のプログラミング例へ #include <math.h> //ベクトルの定義 struct Vector2D{ double x; double y; }; //単位ベクトルを計算する Vector2D get_unit_vector( Vector2D v ) { //ベクトルの長さ double length = pow( ( v.x * v.x ) + ( v.y * v.y ), 0.5 ); //XY各成分を長さで割る Vector2D unit; unit.x = v.x / length; unit.y = v.y / length; return unit; }
点1(x1,y1)と点2(x2,y2)の点間距離を求める式は... 詳細は「ピタゴラスの定理」で検索すると出てきます。 プログラミング例: #include <math.h> double x1, y1, x2, y2; double length = pow( (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1), 0.5 );
(3次元の場合) AとBの内積 = Ax * Bx + Ay * By + Az * Bz (2次元の場合) AとBの内積 = Ax * Bx + Ay * By
点ABを通る線と点Pから、点と直線の距離Hを求めるには... ベクトルABとベクトルAPを外積(cross product)して、Dの面積を求めます。 Dの面積 = ベクトルAB × ベクトルAP Dは平行四辺形なので「 H * L = D 」であることがわかります。 点と直線の距離H = D / L プログラミング例(2次元) #include <math.h> //頂点の定義 struct Vertex2D{ double x; double y; }; //ベクトルの定義(頂点と同じ) #define Vector2D Vertex2D //点間距離 double distance_vertex(Vertex2D p1, Vertex2D p2) { return pow( ( p2.x - p1.x ) * ( p2.x - p1.x ) + ( p2.y - p1.y ) * (
同一平面上にある三角形と点について、 三角形の内側に点があるかどうかは、外積を使って調べることができます。 三角形の内側に点があるとき、外積によるベクトルは3つとも同じ方を向きます 三角形の外側に点があるとき、外積ベクトルの向きは揃いません この性質を利用して、3つの外積ベクトルの向きを比較すると、三角形の内外判定ができます。 点と三角形の当たり判定を行うプログラムです。2D用3D用ありますが考え方は同じです。 点と三角形の内外判定 2Dの場合 3Dの場合はこちら... 3つの外積ベクトルを求め、Z成分を比較してベクトル方向が同じか判定します。 #include <math.h> struct Vector2D{ double x; double y; }; //頂点の定義(ベクトルと同じ) #define Vertex2D Vector2D //ベクトル引き算(a-b) Vector2D
このあとcosθからθを計算しますが、 プログラミングではacos()という逆余弦を求める関数を使います。 acos()で求められる値は、ラジアン単位で0~πの範囲です。 0~180度の馴染みの角度(degree)で求めたい場合は下の式を用います。 2つのベクトルのなす角度 プログラミング例 (2次元) 3次元のプログラミング例へ #include <math.h> //ベクトルの定義 struct Vector2D{ double x; double y; }; //ベクトルの長さを計算する double get_vector_length( Vector2D v ) { return pow( ( v.x * v.x ) + ( v.y * v.y ), 0.5 ); } //ベクトル内積 double dot_product(Vector2D vl, Vector2D vr) { r
Photoshopプラグイン作りました。無料です。 カラーサークル、輝度を透明度に変換、etc...
HSBカラーサークルを使って色指定ができる、フリーのPhotoshopプラグインです。 カラーサークルを画面にずっと表示しておくことができます。 対応Photoshopバージョン: Photoshop CS5 CS6で動作確認しました。 (プラグインに関するPhotoshopの仕様変更がなければ以降のバージョンも使えると思います)
Flash版クッキーといいますか。 SharedObjectを使うとローカルマシンにFlashアプリのデータを保存することが出来ます。 データを自動保存してくれるフラッシュゲームも、これ使ってるのかな? package { import flash.display.Sprite; import flash.events.Event; import flash.net.SharedObject; import flash.text.*; public class Main extends Sprite { public function Main():void { var myShareObj:SharedObject = SharedObject.getLocal("flashCookie"); if ( myShareObj.data.lookCount != undefined ) {
ベクトルは方向と距離を持つ値 ベクトルは目標までの向きと距離を表しています。 つまり、ある位置からある位置に向けての移動量を表します。 ゲームプログラミングではベクトルを使って物体間の距離や方向を調べたり物体を移動させます。 後で紹介するベクトルの内積・外積は当たり判定などに使われます。 3Dプログラミングに欠かせない数学ですね。 図にすると1本の矢印になります。 この例は3次元ベクトルなのでベクトルVはx,y,zの3つの数値で構成されます。 図のxyz軸の交点ですが「交点が原点(0,0,0)にあるとは限りません」 図にしたために誤解しやすいのですが、ベクトルが持つ情報は目標までの向きと距離だけです。 ならば交点はどこにあるのかというとどこにでもなり得ます。 用途によって自分で決めてしまえばいいのです。 好きな位置から移動を開始できる。これがベクトルの都合のいいところ。 ちなみにxyz軸の
[2013.10.05] 点と平面の距離 平面上の最近点 [2013.09.29] 点と三角形の内外判定 点と三角形の当たり判定をします。 [2013.09.28] ポリゴンの表裏判定 OPenGLとDirectXで混乱した。結局一緒なのかー。 [2013.09.27] 十字キーと8方向キーの方向判定 スマホで仮想十字キー作ったりドラッグ方向の判定にどうぞ。 [2013.09.26] 2線の交点を求める方法 3次元でも2次元でも大丈夫な2線の交点を求める方法です。 [2013.02.16] お詫びと訂正。 斜方投射で説明していた式に誤りがありました。ご指摘いただいた方ありがとうございます。 http://www.sousakuba.com/Programming/algo_dandoukeisan2.html 旧 新 ルートの中のプラスマイナスが逆でした。 [2012.11.30] 平面と
Flashアプリ、ゲームに使えるAS3のサンプル集です。 Flex SDKとFlashDevelopで無料の開発環境が作れます。
ダイクストラ法が何かを解説すると余計に難しくなるので省略しますが、 ダイクストラ法アルゴリズムを使う最大のメリットは、 「不要な経路が分かった時点で以降の計算を省略できる」 これに尽きます。 ではさっそく。一つ例を説明していきましょう。 さきほどの図です。スタート点をA、ゴール点をFとします。 青い数字は、それぞれの点間の移動に要する距離です。 ■Aの一つ隣の点を調べます Aの隣はBとCです。 BとCの各点にAからの検索がきたこと、そしてスタート地点から移動に要した距離をセットします。 両方とも「Aの10」になりますね。 さて次はAの隣、BとCについて調べていきましょう。 ■Bの一つ隣の点を調べます Bの隣はA,C,Dです。 Dにはこれまでと同じ方法で「Bの18」をセットできます。 ここからが大事なところです。 BからCへ向かうルートをたどるとき、Cはすでに一度探索が行われています。 Cが
斜方投射の軌跡を求める方法を紹介していきます。 ゲームプログラミングに使う物なので空気抵抗は考えません。重力だけを使い単純な放物線を描く斜方投射を扱います。 ベクトルで計算すると三角関数を使わずに解ける 高校の物理で習う三角関数を使った方法でも斜方投射の軌跡は計算できますが、 三角関数は処理に負担がかかりますのでゲームプログラミングではできるだけ避けたい計算です。 ベクトルを使った計算では、かけ算ひとつとベクトルの足し算だけで斜方投射の軌跡が得られます。
このページを最初にブックマークしてみませんか?
『www.sousakuba.com』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く