フォン鏡面反射

OpenGLプログラミングメモ内検索 / 「フォン鏡面反射」で検索した結果

検索 :
  • 固定機能:鏡面反射
    鏡面反射です。 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 //回転用...
  • 鏡面反射
    プラスチックや金属など、よく磨きこまれた反射率の高い物体に光が当たると 表面が光り輝いているように見えます。 そのハイライトを表現するのが鏡面反射です。   vertex.shader //フラグメントシェーダーに渡す変数 varying vec3 P;//位置ベクトル varying vec3 N;//法線ベクトル void main(void) {   P = vec3(gl_ModelViewMatrix * gl_Vertex);   N = normalize(gl_NormalMatrix * gl_Normal);   gl_Position = ftransform(); } flagment.shader //頂点シェーダーから受け取る変数 varying vec3 P;//位置ベクトル varying vec3 N;//法線ベクトル void main(void)...
  • メニュー
    ...拡散照明 拡散照明 フォン鏡面反射 鏡面反射 クック・トランス金属反射 金属反射 カラーシフト 簡易シャドウイング 距離減衰 スポットライト フォグ GLSL テクスチャマッピング GLSL マルチテクスチャ 床面反射 オフスクリーンレンダリング 環境マッピング 投影マッピング シャドウマッピング ソフトシャドウ 水面 バンプマッピング 視差マッピング ディスプレースメントマップ 輪郭線抽出(IDマップ) 輪郭線抽出(深度マップ) 輪郭線抽出(法線マップ) セルシェーディング SSAO ハードウェアスキニング ▲▲▲▲▲ ▼ シェーダー 画像フィルタ偏 色の反転 ぼかしフィルタ ガウスフィルタ モザイク モノトーン セピア調 残像 モーションブラー 輪郭抽出 フォーカスフィルタ ▲▲▲▲▲ ▼ 3Dライブラリ編 Irrlicht編 Irrlichtのイ...
  • 床面反射
    床面反射です。 床面を半透明で描画し、オブジェクトを床面を境にして 反対側にも描画する事で疑似的に映り込みを表現しています。 brick.png marble.png  vertex.shader varying vec3 P; varying vec3 N; void main(void) {   P = vec3(gl_ModelViewMatrix * gl_Vertex);   N = normalize(gl_NormalMatrix * gl_Normal).xyz;   gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;   gl_Position = ftransform(); } flagment.shader varying vec3 P; varying vec3 N; uniform sam...
  • フォント選択ダイアログ
     フォント選択ダイアログです。 resource.h  #define IDR_MENU1  100  #define ID_EXIT   101  #define ID_FONT   102  #define ID_A   103  #define ID_B   104  #define ID_Menu   105  #define ID_Whats  106  #define ID_Help   107  #define ID_STATUS  108 menu.rc #include resource.h   IDR_MENU1 MENU  BEGIN      POPUP File      BEGIN          MENUITEM Exit ,    ID_EXIT      END      POPUP Font      BEGIN          M...
  • フォグ
    フォグです。 vertex.shader  //フラグメントシェーダーに渡す変数  varying vec3 P;//位置ベクトル  varying vec3 N;//法線ベクトル   void main(void)  {    P = vec3(gl_ModelViewMatrix * gl_Vertex);    N = normalize(gl_NormalMatrix * gl_Normal);    gl_FogFragCoord = abs(P.z);//フォグ座標    gl_Position = ftransform();  } flagment.shader  //頂点シェーダーから受け取る変数  varying vec3 P;//位置ベクトル  varying vec3 N;//法線ベクトル  uniform int fogMode;   void main(void...
  • C++/CLI:フォントダイアログ
    基本プロジェクトにフォントダイアログを配置します。 ボタンを追加し、TEXT を「フォント」にします。 ラベルを追加し、TEXT を「サンプルテキスト」にします。 ボタンをダブルクリックして以下のコードを追加します。      fontDialog1- ShowDialog();      label1- Font = fontDialog1- Font; ビルドして実行してみましょう。 MyForm.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include MyForm.h using namespace Project1; [STAThreadAttribute] int main(){  MyForm ^form1 = gcnew MyForm;  form1...
  • 環境光
    現実世界では、太陽や照明からの光が様々な物体に反射して光が直接当たらない場所でも 間接的に反射してきた光によってある一定の明るさになっています。 この空間に溢れる光を環境光といいます。 CGでこれを再現するにはラジオシティやグローバルイルミネーションなどがありますが、 計算コストが非常に高く、ゲームなどのリアルタイムな画面更新が求められるプログラムでは とても使う事はできません。 そこで、一般的には割とそれらしく見せるためにシーン全体に影響する一定の色を環境光として 使います。 vec4 ambient = gl_FrontLightProduct[0].ambient; で、OpenGLからアンビエント情報を受け取ります。 これを紐解いていくと、 glLightfv(GL_LIGHT0, GL_AMBIENT, Light); で設定したライトの光の範囲内で glMaterialfv(G...
  • 簡易シャドウイング
    平面上に影のように見えるオブジェクトを描画します。 vertex.shader  //フラグメントシェーダーに渡す変数  varying vec3 P;//位置ベクトル  varying vec3 N;//法線ベクトル   void main(void)  {    P = vec3(gl_ModelViewMatrix * gl_Vertex);    N = normalize(gl_NormalMatrix * gl_Normal);    gl_Position = ftransform();  } flagment.shader  //頂点シェーダーから受け取る変数  varying vec3 P;//位置ベクトル  varying vec3 N;//法線ベクトル   void main(void)  {    vec3 L = normalize(gl_LightSource...
  • 距離減衰
    距離による光の減衰です。 vertex.shader  //フラグメントシェーダーに渡す変数  varying vec3 P;//位置ベクトル  varying vec3 N;//法線ベクトル   void main(void)  {    P = vec3(gl_ModelViewMatrix * gl_Vertex);    N = normalize(gl_NormalMatrix * gl_Normal);    gl_Position = ftransform();  } flagment.shader  //頂点シェーダーから受け取る変数  varying vec3 P;//位置ベクトル  varying vec3 N;//法線ベクトル   void main(void)  {  vec3 L = gl_LightSource[0].position.xyz - P;  f...
  • スポットライト
    スポットライトです。 vertex.shader //フラグメントシェーダーに渡す変数  varying vec3 P;//位置ベクトル  varying vec3 N;//法線ベクトル   void main(void)  {    P = vec3(gl_ModelViewMatrix * gl_Vertex);    N = normalize(gl_NormalMatrix * gl_Normal);    gl_Position = ftransform();  } flagment.shader  //頂点シェーダーから受け取る変数  varying vec3 P;//位置ベクトル  varying vec3 N;//法線ベクトル  int numLight = 2;   void main(void)  {  gl_FragColor = vec4(0.0);  floa...
  • .FBXを読み込んでみる3(表示編)
    前回のプログラムはテクスチャ無しで3角ポリゴンの FBX ファイルしか 読み込めませんでした。 今回のプログラムは3角と4角の両方のポリゴンに対応しています。 テクスチャはレイヤー0しか対応していませんが通常の使用には問題ないと 思います。   PNG.h #pragma once #include lodepng.h //テクスチャクラス class TEXTURE{ protected  LodePNG_Decoder decoder;//デコーダ  unsigned char* buffer;//バッファ  size_t buffersize, imagesize;//サイズ public  TEXTURE();  TEXTURE(const char* FileName);//コンストラクタ  void LOAD_PNG(const char* FileName);//P...
  • .FBXを読み込んでみる2(読み込み編)
    それでは実際に FBXSDK を使用してデータを取り出してみようと思います。 まず、fbx20113_fbxsdk_win をインストールして Visual studio にパスを通します。 そして プロジェクトのフォルダに fbxsdk_20113.dll と fbxsdk_20113d.dll を置きます。 使い方は KFbxSdkManager を作成して、 KFbxImporter を作成して、 KFbxImporter にファイルを読み込んで初期化します。 そして、 KFbxScene を作成して、 KFbxScene に KFbxImporter で インポートします。 そして、 KFbxNode を辿って KFbxMesh を探します。 KFbxMesh が見つかったら、そこから各種情報を取り出します。 今回は三角ポリゴンのみでテクスチャ無し、オブジェクト(レイヤー)が一つだ...
  • ODE:箱の自由落下と地面との衝突判定
    箱が上から落ちてきて、地面でバウンドします。 値を設定するだけで、後は勝手にシミュレーションしてくれます。 ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #pragma comment(lib, ode_doubled.lib ) #include GL/freeglut/freeglut.h #include ode/ode.h #include vector using namespace std; #define WIDTH 320 #define HEIGHT 240 #define ODE_MAX_CONTACTS 1024 //ライトの位置 GLfloat lightpos[] = { 2.0, 4.0, 1.0, 0.0 }...
  • GLSL:テクスチャマッピング
    GLSLでテクスチャを描画します。 vertex.shader   //フラグメントシェーダーに渡す変数   varying vec3 P;//位置ベクトル   varying vec3 N;//法線ベクトル    void main(void)   {     P = vec3(gl_ModelViewMatrix * gl_Vertex);     N = normalize(gl_NormalMatrix * gl_Normal).xyz;     gl_TexCoord[0] = gl_MultiTexCoord0;     gl_Position = ftransform();   } flagment.shader   //頂点シェーダーから受け取る変数   varying vec3 P;//位置ベクトル   varying vec3 N;//法線ベクトル   uniform...
  • WindowsメディアプレイヤーのMIDI音源を変えてみる
    Windowsを使っている方は大抵、Microsoft GS Wavetable Synthという音源が 標準で設定されているかと思います。 しかし、この音源はあまり良い音では無いので別の音源に変えてみましょう。 MIDIドライバ のVirtualMIDISynthというソフトを使うとMIDI音源を変える事ができます。 VirtualMIDISynth http //coolsoft.altervista.org/en/virtualmidisynth こちらのサイトでVirtualMIDISynthをダウンロードしてインストールします。   サウンドフォントのリンク集↓ SGM-V2.01 https //archive.org/details/SGM-V2.01 Omega GMGS 2 https //archive.org/details/OmegaGMGS2 GeneralUs...
  • 文字列描画
    文字列を描画します。 文字列となるとDirectXでもOpenGLでも普通の方法は用意されていません。 GDIを使うと途端に遅くなるからです。 多くの場合、高速化のために自前の画像ファイルで文字を用意したりしていますが、 英数字ならまだしも日本語となると色々と問題がでてきます。 そこで wglUseFontBitmapsW という、文字をビットマップのディスプレイリスト で作ってくれる関数があるので、それを使います。 ここでいきなりクラスが登場していますが、初心者向けに解り易くしたつもりです。 とても便利なので使い方を覚えておきましょう。 ちなみに解放とかは省略、関数が成功したかどうかは if で調べていません。   ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStar...
  • タイマーイベント
    タイマーイベントです。 コールバック関数として登録した後、関数自身が次のタイマーイベントを 設定する事で持続的にイベントが発生します。 条件判断文でイベントを終了させたり次のタイマーイベントの発生間隔を 変えたりできます。 ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #include stdio.h #define WIDTH 320 #define HEIGHT 240 int time=0; wchar_t buf[255]; class GLFONT { public  HFONT Hfont;  HDC Hdc;  GLFONT(wchar_t *fontna...
  • .midを再生する(mciコマンド)
    mciコマンドを使用して midi を再生します。 他にも様々な音声ファイルや動画なども再生できますが、 今回は midi だけです。 ファイル main.cpp sample.mid (自分で用意して下さい) main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #pragma comment(lib, winmm.lib ) #include windows.h #include mmsystem.h #include GL/freeglut/freeglut.h #include stdio.h #define WIDTH 320 #define HEIGHT 240 MCI_OPEN_PARMS mop; class GLFONT { public  HFON...
  • C++/CLI:ラベル
    基本プロジェクトのフォームデザイナ画面の Label をクリックして フォームの適当な場所でクリックします。 するとラベルが作成されます。     そのラベルのプロパティの Font を選択します。 するとフォントダイアログが出てくるのでフォントサイズを24辺りにします。     プロパティの Text をクリックして ラベルでーす。に変えます。     ビルドして実行してみましょう。 簡単にスタティックテキストが表示できましたね。 もちろん、プログラムで動的にテキストを変更する事も可能です。 今回のプログラムコードは以下の通りです。   MyForm.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include MyForm.h using namespace Project1...
  • .wavを再生する(win32API)
    Win32API の PlaySound を使用して .wav を再生します。 glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE,GLUT_ACTION_GLUTMAINLOOP_RETURNS); を 指定すると freeglut の場合、 glutMainLoop(); から戻ってくる事が可能です。 いつも解放はOSまかせにしている管理人ですが、今回は解放コードも記述しました。 ファイル main.cpp sample.wav (自分で用意して下さい) main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #pragma comment(lib, winmm.lib ) #include windows.h #include mmsystem...
  • .wavを再生する(DirectMusic)
    DirectInput の時と同じようにウインドウハンドルさえ取得できれば DirectMusic を freeglut と組み合わせて使用できます。 DirectMusic は現在は更新されておらず廃止予定?だそうです。 Windows7 では 32bit 版では DirectMusic を使用できますが 64bit 版にはありません。(XPモードなら使用できる?) いずれにしても、DirectMusic を使い続ける事は推奨できません。 今回のプログラムは DirectX SDK August2007 の参照設定を 使用しています。 *(2014.3.28追記) Windows8においてもWindows7同様の状態です。 尚、Visual Studio 2010からはディレクトリの参照設定を プロジェクト毎に個別に設定しないといけないようになってしまいました。 面倒くさいですね。(^ω...
  • .midを再生する(DirectMusic)
    DirectMusic の場合、.wav の再生と特に何の変更もなく .mid が再生できます。 ファイル名を変えるだけです。 Segment- SetParam( GUID_StandardMIDIFile, 0xFFFFFFFF, 0, 0, NULL ); を追加していますが、特に追加せずとも普通に再生してくれます。 *(2014.3.28追記) 尚、Visual Studio 2010からはディレクトリの参照設定を プロジェクト毎に個別に設定しないといけないようになってしまいました。 面倒くさいですね。(^ω^;) プロジェクトのプロパティで「C/C++」の「追加のインクルードディレクトリ」に $(DXSDK_DIR)Include を追加するとビルドが通るようです。 ファイル main.cpp sample.mid (自分で用意して下さい) main.cpp #pragma...
  • マウスイベント
    マウスイベントです。 glut ではマウスホイールは対応していませんでしたが freeglut ではマウスホイールのスクロールを検出できます。   ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #include stdlib.h #include string using namespace std; wstring wstr=L ; wchar_t buf[255]; #define WIDTH 400 #define HEIGHT 320 int MouseX,MouseY; bool M_left=false; bool M_right=false; bool ...
  • リッチテキストエディットコントロールを表示する
    リッチテキストエディットです。 頑張ればWordもどきも作れるかも知れませんね。 resource.h #define IDR_MENU1  100 #define IDM_END 101 #define IDM_FONT 102 #define ID_STATUS  108 menu.rc #include resource.h IDR_MENU1 MENU DISCARDABLE BEGIN     POPUP ファイル     BEGIN         MENUITEM 終了 ,                    IDM_END     END     POPUP 編集     BEGIN         MENUITEM フォントの変更 ,          IDM_FONT     END END main.cpp #pragma comment(l...
  • 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; ...
  • 3D:AABBとAABB
    バウンディングボックス AABBです。 これは2Dの矩形を3Dにそのまま拡張した物です。 AABBは回転すると使えません。     #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; float y = 0.0f; bool flag = false; bool flag2 = false; //ライトの位置 GLfloat lightpos[] = { 200.0, 300.0, -500.0, 1.0 }; //3つのベクトル struct ...
  • fluidsynthの.libをVisual Studioでコンパイルする
    FluidSynth https //www.fluidsynth.org/ こちらに FluidSynth という、サウンドフォント シンセサイザーがあるので使わせて頂こうと思います。 2023年9月18日現在、最新版の FluidSynth 2.3.2 をダウンロードします。 Recent News の Released FluidSynth 2.3.2 をクリックしてページを移り、 https //github.com/FluidSynth/fluidsynth/releases/tag/v2.3.2 となっている所を クリックします。 64bitは fluidsynth-2.3.2-win10-x64.zip 32bitは fluidsynth-2.3.2-winXP-x86.zip を、ダウンロードして解凍し、Cドライブ C \ に移動させます。 FluidSynth ht...
  • C++/CLI:リッチテキストボックス
    基本プロジェクトにリッチテキストボックスを配置します。 適当にサイズを大きくします。 プロパティの Font の Size を「24」にします。 ビルドして実行してみましょう。 フォントダイアログとかカラーダイアログと併用すれば それなりの事ができます。 MyForm.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include MyForm.h using namespace Project1; [STAThreadAttribute] int main(){  MyForm ^form1 = gcnew MyForm;  form1- ShowDialog();  return 0; } MyForm.h #pragma once namespace Proje...
  • C++/CLI:アップダウンコントロール
    基本プロジェクトにアップダウンコントロールを配置します。 NumericUpDown という名前です。 フォントのサイズを16にして Bold を True にします。 ビルドして実行してみましょう。 MyForm.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include MyForm.h using namespace Project1; [STAThreadAttribute] int main(){  MyForm ^form1 = gcnew MyForm;  form1- ShowDialog();  return 0; } MyForm.h #pragma once namespace Project1 {  using namespace System;...
  • PC用語の独自調査
    X86(32bit),X64(64bit) x86(32ビットプロセッサー)は最大物理メモリが4GBと限られているのに対し、x64(64ビットプロセッサー)は 8GB、16GB、中には32GBの物理メモリを扱えるものもあります。 また、64ビットコンピューターは、32ビットプログラムと64ビットプログラムの両方を使用することができます。 インテルの初の32ビットCPUは 80386 で、その後継が 80486 ですが、後ろの数字『86』を残し前の数字を省略して 『x86』と呼ぶようになりました。 80486 の後継は Pentium で、Pentium から名称に数字の86が使われなくなりましたが、それからも32ビットCPUは 『x86』と呼びます。 8bit→2^8=256Byteのメモリが管理できる 16bit→2^16≒64KBのメモリが管理できる ...
  • 光とは
    光とは、何なのでしょう? ニュートンは光が周波数的な性質があることを知っていたけれども、 光が作る影の周辺が非常にシャープではっきりしていることから 「光は粒子だ!」と考えていました。 グリマルディは、光の「回折」現象を発見、波の動きと似ていることを知りました。 光が粒子だとすると、光が障害物の後ろにも伝わる現象(回折)や、 光が重なると強めあったり弱めあったりする現象(干渉)のしくみを うまく説明できなかったのです。 そこで、ホイヘンスが「光の波動説」を提唱しました。 その後、フレネルとヤングが光は波動であるという事を数学的に証明し出し、 (干渉、反射、屈折)光の波動説が有利になりました。 マクスウェルは電磁波理論を完成させて光は、そうした電磁波の一種である事を 証明しました。 19世紀末には光の現象は波動説でうまく説明できるようになっていました。 アインシュタインは、しかしながら、やは...
  • ボーンデフォーム
    表示メニューの正射影を選択して正射影(Ortho)にします。 表示メニューの正面を選択して真正面から見た図にします。 ポリゴンツールを押してモデルの全体を確認します。 ジョイントツールを押します。 この状態でモデルビュー上を左クリックするとジョイントが作成できます。 デフォルトではジョイントの表示が小さいので大きくします。 ファイル   シーン設定を選択します。 表示半径のジョイントを8にしてOKボタンを押します。 最初のジョイントをモデル下部に作成し、次のジョイントをモデル中心より 少し下に作成します。 すると一つ目のボーンが出来上がりました。 続けて、モデル上部より少し下にジョイントを作成し、完成です。 完成したら選択ツールを押してジョイントツールを終了します。 オブジェクトパネルのobj1とJoint1をShiftキーを押しながら選択します。 オブジェクトメニューのスムーズスキ...
  • C++/CLI:トラックバー
    基本プロジェクトにトラックバーを配置します。 ラベルも配置します。 ラベルのプロパティのフォントサイズを24にします。 トラックバーをダブルクリックして自動作成されたコードに 以下のコードを追加します。 label1- Text=trackBar1- Value.ToString(); ビルドして実行してみましょう。  MyForm.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include MyForm.h using namespace Project1; [STAThreadAttribute] int main(){  MyForm ^form1 = gcnew MyForm;  form1- ShowDialog();  return 0; } MyFor...
  • C++/CLI:リストボックス
    基本プロジェクトにリストボックスを配置します。 選択項目表示用にラベルも配置します。 ラベルはフォントサイズを24にしておきます。 リストボックスを選択し、プロパティの Items の(コレクション)をクリックします。 すると、文字列コレクションエディターが表示されるので、今回は適当に りす すいか からす すずめ めだか と、入力します。 リストボックスをダブルクリックするとコードが自動作成されるので、 そこに、次のコードを追加します。 label1- Text = listBox1- SelectedItem- ToString(); ビルドして実行してみましょう。 選択した項目がラベルに表示されます。 MyForm.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #inc...
  • 再びキーフレーム
    長らく道を逸れましたが、ここで再びキーフレームに戻ります。 .Xのアニメーションキーのキータイプ情報 0…回転  w,x,y,zの順にクォータニオンデータ 1…拡大縮小 x,y,zの順に拡大縮小データ 2…平行移動 x,y,zの順に平行移動データ 4…合成行列 回転、拡大縮小、平行移動行列が掛け合わされた4×4行列データ まず、最初に知っておかなくてはならない事があります。 それは、当サイトで使用している Cyberdelia は、合成行列タイプの アニメーションデータは階層構造が正しく生成できないという事です。 詳しくは Cyberdelia に付属のヘルプを参照して下さい。 とは言っても、合成行列でないタイプの方は正しく出力されますので、 それを元に合成行列を作成し、単純なキーフレームアニメーションを表示して みたいと思います。 とりあえず、平行移動行列だけに対応したプログラムを作成...
  • C++/CLI:フォルダダイアログ
    基本プロジェクトにフォルダーブラウザダイアログを追加します。 フォルダーブラウザダイアログ起動用にボタンを配置します。 ボタンの TEXT を「フォルダを参照」にします。 ボタンをダブルクリックして以下のコードを追加します。      folderBrowserDialog1- ShowDialog();      //取得したフォルダ名      String^ FileName = folderBrowserDialog1- SelectedPath; ビルドして実行してみましょう。 MyForm.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include MyForm.h using namespace Project1; [STAThreadAttribute] ...
  • 線形補間
    さて、前回の「再びキーフレーム」では箱が瞬間移動してしまって いました。 補間がされていないためです。 DirectX SDK 付属のビューワーでは滑らかにアニメーションが 補間されています。 今回はキーフレームとキーフレームの間を線形補間してみようと思います。 ベクトルAとベクトルB間の補間は、求める値をIとすると、 で求める事ができます。 ここでのtは現在のキー位置のパラメーターです。 尚、 0 ≦t≦ 1 で、tが0の時はAと同じ値、tが1の時はBと同じ値に なります。 前回と同じくsample2.xを表示しています。 font.h #pragma once class GLFONT { public  HFONT Hfont;  HDC Hdc;  GLFONT(wchar_t *fontname, int size);  void DrawStringW(int x,in...
  • .Xの階層メッシュアニメーションを読み込んでみる3
    平行移動と同じようにして拡大縮小も線形補間してみました。 新規に作成した sample3.x を表示しています。   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: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,       ...
  • .MQOを自力で読み込んでみる1(解析編)
    前回はGLMetaseqを使わせて頂きましたが、今回からは .MQO を自力で 読み込んでみたいと思います。 ただ使っているだけでは理解した事にはならないので実際に解析してみましょう。 まず、どのようなデータがあり、どのデータが必要となるのか、そこから探っていきたいと 思います。 では、メタセコイアを起動して何もせずにいきなり名前を付けて保存したデータを見て みます。 1.MQO Metasequoia Document Format Text Ver 1.0 Scene {  pos 0.0000 0.0000 1500.0000  lookat 0.0000 0.0000 0.0000  head -0.5236  pich 0.5236  ortho 0  zoom2 5.0000  amb 0.250 0.250 0.250 } Object obj1 {  depth 0 ...
  • .Xの階層メッシュアニメーションを読み込んでみる4
    .xの階層アニメーションを読み込んで再生するプログラムが完成したので公開します。 クォータニオンの符号の判定には皆さん、苦労されたのではないでしょうか。 ネットで広く公開されているサンプルはほとんどがDirectX用で いちいち転置しなければならなかったり。 左手座標用に作成したアニメーションXファイルはクォータニオンのY軸とZ軸を-1倍しないと OpenGLではおかしな表示になるとか。 回転角度が181度とマイナス179度ではクォータニオンの符号が反転してるけど 同じ回転行列になるとか。 いやはや、手間取りました。 最後に親階層から子階層へ脈々と行列を受け継いで完成です。 『固定機能 階層メッシュアニメーション編』の『階層構造』で作成した sample4.xを表示しています。 尚、Cyberdelia で作成したアニメーションXファイルだけに対応しています。    font.h #pr...
  • マテリアルの設定
    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 ...
  • 拡散照明
    環境光だけではのっぺりとした図にしかなりません。 立体的に見せるには陰影を付けてやらなければなりません。 拡散反射光は光源から入ってくる光を全ての方向に均一に反射します。 紙のようにざらざらとした光沢の少ないものの表現に適しています。 反射する光の量は、入射する光の量に応じて変化し、入射する光の量は 光のあたる場所によって異なるので、物体の形に陰が付きます。 左の画像は頂点シェーダーのみで陰影を付けたものですが、ハイライトの部分に何やら 線のようなものが見えます。これは頂点単位で色の補間が行われているためです。 右の画像は頂点シェーダーで位置ベクトルと法線ベクトルを計算しておき、フラグメントシェーダーに 渡してフラグメントシェーダーで光の計算をしています。 こうするとピクセル単位で色の計算(補間)が行われるので非常に綺麗な結果が得られます。 フラグメントシェーダーに渡す変数は varyin...
  • 階層ボーンアニメーション
    今回はボーンだけを階層アニメーションさせてみます。 今回も新しく box.x というファイルを作成しています。 スタティックメッシュをボーンが突き抜けていて若干、間抜けな図ですが 順番としてはこれで合っています。 次回からは、このスタティックメッシュを変形させる仕組みを考察してみます。 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(        ...
  • .Xのスキンメッシュアニメーションを読み込んでみる2
    .x のスキンメッシュアニメーションを読み込んで表示します。 このプログラムは box.x 専用です。 わかりやすくするために敢えて、このようにしました。      これで完成ではありません。 法線を再設定してあげないと光の反射具合が変になってしまいます。 詳しくは次回に回します。   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(        ...
  • 続ボーンデフォーム
    前回の続きです。 まずはマテリアルを設定します。 左側にあるマテリアルパネル上で右クリックします。 新規マテリアルを選択するとマテリアルウインドウが 出てくるので、そのまま閉じます。 オブジェクトパネルの Root obj1 を選択します。 メニューの ポリゴン 選択マテリアルをセット を選択します。 これでマテリアルが設定されました。   それでは早速ボーンアニメーションを作成してみましょう。 左側にあるアニメーションパネル上で右クリックします。 新規アニメーションを選択するとアニメーションウインドウが 出てくるので、そのまま閉じます。 下側の1~29までの数値が書いてある所がキーフレームです。 キーフレームの隣の 1.000 となっている所を 0.000 にしてEnterを押します。 キーフレームの 0 の所を選択します。 オブジェクトパネルの Joint2 を選択します...
  • .Xのスキンメッシュアニメーションを読み込んでみる1
    階層メッシュクラスを継承してスキンメッシュクラスを作成します。 ジョイントは球でボーンは四角錐にしました。 固定機能 スキニング編『スキンメッシュアニメーションの原理1』で 作成した man.x を表示しています。 Cyberdelia と ToyStudio では出力されるXファイルの書式が異なりますので 今回からは Cyberdelia で出力したXファイルには対応しない事にします。 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 *...
  • 法線の再設定
    さて、前回のプログラムでは法線を再設定していないので ライトを有効にするとおかしな描画になってしまいます。 ここで言う法線とは頂点法線の事なので、前回のプログラムで 求められた頂点変換後の頂点座標がそのまま使えます。 一つ注意しないといけないのは頂点法線は正規化してデータに 納めないといけない事です。   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(...
  • 簡易輪郭線描画
    普通に描画したモデルの後に少し大きくしたモデルの裏面を黒で描画すると 輪郭線の様に見えます。 ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include math.h #include GL/freeglut/freeglut.h #define PAI 3.14159 //光源 float lightPos[] =  {10.0, 15.0, 10.0, 1.0};//光源位置 //カメラと視体積 struct View{   //カメラ     float pos[3];//位置(視点)     float cnt[3];//注視点   float dist;  //注視点から視点までの距離   float theta; //仰角(水...
  • @wiki全体から「フォン鏡面反射」で調べる

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