OpenGLプログラミングメモ内検索 / 「ボーンデフォーム」で検索した結果
-
ボーンデフォーム
表示メニューの正射影を選択して正射影(Ortho)にします。 表示メニューの正面を選択して真正面から見た図にします。 ポリゴンツールを押してモデルの全体を確認します。 ジョイントツールを押します。 この状態でモデルビュー上を左クリックするとジョイントが作成できます。 デフォルトではジョイントの表示が小さいので大きくします。 ファイル シーン設定を選択します。 表示半径のジョイントを8にしてOKボタンを押します。 最初のジョイントをモデル下部に作成し、次のジョイントをモデル中心より 少し下に作成します。 すると一つ目のボーンが出来上がりました。 続けて、モデル上部より少し下にジョイントを作成し、完成です。 完成したら選択ツールを押してジョイントツールを終了します。 オブジェクトパネルのobj1とJoint1をShiftキーを押しながら選択します。 オブジェクトメニューのスムーズスキ...
-
続ボーンデフォーム
前回の続きです。 まずはマテリアルを設定します。 左側にあるマテリアルパネル上で右クリックします。 新規マテリアルを選択するとマテリアルウインドウが 出てくるので、そのまま閉じます。 オブジェクトパネルの Root obj1 を選択します。 メニューの ポリゴン 選択マテリアルをセット を選択します。 これでマテリアルが設定されました。 それでは早速ボーンアニメーションを作成してみましょう。 左側にあるアニメーションパネル上で右クリックします。 新規アニメーションを選択するとアニメーションウインドウが 出てくるので、そのまま閉じます。 下側の1~29までの数値が書いてある所がキーフレームです。 キーフレームの隣の 1.000 となっている所を 0.000 にしてEnterを押します。 キーフレームの 0 の所を選択します。 オブジェクトパネルの Joint2 を選択します...
-
メニュー
...作成 ボーン(骨) ボーンデフォーム 続ボーンデフォーム .Xのスキンメッシュアニメーションファイルを解析 スキンメッシュアニメーションの原理1 グローバル座標とローカル座標 バインドポーズ .Xのスキンメッシュアニメーションを読み込んでみる1 階層ボーンアニメーション スキンメッシュアニメーションの原理2 同次座標系 幾何変換 同次座標系で計算 ボーンオフセット行列 スキンメッシュアニメーションの原理3 ウェイト 頂点ブレンディング .Xのスキンメッシュアニメーションを読み込んでみる2 法線の再設定 スキンメッシュアニメーションの原理4 .Xのスキンメッシュアニメーションを読み込んでみる3 ソフトウェアスキニング 固定機能編 おわりに… ▲▲▲▲▲ プログラマブルシェーダー編 ▼ シェーダー GLSL編 固定機能との違い 頂点シェーダー フラグメントシェーダー G...
-
ボーン(骨)
ToyStudio Advance でボーンを入れる前に用語の解説です。 ボーンの表現は3DCGソフトによって若干違いがありますが、 だいたい似通っています。 まず、ジョイント(関節)があり、2つのジョイントに挟まれているのが ボーン(骨)です。 ボーンは四角錐で表現されます。 四角錐の先側、細い方が子側を表し、底側の太い方が親側を表しています。 それでは ToyStudio Advance を起動しましょう。 ファイル 開く を選択します。 先程作った bone1.mqo を読み込みます。 3Dウインドウの操作はメタセコイアと同じ感覚でできます。 右ドラッグで視点回転、マウスホイールで視点の拡大縮小です。 表示メニューから正射影(Ortho)とパースペクティブ表示や 正面表示、側面表示、上面表示などを切り替える事ができます。 では次回、ボーンを作成してみます。 ...
-
ボーンオフセット行列
以下は 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...
-
階層ボーンアニメーション
今回はボーンだけを階層アニメーションさせてみます。 今回も新しく 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のスキンメッシュアニメーションファイルを解析
取りあえず、DirectX SDK に付属するビューワーで再生の確認をします。 本来はスタティックメッシュであるはずの bone1.mqo が、 ウネウネ変形しています。 例によって、テンプレート部分は除去しました。 xof 0303txt 0032 # Global definition. AnimTicksPerSecond { 3000; } # Materials definition. Material Material_1 { 0.800000;0.800000;0.800000;1.000000;; 5.000000; 0.300000;0.300000;0.300000;; 0.000000;0.000000;0.000000;; } # Models definition. Frame Model { FrameTransformMatrix { 1...
-
C++/CLI:ツールストリップコンテナ
基本プロジェクトに ToolStripContainer を配置し、 フォームの四辺にドッキングするをクリックします。 このようになりました。 デフォルトではフォームの四辺の上側にツールバーを置くエリアがあります。 フォームの四辺にあるコンテナパネルをクリックするとツールストリップを 配置するエリアが現れます。 とりあえず、上側のエリアにツールストリップを配置します。 ツールバーにボタンとラベルを追加しました。 ビルドして実行してみましょう。 ツールバーのつまみをドラッグしてフォームの四辺に移動させると ツールバーの位置を変える事ができます。 MyForm.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include MyForm.h using namespace ...
-
C++/CLI:MDI
基本プロジェクトを立ち上げます。 フォームのプロパティの IsMdiContainer を True にします。 プロジェクトに新しい項目を追加します。 Visual C++ の UI の Windowsフォームを選択し、名前を MDIForm.h にして追加ボタンを押します。 MyForm を選択して、Size を Width 640、Height 480 にします。 MyForm.h のコードを表示して、以下のコードを追加します。 // //TODO ここにコンストラクター コードを追加します // Form^ MDIForm = gcnew Form; int childCount=0; childCount++; String^ formText = String Format( MDIForm {0} , child...
-
.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...
-
C++/CLI:はじめに
では、早速 C++/CLI のアプリケーションを作成してみましょう。 Visual Studio 2012 Express for Windows Desktop を起動します。 ファイル → 新しいプロジェクト を選択し、 VisualC++ → CLR → 空のCLRプロジェクトを選択します。 プロジェクト名は Project1 にしておきます。 プロジェクト → 新しい項目の追加を選択し、 Visual C++ の UI の Windowsフォーム を選択します。 フォームの名前は MyForm.h にしておきます。 すると、このようなフォームデザイナ画面が表示されます。 ツールボックスの Button をクリックしてから MyForm の上で クリックします。 するとフォーム上に button1 が作成されました。 ...
-
C++/CLI:ドッキングウインドウ その1
ドッキングウインドウというのは便利ですね。 MFCとかC#やVisual BASICにはドッキングウインドウのコントロールがあるので簡単にプロジェクトに追加して ドッキングウインドウのアプリケーションを作る事ができます。 C++/CLIにはドッキングウインドウのコントロールはありません。。。 ライブラリを使ってドッキングウインドウをしても良いのですが、独自のグラフィックを使っていたりして如何にもライブラリ使いました。。。 という事がバレバレになってしまいます。 そこで今回はドッキングウインドウを自作してみようと思います。 ドッキングウインドウを作るにあたって、パネルコントロールが使えそうなので、これでやってみようと思います。 メニューのファイル、新規作成のプロジェクトを選択します。 CLR 空のプロジェクト(.NET Framework) C++ Windows コンソール を選択して...
-
スキンメッシュアニメーションの原理1
2012/4/11現在、RokDeBone用に作成した以下の解説をToyStudio用に 書き直ししています。更新までしばらくお待ちください。 今回はスキンメッシュアニメーションの原理を知るために一つの アニメーションを作ってみました。 まず、メタセコイアで次のような人型のモデルを作ります。 これは『スタティックメッシュ』ですね。 『固定機能 スタティックメッシュ編』で学習しました。 そして RokDeBone2 で次のようにボーンを仕込みます。 いろいろ駆使して歩行アニメーションを作成しました。 ここで注目して欲しいのはボーンの動きです。 次の画像はボーンだけを真横から見た図ですが、何か気付きませんか? ボーンが、何やらロボット的な動きをしていると思いませんか? そうです。スキンメッシュアニメーションは、まず第一に、 ①ボーンが階層アニメーションを行っている。 ...
-
バインドポーズ
バインドポーズの解説です。 ボーンは、グローバル座標上(絶対座標上)で、それぞれ自らの基準となる位置情報を持ちます。 その位置情報(行列)を元にボーンの基準系とも言うべきローカルな座標系が算出できる訳ですが、 そのボーンの行列の逆行列(グローバル座標の原点に戻す行列)の事を 『バインドポーズ』、あるいは『バインドポーズ行列』と呼びます。 ここまでの知識でスキンメッシュの初期姿勢(アニメーション無し)を ボーンも含めて表示する事ができるはずです。 では次回、スキンメッシュの初期姿勢を表示してみましょう。
-
スキンメッシュアニメーションの原理3
スキンメッシュアニメーションの真髄、頂点に座標変換を 施す処理ですが、具体的には 頂点座標 × ボーンオフセット行列 × 座標変換行列 × バインドポーズ行列 という事になります。 スキンメッシュアニメーションの仕組みは ①ボーンが階層アニメーションを行っている。 ②頂点座標データを書き換える。 の次は ③頂点座標 × ボーンオフセット行列 × 座標変換行列 × バインドポーズ行列 と、なりそうですが、これで完全ではありません。 詳しくは言いませんが、これだけではモデルがバッキバキに変形してしまいます。 では、どうスムーズに変形させるかと言うと、頂点が各ボーンから受ける影響の 重み(ウェイト)を設定してあげれば良いですね。 解説は次回に回します。
-
PhysX:セットアップ
NVIDIA PhsyX についての解説です。 NVIDIA PhsyX は良く間違われますが CUDA とは違います。 CUDA は Compute Unified device Architecture の略で NVIDIA社の GPU に対する GPGPU を目的とした フレームワークまたは統合開発環境の事です。 GPU を動作させるためのプログラミング・モデル、およびプログラミング言語(CUDA-C)とそのコンパイラ、ライブラリを言います。 PhsyX は物理エンジンのSDKです。 NVIDIA PhsyX SDK 5.0.2 (2023/9/24最新) https //github.com/NVIDIA-Omniverse NVIDIA PhysX SDK 4.1 https //github.com/NVIDIAGameWorks 内の、 h...
-
スキンメッシュアニメーションの原理4
ここまでのおさらいです。 ①、ボーンが階層アニメーションを行っている。 ②、頂点座標データを書き換える。 ③、(頂点座標 × ボーンオフセット行列 × 座標変換行列 × バインドポーズ行列) × 頂点ウェイト ④、 ③を影響するボーンの数だけ処理して足す(頂点ブレンド) ⑤、 ④で得られた頂点座標を元に頂点法線を再設定する 以上でスキンメッシュアニメーションの処理は完成です。
-
C++/CLI:ラベル
基本プロジェクトのフォームデザイナ画面の Label をクリックして フォームの適当な場所でクリックします。 するとラベルが作成されます。 そのラベルのプロパティの Font を選択します。 するとフォントダイアログが出てくるのでフォントサイズを24辺りにします。 プロパティの Text をクリックして ラベルでーす。に変えます。 ビルドして実行してみましょう。 簡単にスタティックテキストが表示できましたね。 もちろん、プログラムで動的にテキストを変更する事も可能です。 今回のプログラムコードは以下の通りです。 MyForm.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include MyForm.h using namespace Project1...
-
C++/CLI:テキストボックス
基本プロジェクトにテキストボックスを配置します。 このままビルドすると、正にテキストボックスですが、 今回は簡易メモ帳の様な感じにしてみたいと思います。 プロパティの Dock を Fill にします。 するとフォーム全体に、広が…りませんね。。。 というのも、複数行を許可していないためです。 では、早速 Multiline を True にしてみましょう。 今度はフォーム全体に広がりました。 ビルドして実行します。 MyForm.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include MyForm.h using namespace Project1; [STAThreadAttribute] int main(){ MyForm ^form1 = gcnew...
-
ウェイト
ウェイトの解説です。 Weight は重さの事ですが、ここで言うウェイトとは、頂点ウェイトの事です。 頂点ウェイトとはモデルの頂点に関連付けられたボーンが移動した際に、 その頂点がそのボーンにどれだけ追従するかの比率の事です。 基本的には頂点ウェイトは、0.0~1.0の正規化された範囲で表されます。 場合によっては、0.0~1.0の範囲外のデータの場合もありますが、 その場合でも自前で正規化して使います。
-
キーフレーム
キーフレームですが、.Xのアニメーションキーのキータイプ情報は 0…回転 w,x,y,zの順にクォータニオンデータ 1…拡大縮小 x,y,zの順に拡大縮小データ 2…平行移動 x,y,zの順に平行移動データ 4…合成行列 回転、拡大縮小、平行移動行列が掛け合わされた4×4行列データ となっています。 回転の情報がクォータニオンになっているのは知っての通り、ジンバルロックを 避けるためです。そして、このクォータニオンは行列を使っています。 キータイプの4が合成行列になっている事もあり、ここから先は行列の知識が 必要になると思います。 そこで、次回からは階層アニメーションからちょっと逸れて、 行列に関する解説に入ります。
-
法線の再設定
さて、前回のプログラムでは法線を再設定していないので ライトを有効にするとおかしな描画になってしまいます。 ここで言う法線とは頂点法線の事なので、前回のプログラムで 求められた頂点変換後の頂点座標がそのまま使えます。 一つ注意しないといけないのは頂点法線は正規化してデータに 納めないといけない事です。 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( ...
-
C++/CLI:ファイルダイアログ
基本プロジェクトにオープンファイルダイアログを配置します。 フォーム上には何も表示されず、フォームデザイナの下の方に オープンファイルダイアログコントロールが表示されます。 オープンファイルダイアログを起動するには何かアクションが必要なので ボタンも配置します。 ボタンの TEXT を「ファイルを開く」にします。 ボタンをダブルクリックして以下のコードを追加します。 //ファイルフィルタ openFileDialog1- Filter = 画像ファイル(*.bmp,*.jpg,*.png,*.tif,*.ico)|*.bmp;*.jpg;*.png;*.tif;*.ico ; openFileDialog1- ShowDialog(); //取得したファイル名 String^ FileName = openFileDialo...
-
.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 *...
-
スムースシェーディング
スムースシェーディングです。 とは言っても、OpenGLではデフォルトでスムースシェーディングをする設定に なっているので何も設定せずともスムースシェーディングで描画されるのですが フラットシェーディングやワイヤーフレーム表示と切り替えるには glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); でポリゴンを塗りつぶし設定にして glShadeModel(GL_SMOOTH); を設定します。 ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #define WIDTH 320 #define HEIGHT 240 //青 GLfloat aqua[...
-
設定の仕方
Visual Studio 2022 Community のインストール Visual Studio 2022 Community https //visualstudio.microsoft.com/ja/downloads/ こちらから、Visual Studio 2022 Community をインストールしてください。 デフォルトだと開発環境の背景色が『濃色』になっていて見にくいので『淡色』に変更します。 ツール→オプションの環境→全般の配色テーマを『淡色』にします。 これで昔ながらの見やすい開発環境になりました。 Visual Studio 2012 Express for Windows Desktop のインストール Visual Studio 2012 Express for Windows Desktop http //www...
-
Visual Studio 2022 DE Visual C++ 2015
Visual Studio 2022 DE Visual C++ 2015 とは? かつて、Visual Studio 2015 をインストールしようとしてできなかった人が結構居るのではないでしょうか? 何故かインストールに失敗してできなかった人が結構居ると思います。(当サイト管理人もその一人です。。。) Ж できました。。。 Visual Studio 2017 や Visual Studio 2019 、果ては Visual Studio 2022 まであるのに今更何故 2015 なのか? と、思う方は要ると思います。 結論から言うと PhysX の最新版 ver 5.0.2 や ver 4.1 をコンパイルするには Visual C++ 2015でないとコンパイルできないからです。 と、いう訳で Visual Studio 2022 から Visual C++...
-
アニメーションとは
3Dのアニメーションには『階層メッシュアニメーション』と『スキンメッシュアニメーション』が あります。 『階層メッシュアニメーション』はロボット的なアニメーションで、それぞれのパーツ(スタティックメッシュ)が 移動、回転、拡大縮小するのをスタティックメッシュの親子関係を管理して描画する物です。 『スキンメッシュアニメーション』は生物的なアニメーションでボーン(骨)があるものとして、 スキン(皮膚)が動いているかのような滑らかなメッシュの変形を表現する物です。 『階層メッシュアニメーション』は 固定機能 スタティックメッシュ編 で解説したスタティックメッシュを 複数使って、それを親子関係を作り管理するだけなので比較的簡単です。 親子関係の階層管理は再帰関数を使います。 再帰関数とは関数が自分自身を呼び出す物です。 ではまず、階層構造を作ってシンプルなアニメーションを表示してみたいと思います。...
-
C++/CLI:基本プロジェクト
前回のプロジェクトからボタンを削除します。 button1 を選択して Deleteキーを押します。 同様に、button2 も削除します。 そして、MyForm.h から次のコードの部分を削除します。 private System Void button1_Click(System Object^ sender, System EventArgs^ e) { this- BackColor = Color Blue; } private System Void button2_Click(System Object^ sender, System EventArgs^ e) { this- BackColor = Color GreenYellow; } そして、MyForm.cpp の一番最初に次のコードを記述します。 #pragm...
-
スキンメッシュアニメーションの原理2
スタティックメッシュを変形させるにはどうすれば良いのでしょう? スタティックメッシュを構成する要素には ①頂点座標 ②法線 ③UV ④マテリアル ⑤テクスチャ 等がありますが、この中の ①頂点座標 を変更してあげれば スタティックメッシュが変形します。 頂点座標を変更すると言っても glTranslatef とか glRotatef 等では モデルビュー行列が変更されるだけで頂点座標そのものは変更できません。 では、何か、頂点座標を変更するようなものがあるかと言うと、 そのようなものは用意されていません。 スタティックメッシュの頂点座標が格納されている配列データを 直接、平行移動やら回転等をしているかのようにデータを書き換えなければなりません。 この場合、あくまでも書き換えるのは表示用のデータで、初期姿勢のデータを 変更してはいけません。 スキンメッシュアニメーションの仕組みは ①ボーンが...
-
.OBJを読み込んでみる1(解析編)
.OBJ は Wavefront社の Advanced Visualizer というソフト用のファイルフォーマットです。 3Dプログラミング入門関係のHPや書籍では必ずと言って良いほど最初の方に登場します。 何故か?と言うとファイル形式がとてもシンプルでスタティックメッシュ(アニメーションしないメッシュ)を 表現するための全ての情報を含んでいるので入門用には最適だからです。 では、まず、例によってメタセコイアで .OBJ を作成し、中身を見てみる事にします。 メタセコイアを起動して面コマンドの基本図形を選択します。 そして立方体を作成し、それを .OBJ 形式で保存します。 保存する時の注意ですが法線、UVマッピング、マテリアルにチェックし、改行コードを Windows(CR/LF)にしなければなりません。 さらに左右を反転するにもチェックをしないとOpenGLでは逆に表示されます。...
-
ボリュームの変換
ボリュームを変えます。 最大値、最小値を超えた場合は音が割れてしまうので なるべく範囲内のボリュームにした方が良いです。 今回はサイン波の生成で作成した.wavの音を0.5倍したので 振幅が半分になっているのがわかると思います。 #include stdio.h #include stdlib.h #include string.h #include algorithm using namespace std; #define INFileName sin.wav #define OUTFileName amp.wav #define AMP 0.5 //倍率 // defines #define STR_RIFF RIFF #define STR_WAVE WAVE #define STR_fmt fmt #...
-
WAVファイルの構成
WAVファイルの中身や扱い方を知っておくと後々役に立つかも知れません。 という訳で早速、中身をバイナリエディタ『Stirling』で見てみます。 具体的なファイル構成がどうなっているかと言うと、 4 byte RIFFヘッダ ( R I F F ) 4 byte これ以降のファイルサイズ 4 byte WAVEヘッダ ( W A V E ) 4 byte fmt チャンク ( f m t ) 4 byte fmt チャンクのバイト数 リニアPCM ならば 16(10 00 00 00) 2 byte フォーマットID リニアPCM ならば 1(01 00) 2 byte チャンネル数 モノラル ならば 1(01 00)ステレオ ならば 2(02 00) 4 byte サンプリングレート 44.1kHz ならば 44100(44 ...
-
ビルボード
ビルボードです。 ビルボードというのは常に視点(カメラ)を向く板の事です。 古くは樹木や球のポリゴン数を減らすために用いられました。 現在では火花や雪などのパーティクルとして主に使用されます。 ビルボードにはビュー行列を逆行列にする方法もありますが、 今回はもっと簡単に実装できるやり方がありましたので紹介して おきます。 3D空間のビルボードオブジェクトの中心位置を保存しておき、 glLoadIdentity(); して初期化します。 中心位置から画像サイズ分だけ+-してポリゴンを描画すると 行列計算なしでビルボードができます。 ファイル main.cpp lodepng.cpp lodepng.h tree.png map.png main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainC...
-
再びキーフレーム
長らく道を逸れましたが、ここで再びキーフレームに戻ります。 .Xのアニメーションキーのキータイプ情報 0…回転 w,x,y,zの順にクォータニオンデータ 1…拡大縮小 x,y,zの順に拡大縮小データ 2…平行移動 x,y,zの順に平行移動データ 4…合成行列 回転、拡大縮小、平行移動行列が掛け合わされた4×4行列データ まず、最初に知っておかなくてはならない事があります。 それは、当サイトで使用している Cyberdelia は、合成行列タイプの アニメーションデータは階層構造が正しく生成できないという事です。 詳しくは Cyberdelia に付属のヘルプを参照して下さい。 とは言っても、合成行列でないタイプの方は正しく出力されますので、 それを元に合成行列を作成し、単純なキーフレームアニメーションを表示して みたいと思います。 とりあえず、平行移動行列だけに対応したプログラムを作成...
-
スキンメッシュアニメーションの作成
スキンメッシュアニメーションのXファイルの中身を見てみると言っても、 まずは作成しなければなりません。 スキンメッシュアニメーションを作成するソフトとして、 ToyStudio や エルフレイナ 等がありますがどちらもシェアウェアです。 また、各種市販の3DCGソフトウェアでも作成できますが、なるべくお金の かからない方法で作成したいです。 そこでカンパウェアの RokDeBone2 を使わせて頂く事にします。 *( RokDeBone2 ver5.5.2.7 以降を使用して下さい。)http //ochakkolab.moo.jp/ この RokDeBone2 は、XBOX360の周辺機器である Kinect を用いると モーションキャプチャーの機能を使う事もできます。すごいですね。 *(2012/3/2追記) …と思ったんですが、RokDeBone2 での読み込みプログラムを作成...
-
クォータニオン
クォータニオンです。 クォータニオンは4元数と呼ばれます。数字が4つ集まったものです。 というように示します。4次元ベクトルではありません。(似ていますが。) セミコロンの左側が実部で右側が虚部です。 実部には実数が、虚部には虚数が入ります。 虚数というのは概念的なもので2乗してマイナスになる数字の事で、 実際には存在しません。
-
キーボードの状態を取得
GLUT では glutKeyboardFunc 等でコールバック関数として キー入力を調べる関数を登録する事もできますが、5キー以上の 同時入力を検知する事ができないので WindowsAPI を使用します。 今回のプログラムではリターンキー、スペースキー、矢印キーを入力すると 画面の色が変わります。 ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include windows.h #include GL/freeglut/freeglut.h #define WIDTH 320 #define HEIGHT 240 BYTE KeyTbl[256]; void display(void) { glClear(GL_COLOR...
-
フォグ
フォグです。 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...
-
アルファブレンディング
アルファブレンディングです。 アルファブレンディングで注意しなければならない事があります。 いかなるグラフィック描画でも基本的には一番最後に描画したものだけが表示されて、 それまでにあった描画は全て上書きされてしまいます。 ですが、3D描画ライブラリにはデプスバッファやZバッファがあり隠面消去を使うと手前のものは 上書きされないようにすることができます。 しかし、透明度のある物体を描画するときに隠面消去を使用すると本来は色が合成されて 表示されるはずのものが隠面消去により、まるまる描画されなかったりします。 それを解決するには、 1.不透明なオブジェクトを描画 2.半透明オブジェクトをZソート(視点からの奥行き順) 3.半透明オブジェクトの、奥にあるものから描画 という手順を踏む必要があります。 今回のプログラムではスペースキーを押す度にブレンディング係数を切り替えます。 ファイル ...
-
sin波状にボリューム変換
sin波状にボリュームを変化させます。 #include stdio.h #include stdlib.h #include string.h #include algorithm using namespace std; #define INFileName in.wav #define OUTFileName sinamp.wav #define PAI 3.141592653589793 #define Length 0.01 // defines #define STR_RIFF RIFF #define STR_WAVE WAVE #define STR_fmt fmt #define STR_data data #define WAV_MONAURAL 1 #define WA...
-
C++/CLI:モーダルダイアログ
基本プロジェクトを立ち上げます。 モーダルダイアログというコントロールは無いので モーダルダイアログを自作します。 プロジェクトの新しい項目の追加を選択します。 UI の Windowsフォームを選択し、名前を Dialog.h にして 追加ボタンを押します。 プロパティの MaximizeBox と MinimizeBox と ShowInTaskbar を False にします。 プロパティの StartPosition を CenterParent にして FormBorderStyle を FixedDialog にします。 MyForm に Button を配置します。 配置されたボタンをダブルクリックして以下のコードを追加します。 Form^ Dialog = gcnew Form(); Dialog- ShowDialog(); //...
-
フルスクリーンで起動する
フルスクリーンで起動します。 GLUT にはゲームモードというのがあり、これを使うと簡単にフルスクリーンにできます。 ゲームモードを使う場合は glutCreateWindow を使ってはいけません。 強制終了してしまいます。 サンプルプログラムはESCキーを押すと終了します。 ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glutSwapBuffers(); } void idle(void) { glutPostRedisplay(...
-
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] ...
-
フォント選択ダイアログ
フォント選択ダイアログです。 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...
-
視点の回転(クォータニオン)
視点を回転させます。 回転方法にはいろいろとあります。 ロールピッチヨー、オイラー角、クォータニオンなどです。 ロールピッチヨーはZ軸、Y軸、X軸を順番に回転させて目的の角度にする方法です。 飛行機の姿勢を表す時によく使われます。最も解り易く素直な方法です。 オイラー角はZ軸、X軸(またはY軸)、Z軸と回転させて目的の角度にする方法です。 3つの軸を使わなくても2つの軸があれば目的の角度にたどり着きます。 しかし、ロールピッチヨーとオイラー角には欠点があります。ジンバルロックと呼ばれるものです。 たとえば、X軸を90度傾けると、Y軸とZ軸が同軸となってしまい、その姿勢を保存して また新たに回転をしようとしたときに問題がおきます。 X軸とY軸をそれぞれ90度傾けると全ての軸が同軸となり一つの方向にしか回せなくなります。 それを解消する方法がクォータニオンです。 クォータニオンは軸を任意に作成...
-
クォータニオンと回転行列の変換
平行移動、拡大縮小と来たら次は回転です。 しかし、回転行列を単純に線形補間した場合は意図した結果にはなりません。 もちろん、X軸のみとかY軸のみ、Z軸のみの回転情報であった場合は上手くいきますが、 ほとんどのケースでそれらが混載していると思います。 どうすれば良いかと言うと、任意軸回転を線形補間してやると意図する結果になります。 任意軸回転と言えばクォータニオンですね。 2つの回転行列があったとして回転情報をクォータニオンに変換して、それを線形補間し、 補間されたクォータニオンを今度は回転行列に変換してやると2つの回転行列の間を 綺麗に補間できるでしょう。 //#pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #include s...
-
@wiki全体から「ボーンデフォーム」で調べる
更新順にページ一覧表示
|
作成順にページ一覧表示
|
ページ名順にページ一覧表示
|
wiki内検索