同次座標系

OpenGLプログラミングメモ内検索 / 「同次座標系」で検索した結果

検索 :
  • 同次座標系
    ... そこで登場するのが同次座標系です。 これは X,Y,Zに1次元増やして X,Y,Z,Wにして、Wを1にしたものです。 普通の座標系ではX/W,Y/W,Z/Wとなる点を表します。   こうする事でどんなメリットがあるのでしょうか? 行列の計算方法を思い出して下さい。 3次元のベクトルでは1×3行列となり4×4行列とは計算する事すらできません。 ところが4次元のベクトルになると1×4行列となり4×4行列と積の計算をする事が可能になります。 そして、良くできた事に平行移動や回転、拡大縮小等の行列、あるいは合成行列であっても積、 つまり乗算で全て計算できるようになります。                
  • 同次座標系で計算
    それでは、実際に計算してみます。 正しく処理されているのがわかると思います。 //#pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #include stdio.h #define WIDTH 100 #define HEIGHT 50 //マトリクス構造体 struct MATRIX {     union {         struct {             float _11, _12, _13, _14;             float _21, _22, _23, _24;             float _31, _32, _33, _34;             float _41, _42, _4...
  • スキンメッシュアニメーションの原理2
    ... そこで登場するのが同次座標系というものなのですが、解説は次回にします。          
  • メニュー
    ...メーションの原理2 同次座標系 幾何変換 同次座標系で計算 ボーンオフセット行列 スキンメッシュアニメーションの原理3 ウェイト 頂点ブレンディング .Xのスキンメッシュアニメーションを読み込んでみる2 法線の再設定 スキンメッシュアニメーションの原理4 .Xのスキンメッシュアニメーションを読み込んでみる3 ソフトウェアスキニング 固定機能編 おわりに… ▲▲▲▲▲ プログラマブルシェーダー編 ▼ シェーダー GLSL編 固定機能との違い 頂点シェーダー フラグメントシェーダー GLSLとの変数のやり取り シェーダーを使うにあたって 数学 極限 (その1) 数学 極限 (その2) 数学 Σ(シグマ)計算 (その1) 数学 Σ(シグマ)計算 (その2) 数学 対数(log) 数学 微分法 (その1) 数学 微分法 (その2) 数学 積分法 (その1) 数学 積分法 (...
  • なぜOpenGLを使うのか?
    なぜ、DirectXではなくOpenGLなのか? 最新のグラフィックス、最速の描画を行うのであれば間違いなくDirectXがベストですが、 3Dを勉強したい、ころころ変わるDirectXにはついて行けないという方、いろんなOSで シェーダーモデル5.0を使いたいという方にはOpenGLをおススメします。 OpenGL 4.0 OpenGL4.0を駆使すれば、MacOSやLinux、Windows XP、Vista、7、8の4世代のWindowsに渡って DirectX 11世代のシェーダーモデル5.0を使う事ができます。 DirectXより簡単 当サイト管理人の感想ですが、DirectXに比べてOpenGLは割と簡単な印象を受けます。 業界標準となる可能性 OpenGLが右手座標系、DirectXが左手座標系を採用しているのは大きな明暗。 数学や...
  • バインドポーズ
    バインドポーズの解説です。 ボーンは、グローバル座標上(絶対座標上)で、それぞれ自らの基準となる位置情報を持ちます。 その位置情報(行列)を元にボーンの基準系とも言うべきローカルな座標系が算出できる訳ですが、 そのボーンの行列の逆行列(グローバル座標の原点に戻す行列)の事を 『バインドポーズ』、あるいは『バインドポーズ行列』と呼びます。 ここまでの知識でスキンメッシュの初期姿勢(アニメーション無し)を ボーンも含めて表示する事ができるはずです。 では次回、スキンメッシュの初期姿勢を表示してみましょう。        
  • グローバル座標とローカル座標
    グローバル座標とローカル座標の解説です。 グローバル座標というのは、三次元空間そのもの(ワールド、シーン)の位置を表す座標の事です。 この座標は絶対無二の存在で決して移動したりする事はありません。 ワールド座標、絶対座標などと呼ばれる事もあります。   ローカル座標というのは三次元空間に配置されるオブジェクト(物)を基準とした座標の事です。 オブジェクトが配置されればされる程、ローカル座標が発生します。 グローバル座標の別名、絶対座標に対してローカル座標は相対座標と呼ばれる事もあります。        
  • 指定座標で円運動
    指定の座標で回転させます。 ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #define WIDTH 320 #define HEIGHT 240 //回転用 float angle = 0.0f; //白 GLfloat white[] = { 1.0, 1.0, 1.0, 1.0 }; //黄色 GLfloat yellow[] = { 1.0, 1.0, 0.0, 1.0}; float Radius=80.0f; float posX=120.0f; float posY=0.0f; float posZ=80.0f; void Line3D(float x1,flo...
  • スキンメッシュアニメーションの原理3
    スキンメッシュアニメーションの真髄、頂点に座標変換を 施す処理ですが、具体的には 頂点座標 × ボーンオフセット行列 × 座標変換行列 × バインドポーズ行列 という事になります。 スキンメッシュアニメーションの仕組みは ①ボーンが階層アニメーションを行っている。 ②頂点座標データを書き換える。 の次は ③頂点座標 × ボーンオフセット行列 × 座標変換行列 × バインドポーズ行列 と、なりそうですが、これで完全ではありません。 詳しくは言いませんが、これだけではモデルがバッキバキに変形してしまいます。 では、どうスムーズに変形させるかと言うと、頂点が各ボーンから受ける影響の 重み(ウェイト)を設定してあげれば良いですね。 解説は次回に回します。          
  • スキンメッシュアニメーションの原理4
    ここまでのおさらいです。 ①、ボーンが階層アニメーションを行っている。 ②、頂点座標データを書き換える。 ③、(頂点座標 × ボーンオフセット行列 × 座標変換行列 × バインドポーズ行列) × 頂点ウェイト ④、 ③を影響するボーンの数だけ処理して足す(頂点ブレンド) ⑤、 ④で得られた頂点座標を元に頂点法線を再設定する 以上でスキンメッシュアニメーションの処理は完成です。          
  • クォータニオンによる任意軸回転
    3次元座標を4元数で表す時は という感じにします。実部を0にして虚部に座標値を入れます。 任意軸の回転を行うには、原点を回転の中心にして回転軸の方向を表すベクトルを として、回転させる角度をθで表し、以下のクォータニオンを作成します。 そして以下の計算を実行するとベクトル V を向いた軸周りのθ回転させた座標が 得られます。        
  • 頂点ブレンディング
    頂点ブレンディングの解説です。 前回までの解説で各頂点が各ボーンから受ける頂点ウェイトの 影響の度合いがわかりました。   頂点ブレンディングとは、その影響を受けた頂点座標を 算出する処理の事です。   具体的には、 頂点座標 × ボーン行列 × 頂点ウェイト を、その頂点に影響するボーンの数だけ処理して それぞれの結果を足します。(ブレンドする) これが、頂点ブレンディング処理です。   ここまでの知識で、スキンメッシュアニメーションの基本的な事が できるようになっています。   次回、実際にスキンメッシュアニメーションを行ってみましょう。            
  • ボーンオフセット行列
    以下は SkinWeights チャンクですが、最後の方にある matrixOffset は ボーンオフセット行列と呼ばれます。 SkinWeights    {     Joint_2 ;  //transformNodeName ボーン名     32;  //nWeights ボーンの影響を受ける頂点の数     0,  // ↓ vertexIndices ボーンの影響を受ける頂点のインデックス ・ ・ ・     0.001631,  // ↓ weights ボーンの影響を受ける各頂点の重み ・ ・ ・     1.000000,0.000000,-0.000000,0.000000,  // ↓ matrixOffset     0.000000,1.000000,-0.000000,0.000000,  //メッシュの頂点をボーン空間に変換する行列     -0.000...
  • .Xを読み込んでみる2(解析編2)
    それでは、前回の続きでテクスチャを設定してUVと法線を出力する ようにしてXファイルを作りました。 例によってテンプレート部分は除去しています。 xof 0302txt 0064 Header{ 1; 0; 1; } Mesh {  3;  1.08418;-0.00726;0.62110;,  -1.10385;-0.70444;-1.10694;,  -1.38258;1.10387;-0.06233;;    1;  3;0,1,2;;    MeshMaterialList {   1;   1;   0;;   Material {    0.800000;0.800000;0.800000;1.000000;;    5.000000;    0.000000;0.000000;0.000000;;    0.000000;0.000000;0.000000;;    Te...
  • ソフトシャドウ
    ソフトシャドウです。 影の外側を、ぼやけさせます。 vertex.shader varying vec3 P; varying vec3 N; void main(void) {   P = vec3(gl_ModelViewMatrix * gl_Vertex);   N = normalize(gl_NormalMatrix * gl_Normal);     gl_TexCoord[0] = gl_TextureMatrix[0] * gl_Vertex;   gl_Position = ftransform(); } flagment.shader varying vec3 P; varying vec3 N; uniform sampler2DShadow shadowMap; uniform float dis;//サンプリング変位 float shadow = 0.3...
  • シャドウマッピング
    シャドウマッピングです。 一時的に視点を光源に移してみると光の当たる部分を見る事ができます。 その時の見えない部分=障害物=デプスバッファの値が影となります。 オブジェクトが別のオブジェクトに落とす影は、もちろんの事、 オブジェクト自身が自らに落とす影も描画する事ができます。 vertex.shader varying vec3 P; varying vec3 N; void main(void) {   P = vec3(gl_ModelViewMatrix * gl_Vertex);   N = normalize(gl_NormalMatrix * gl_Normal);     gl_TexCoord[0] = gl_TextureMatrix[0] * gl_Vertex;   gl_Position = ftransform(); } flagment.shader v...
  • 2D:点と点
    2Dの点と点の当たり判定です。 あまり使われる事はありませんが一応解説しておきます。 ずばり、点1と点2の座標が同じであれば当たっていると判定しますが、 それだけでは上手く判定できない場合があります。 以下のケースを考えてみます。          
  • 幾何変換
    幾何変換の解説です。 幾何変換とは、座標変換の ①平行移動 ②拡大、縮小 ③回転 の変換の事です。 今まで使用してきた glTranslatef とか glRotatef 等は アフィン変換と言います。 アフィン変換とは、形を変形させないで平行移動や回転、拡大縮小などの 変換をする事を言います。 スキンメッシュアニメーションは形を変形するアニメーションなので 幾何変換を用います。          
  • 3D:OBBとOBB
    OBBです。 バウンディングスフィアの応用で中心位置と半径を使い、 内積と外積を駆使して当たり判定を行います。 font.h #pragma once class GLFONT { public  HFONT Hfont;  HDC Hdc;  GLFONT(wchar_t *fontname, int size);  void DrawStringW(int x,int y,wchar_t *format, ...); }; //コンストラクタ フォント作成 GLFONT GLFONT(wchar_t *fontname, int size) {  Hfont = CreateFontW(         size,      //フォント高さ         0,       //文字幅         0,       //テキストの角度         0,       ...
  • 3Dシーンの設定と立方体の表示
    『2Dと3Dの描画を切り替える』では3Dシーンの設定をしていませんでした。 何も設定しないとライトや視点などは反映されません。 gluPerspective で視野角とアスペクト比、描画範囲を設定し、 gluLookAt で視点を設定、 glLightfv でライトの設定、 glMaterialfv でライトの反射を設定します。 glutSolidCube(size) で立方体を表示します。   ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #define WIDTH 320 #define HEIGHT 240 //赤 GLfloat red[] = { 1.0, 0.0, 0...
  • 球を表示して移動する
    球を表示して平行移動します。 glTranslatef(x,y,z) に値をセットする事で平行移動の行列を適用できます。 glutSolidSphere(半径,経線の分割数,緯線の分割数) で球を表示できます。   ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #define WIDTH 320 #define HEIGHT 240 //平行移動用 float x = 0.0f; bool flag = false; //緑 GLfloat green[] = { 0.0, 1.0, 0.0, 1.0 }; //ライトの位置 GLfloat lightpos[] = { 200....
  • カラーマテリアル
    カラーマテリアルです。 現在のglColorで設定されている値を使って材質設定します。 SHININESSは設定できません。   ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #include stdlib.h #define WIDTH 320 #define HEIGHT 240 //回転用 float anglex = 0.0f; //ライトの位置 GLfloat lightpos[] = { 200.0, 150.0, -500.0, 1.0 }; void display(void) {  glClear(GL_COLOR_BUFFER_BIT | GL_DEP...
  • トーラスの表示と回転
    トーラス、ドーナツ形状を描画します。 glRotatef(回転角度,X軸の影響度,Y軸の影響度,Z軸の影響度) で回転行列を適用し、 glutSolidTorus( 内側の半径,外側の半径,断面の分割数,リングの分割数) でトーラスを描画します。   ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #define WIDTH 320 #define HEIGHT 240 //回転用 float anglex = 0.0f; //オレンジ GLfloat orange[] = { 1.0, 0.6, 0.0, 1.0 }; //ライトの位置 GLfloat lightpos[] = ...
  • 円錐の表示と拡大縮小
    円錐を拡大縮小表示します。 glScalef(X軸,Y軸,Z軸) で拡大縮小し、 glutSolidCone(底面の半径,円錐の高さ,円の分割数,高さの分割数) で円錐を表示します。 行列の適用順序を間違えると意図している物とは別の状態になってしまいます。 それは、それぞれが原点 (0,0,0) を基準に適用するからです。 一般的には、拡大縮小してから回転し、最後に平行移動すると意図する状態になるでしょう。 (DirectXの場合) *OpenGLの場合は逆順。   ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #define WIDTH 320 #define HEIGHT 240 ...
  • 法線
    法線ベクトルです。面法線とか頂点法線とかがあります。 法線ベクトルとは、2次元ではある線に垂直なベクトル、3次元ではある面に 垂直なベクトルの事です。 三角ポリゴンは、3つの頂点の並びにより面から垂直に出るベクトルが計算できます。 これが面法線です。 面法線は、光の計算をするときや面の表裏を判定する時に使われます。 今回は三角ポリゴンの面法線を強制的に設定してみました。 するとライトの位置やポリゴンの材質、色や視点など全く変えていないにもかかわらず ポリゴンの色が変化します。 これは固定機能パイプラインが描画で使用する面法線が変化させられているために ポリゴンの向きは全く変わっていないのに別の方向を向いているものとして計算されるからです。   ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENT...
  • 行列:行列の適用
    では、glLoadIdentity(); を glLoadMatrixf(mat); で単位行列を設定するように 置き換えてみます。 チュートリアル 固定機能編 の 球を表示して移動する のプログラムを書き換えてみました。 全く同じに動作しています。 単位行列は GLfloat mat[]={  1,0,0,0,  0,1,0,0,  0,0,1,0,  0,0,0,1 }; という感じで16個の要素を持った変数に格納します。 #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #define WIDTH 320 #define HEIGHT 240 //平行移動用 float x = 0.0f; bool flag = false; ...
  • 行列:平行移動行列
    平行移動行列です。 まず、以下の図を見て下さい。 OpenGL と DirectX では行列の行と列の並びが違います。 ややこしいですね。 しかし、いずれも、13番目の要素がX軸、14番目の要素がY軸、15番目の要素がZ軸の 平行移動成分を表している事に変わりはありません。 glMultMatrixf();を使うと行列を掛け合わせる事ができます。 ではまた、チュートリアル 固定機能編 の 球を表示して移動する のプログラムを 平行移動行列を掛け合わせるように書き換えてみました。 全く同じに動作している事がわかると思います。 #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #define WIDTH 320 #define HEIG...
  • マテリアルの設定
    glEnable(GL_LIGHTING); でライトを有効にしていない時は、glColor4f(赤,緑,青,アルファ); で色を付けていました。 しかし、3Dモデルをそれでやってしまうとのっぺりした、ただの塗りつぶしになってしまいます。 ライトを有効にしている時に、3Dモデルがどのような光の色を反射するか設定するには glMaterialfv(適用する面,光源の種類,反射する色); で材質を設定してあげます。 今回は一定時間でマテリアルを変更するプログラムを作ってみました。   ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #include stdlib.h #define ...
  • 行列:回転行列
    続いて、回転行列です。 以下にOpenGL、DirectX、双方の回転行列を示しますが、前回解説したように 行と列の方向が違うだけで結局は同じ物です。   チュートリアル 固定機能編 の トーラスの表示と回転 を置き換えてみました。 #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #include math.h #define PI 3.1415926 #define WIDTH 320 #define HEIGHT 240 //回転用 float anglex = 0.0f; //オレンジ GLfloat orange[] = { 1.0, 0.6, 0.0, 1.0 }; //ライトの位置 GLfloat lightpos[...
  • ズームイン・アウト
    ズームイン・アウトです。 gluPerspective(視野角,アスペクト比, 描画する範囲(最も近い距離,最も遠い距離)); の 視野角を増減させるとズームインとズームアウトと同じ効果があります。   ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #define WIDTH 320 #define HEIGHT 240 //回転用 float anglex = 0.0f; //オレンジ GLfloat orange[] = { 1.0f, 0.6f, 0.0f, 1.0f }; //赤 GLfloat red[] = { 1.0, 0.0, 0.0, 1.0 }; //ライトの...
  • 固定機能:鏡面反射
    鏡面反射です。 glLightfv(GL_LIGHT0, GL_SPECULAR, SpecularLight); でスペキュラーライトを設定し、 glMaterialfv(GL_FRONT, GL_SPECULAR, specular); でスペキュラーの反射を設定し、 glMaterialf(GL_FRONT,GL_SHININESS,8); でスペキュラーの指数を設定します。 シェーダーで言うと頂点シェーダーで処理したような品質になります。   ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #define WIDTH 320 #define HEIGHT 240 //回転用...
  • 画像の一部をストレッチ描画する(LodePNG)
    PNG画像を読み込んで画像の一部をストレッチ描画します。http //members.gamedev.net/lode/projects/LodePNG/に、ある LodePNGモジュールを使用します。 このLodePNGは.cppファイルと.hファイルのみで構成されているので手軽に組み込めます。 zlib も libpng も何も使わずに.cppソースのみでPNG画像が読み込めます。 また、LodePNGは、どのように使ってもよいそうです。再配布も可能です。 作者への連絡も必要ないそうです。素晴らしいですね。 使い方も簡単で LodePNG_loadFile で読み込んで LodePNG_decode で、デコード します。 画像の一部を断片的に描画するようにするにはST座標(DirectXではUV座標)を指定して あげれば良いです。 『画像を表示する』のチュートリアルでは、glTexC...
  • 行列:拡大縮小行列
    拡大縮小行列です。 OpenGL、DirectX 共に行と列の方向が変わっても同じです。 チュートリアル 固定機能編 の 円錐の表示と拡大縮小 のプログラムを置き換えました。 #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #include math.h #define PI 3.1415926 #define WIDTH 320 #define HEIGHT 240 //拡大縮小用 float size = 1.0f; bool flag = false; //水色 GLfloat aqua[] = { 0.0, 1.0, 1.0, 1.0 }; //ライトの位置 GLfloat lightpos[] = { 200.0, ...
  • 隠面消去
    隠面消去です。 デプスバッファ(DirectXではZバッファ)と呼ばれるもので視点からの奥行き情報 を持っているものです。 今回は、これをON/OFFするプログラムを作りました。 最初に黄色のポリゴンが描画されて次に紫のポリゴンが描画されます。 デプスバッファが有効な時は後から描画された紫のポリゴンがきちんと隠れています。 デプスバッファが無効な時は描画の順番通りに描画されます。 右の画像は紫のポリゴンが奥にあるにもかかわらず手前の黄色のポリゴンを覆っています。   ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #define WIDTH 320 #define HEIGHT 24...
  • 3D:球と球
    バウンディングスフィアです。 3Dの当たり判定では最も計算コストが少なく、簡単に実装できるため 多用されます。 仕組みですが、まず、球の中心位置と球の半径を設定します。 そして、球と球の中心間の距離が互いの半径の合計値以下であれば 接触していると判断できます。 #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #include stdio.h #include math.h #define WIDTH 320 #define HEIGHT 240 //平行移動用 float x = 0.0f; bool flag = false; //3つのベクトル struct Vector3f{  float x;  float y; ...
  • .MQOを読み込んで表示する(GLMetaseq)
    メタセコイアのモデルデータ .mqo を読み込んで表示してみます。 言わずもがなOpenGLはただのグラフィックライブラリ、モデルデータの読み込みなども 全て自分でコードを書かなくてはなりません。 DirectXの .x 形式や .sdkmesh 形式のようなものと読み込みライブラリがあらかじめ 用意されていると楽ですが、そんなものはありません。 ただ、工学ナビ さんのサイトでmqoの読み込みライブラリ GLMetaseq がありますので 手始めに使ってみましょう。http //kougaku-navi.net/ARToolKit/index.html↑のページから GLMetaseq をダウンロードして、ヘッダファイルとソースファイルを プロジェクトに追加します。 GLMetaseq では glut を使用しているので GLMetaseq.h の227行目の#include をコメントア...
  • 円柱を表示してみる
    円柱を描画します。 GLUTには、そのような機能はありませんので自作します。 円柱と言っても、上の面の円(正多角形)と側面の長方形と 下の面の円(正多角形)の組み合わせに過ぎません。 上面は上方向に、側面部分は中心から面の方向に、下面は下方向に 法線を設定してあげます。   ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #include math.h #define WIDTH 320 #define HEIGHT 240 //回転用 float anglex = 0.0f; //青 GLfloat Blue[] = { 0.0, 0.0, 1.0, 1.0 }; //ライト...
  • PNG画像の一部をストレッチ描画する(LodePNG)
    PNG画像を読み込んで画像の一部をストレッチ描画します。http //members.gamedev.net/lode/projects/LodePNG/に、ある LodePNGモジュールを使用します。 *(現在の最新版では引数などが変わっているようですので設定の仕方のページから 当サイトで使用しているバージョンをインストールして下さい。) このLodePNGは.cppファイルと.hファイルのみで構成されているので手軽に組み込めます。 zlib も libpng も何も使わずに.cppソースのみでPNG画像が読み込めます。 また、LodePNGは、どのように使ってもよいそうです。再配布も可能です。 作者への連絡も必要ないそうです。素晴らしいですね。 使い方も簡単で LodePNG_loadFile で読み込んで LodePNG_decode で、デコード します。 画像の一部を断片的に描画...
  • 行列:行列の合成
    行列の合成です。 glMultMatrixf(); がしている事です。 これは単純に行列の積を行っているだけです。 行列 平行移動行列 のプログラムの glMultMatrixf(); を使わずに glLoadMatrixf(); で設定するように変えてみましょう。 全く同じ結果になる事がわかると思います。 ただし、行列は掛け合わせる順番が変わると全く違う物になります。 何やら回りくどい事をしているように感じるかもしれませんが、 それは今回のプログラムでは合成回数が1回だからです。 『スキンメッシュアニメーション』等、行列の合成を何回も何回も しなければならない場合に効率を上げるには glMultMatrixf(); を 使わずに手動で行列の合成をしなければなりません。 #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRT...
  • ステンシルテスト
    ステンシルテストです。 ステンシルバッファの値を調べて描画するかしないかを決める事ができます。 画面の切り抜きができるようになります。   ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #define WIDTH 320 #define HEIGHT 240 //平行移動用 float x = 0.0f; bool flag = false; //緑 GLfloat green[] = { 0.0, 1.0, 0.0, 1.0 }; //ライトの位置 GLfloat lightpos[] = { 200.0, 150.0, -500.0, 1.0 }; void SquareF...
  • 固定機能:スポットライト
    スポットライトです。 放射の様子がわかるように回転させています。 固定機能ではポリゴン数を多くして細分化しないと効果がわかり辛いです。 フラグメントシェーダーだとピクセル単位で処理してくれるので少ないポリゴンでも 非常に綺麗な結果が得られます。   ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #define WIDTH 320 #define HEIGHT 240 //回転用 float anglex = 0.0f; //オレンジ GLfloat orange[] = { 1.0f, 0.6f, 0.0f, 1.0f }; //ライトの位置 GLfloat lightpos[]...
  • gluPerspectiveを置き換える
    gluPerspectiveを置き換えてみます。 gluPerspective(fovy, aspect, near, far) の作り出す行列は となっています。 そして と定義されます。 cotangent(余接、コタンジェント)は math.h にありませんので 自作します。 #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #include math.h #define PI 3.1415926 #define WIDTH 320 #define HEIGHT 240 //平行移動用 float x = 0.0f; bool flag = false; //緑 GLfloat green[] = { 0.0, 1.0,...
  • 直方体を表示してみる
    直方体を描画します。 少し冗長なコードになりましたがこの方が解りやすいと思います。   ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #define WIDTH 320 #define HEIGHT 240 //回転用 float angle = 0.0f; //ピンク GLfloat Pink[] = { 1.0, 0.5, 0.5, 1.0 }; //ライトの位置 GLfloat lightpos[] = { 200.0, 500.0, 0.0, 1.0 }; //直方体 void cuboid(float width,float height,float depth) {...
  • 行列(マトリックス)とは
    ここで行列(マトリックス)の解説をします。 ここで言う行列というのはお店の前に人がいっぱい並んでいる事ではありません。 数学で使う行列の事です。 行列(マトリックス)とは数字を行と列に並べて括弧でくくったものです。 3×3行列は 4×2行列は 2×5行列は のような感じです。ちなみに数字は適当です。 あくまでも、こういう物だという事だけ解ればなんとかなります。 3×3行列は3つの行と3つの列、4×2行列は4つの行と2つの列といった感じです。 行と列に分かれているイメージです。 そして、DirectX や OpenGL のような 3Dの座標変換には 4×4行列を用います。 今まで使用してきた glLoadIdentity(); や glTranslatef(x,y,z); や glRotatef(angle,x,y,z); とか glScalef(x,y,z); 等も実は内部で行列を使...
  • 異方性フィルタリング
    異方性フィルタリングです。 ミップマップで線形補間を適用するとミップマップの境目から先はフィルタリングにより、 ぼやけてしまいました。 拡張機能の異方性フィルタリングを使うとミップマップの境目を目立たなくする事が できます。 今回のプログラムはスペースキーでON/OFFを切り替えます。   ファイル main.cpp lodepng.cpp lodepng.h maptip.png main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #pragma comment(lib, glew32.lib ) #include GL/glew.h #include GL/freeglut/freeglut.h #include stdio.h #include strin...
  • ミップマップ
    ミップマップです。 ミップマップは、あらかじめ元のサイズのテクスチャを縮小したものを用意しておき、 小さく表示される時は小さいテクスチャを使用します。 今回のプログラムはスペースキーを押す度にフィルタが切り替わります。   ファイル main.cpp lodepng.cpp lodepng.h maptip.png main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #include stdio.h #include string #include lodepng.h using namespace std; #define WIDTH 640 #define HEIGHT 480 bool f...
  • 視点の回転(クォータニオン)
    視点を回転させます。 回転方法にはいろいろとあります。 ロールピッチヨー、オイラー角、クォータニオンなどです。 ロールピッチヨーはZ軸、Y軸、X軸を順番に回転させて目的の角度にする方法です。 飛行機の姿勢を表す時によく使われます。最も解り易く素直な方法です。 オイラー角はZ軸、X軸(またはY軸)、Z軸と回転させて目的の角度にする方法です。 3つの軸を使わなくても2つの軸があれば目的の角度にたどり着きます。 しかし、ロールピッチヨーとオイラー角には欠点があります。ジンバルロックと呼ばれるものです。 たとえば、X軸を90度傾けると、Y軸とZ軸が同軸となってしまい、その姿勢を保存して また新たに回転をしようとしたときに問題がおきます。 X軸とY軸をそれぞれ90度傾けると全ての軸が同軸となり一つの方向にしか回せなくなります。 それを解消する方法がクォータニオンです。 クォータニオンは軸を任意に作成...
  • VBO
    VBOです。 頂点配列はPC本体のRAM(メモリ)にデータを置いておいて、 描画する時にビデオカードにデータを転送し、それを使って描画していました。 データの少ない物を描画する分には問題ありませんがポリゴン数の多いモデルを 大量に描画したりする時に一々毎回データを転送していてはかなりの無駄が 生じています。 そこで描画を高速化する為にビデオカードのRAMに予めデータを置いておき PC本体から毎回データを転送しなくても良いようにするのがVBOです。 今回のプログラムは頂点配列の解説で使ったプログラムをVBOにしています。   ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #pragma comment(lib, glew32.lib ) #inclu...
  • gluLookAtを置き換える
     gluLookAt を置き換えてみます。 #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #include math.h #define PI 3.1415926 #define WIDTH 320 #define HEIGHT 240 //平行移動用 float x = 0.0f; bool flag = false; //緑 GLfloat green[] = { 0.0, 1.0, 0.0, 1.0 }; //ライトの位置 GLfloat lightpos[] = { 200.0, 150.0, -500.0, 1.0 }; //単位行列 GLfloat mat[]={  1,0,0,0,  0,1,0,0,  0,0,...
  • 固定機能:テクスチャマッピング
    テクスチャマッピングと言っても、『画像を表示する』のチュートリアルで既にやっています。 ただ、今回は、より踏み込んでテクスチャのST座標を回転してみます。 それには、テクスチャマトリックスを使用します。 マトリックスと言えば、glMatrixMode(GL_PROJECTION); とか、glMatrixMode(GL_MODELVIEW); が、あるように glMatrixMode(GL_TEXTURE); というテクスチャ用のマトリックスモードがあります。 このテクスチャ空間も,物体の空間 (x, y, z, w) と同じように4次元 (s, t, r, q)で用意されていて、 移動、回転、拡大縮小などの行列を適用できます。   ファイル main.cpp sample.png main.cpp #pragma comment(linker, /SUBSYSTEM WIN...
  • @wiki全体から「同次座標系」で調べる

更新順にページ一覧表示 | 作成順にページ一覧表示 | ページ名順にページ一覧表示 | wiki内検索