3D:球と球

OpenGLプログラミングメモ内検索 / 「3D:球と球」で検索した結果

検索 :
  • 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:線分と無限平面
    線分と無限平面の当たり判定です。 無限平面を表現するのは困難なので、今回は代わりに三角ポリゴンを表示しています。 ファイル main.cpp font.h main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #include math.h #include stdio.h #include font.h #define PAI 3.14159 #define WIDTH 320 #define HEIGHT 240 //3つのベクトル struct Vector3f{  float x;  float y;  float z;  Vector3f(){};  Vector3f(float _x,floa...
  • 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: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 ...
  • メニュー
    Menu トップページ コメント板 GL Wrapper 総合サイト 初めに なぜOpenGLを使うのか? 設定の仕方 困った時は 考察 PC用語の独自調査 GitHubの使い方 Visual Studio 2022 DE Visual C++ 2015 Visual Studio 2017 Expressを入手する MESH VIEW(メッシュビューア) チュートリアルリンク ▼固定機能編へ ▼固定機能 スタティックメッシュ編へ ▼固定機能 階層メッシュアニメーション編へ ▼固定機能 スキニング編へ ▼シェーダー GLSL編へ ▼シェーダー 画像フィルタ偏へ ▼3Dライブラリ編 Irrlicht編へ ▼3Dライブラリ編 Ogre編へ ▼当たり判定 2D編へ ▼当たり判定 3D編へ ▼物理演算 Bullet Physicsへ ▼物理演算 ...
  • 2Dと3Dの描画を切り替える
    2Dと言っても、今では3Dを平面的に扱って表示しています。 その方が高速だったからです。 そして、なんと言っても2Dを3Dの一部として扱うと、移動、回転、 拡大縮小が自由自在に行える利点もあります。 そこで2Dと3Dを同時に描画しようとした場合、工夫が必要になります。 上手く切り替えてやらないと3Dも2Dも同じように移動、回転、拡大縮小 してしまいます。 それには、まず3Dを描画してから glPushMatrix(); で階層を降ります。 そして2Dを描画して glPopMatrix(); で階層を上がります。 これを繰り返します。 つまり3Dを親階層として2Dを子階層とします。 なので、子階層で何をしようが、親階層には影響が無いのです。   ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENT...
  • 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...
  • 2D:点と点
    2Dの点と点の当たり判定です。 あまり使われる事はありませんが一応解説しておきます。 ずばり、点1と点2の座標が同じであれば当たっていると判定しますが、 それだけでは上手く判定できない場合があります。 以下のケースを考えてみます。          
  • 考察
    大まかな歴史 DirectX 名称 登場日 概要 WinG、Display Control Interface Windows 3.1時代 DirectX 1.0 1995年10月 ゲーム作成用のAPI集GameSDKとして発表された。 DirectX 2.0 1996年6月 Direct3D (Immediate Mode, Retained Mode) の登場。 DirectX 3.0 1996年9月25日 DirectSound3D登場、DirectInputの統合。Windows NT 4.0ではSP3以降に同梱。 DirectX 4.0 登場予定だったが、DirectX 3.0からはわずかな変更であり、既にDirectX 5.0がロードマップ上にあったため、ベンダーの要望によりキャンセルされた。 DirectX 5.0 1997年8月4日 Direct3D に DrawPr...
  • テッセレーション
    テッセレーションです。 面を再分割してくれます。 今回のプログラムはスペースキーを押すとテッセレーションで表示します。 ファイル main.cpp main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include stdio.h #include GL/freeglut/freeglut.h #include vector using namespace std; #define WIDTH 320 #define HEIGHT 240 //頂点情報用 struct vector3d{  double x;  double y;  double z; }vec3d; vector vector3d vertex; //テッセレータオブジェクト GLUtess...
  • .FBXを読み込んでみる1(解析編)
    .FBX を読み込んで表示できると便利です。 .FBX は Autodesk 社の製品の中間ファイルフォーマットです。 3ds Max , Maya , MotionBuilder , Mudbox , Softimage 間のデータを 受け渡す時のために作られました。 その後、Lightwave 3D や CINEMA 4D や Shade でも使えるようになりました。 FBXはバージョンによってファイルの内容が違います。 一般的に使用するには FBX SDK を使うのが良いです。 解析編という事で一応中身を見ておきます。 例によってメタセコイアを使います。http //horsetail.sakura.ne.jp/index.html こちらのサイトに FBXエクスポーター というプラグインがあるのでインストールします。 そしてメタセコイアで立方体を作って四角形面を三角形面にし、FBX...
  • 固定機能編:おわりに…
    ここまで、スキンメッシュアニメーションを解説してきましたが、 スキンメッシュアニメーションの実装方法は人それぞれ。 当サイトで解説したやり方だけではない事を頭の片隅に入れておいて 下さい。 3Dモデルのファイル形式に関しても、今回はDirectXのXファイルを 使用しましたが、実際のゲームやアプリ制作での場合は、 3Dモデルのファイル形式そのものを自作するのが1番です。 これで、固定機能編は終了です。          
  • ボーン(骨)
    ToyStudio Advance でボーンを入れる前に用語の解説です。 ボーンの表現は3DCGソフトによって若干違いがありますが、 だいたい似通っています。 まず、ジョイント(関節)があり、2つのジョイントに挟まれているのが ボーン(骨)です。 ボーンは四角錐で表現されます。 四角錐の先側、細い方が子側を表し、底側の太い方が親側を表しています。   それでは ToyStudio Advance を起動しましょう。 ファイル   開く を選択します。 先程作った bone1.mqo を読み込みます。 3Dウインドウの操作はメタセコイアと同じ感覚でできます。 右ドラッグで視点回転、マウスホイールで視点の拡大縮小です。 表示メニューから正射影(Ortho)とパースペクティブ表示や 正面表示、側面表示、上面表示などを切り替える事ができます。   では次回、ボーンを作成してみます。     ...
  • 指定座標で円運動
    指定の座標で回転させます。 ファイル 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...
  • ビルボード
    ビルボードです。 ビルボードというのは常に視点(カメラ)を向く板の事です。 古くは樹木や球のポリゴン数を減らすために用いられました。 現在では火花や雪などのパーティクルとして主に使用されます。 ビルボードにはビュー行列を逆行列にする方法もありますが、 今回はもっと簡単に実装できるやり方がありましたので紹介して おきます。 3D空間のビルボードオブジェクトの中心位置を保存しておき、 glLoadIdentity(); して初期化します。 中心位置から画像サイズ分だけ+-してポリゴンを描画すると 行列計算なしでビルボードができます。   ファイル main.cpp lodepng.cpp lodepng.h tree.png map.png main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainC...
  • 階層構造
    今回、階層構造を作ってアニメーションするために、色々なソフトを試してみたのですが、http //www.vixar.jp/cyberdelia/ こちらの Cyberdelia というソフトがメタセコイアのファイルとも相性が良く最もシンプルで 操作性も良かったので Cyberdelia を使う事にします。 .X のアニメーションを作成できるソフトは他にもたくさんあるのですが、階層メッシュアニメーションだけを 出力するソフトはおそらく Cyberdelia だけではないでしょうか。詳しく調べていないので他にもあるかも しれませんが。 まず、メタセコイアで↓の図のような戦車を作成します。 戦車は 『本体』 と 『砲台』 と 『砲身』 から出来ていてそれらは のような親子関係を持っています。 それを Cyberdelia で読み込んで階層構造を設定し、アニメーションを作って .X形式で保...
  • .FBXを読み込んでみる2(読み込み編)
    それでは実際に FBXSDK を使用してデータを取り出してみようと思います。 まず、fbx20113_fbxsdk_win をインストールして Visual studio にパスを通します。 そして プロジェクトのフォルダに fbxsdk_20113.dll と fbxsdk_20113d.dll を置きます。 使い方は KFbxSdkManager を作成して、 KFbxImporter を作成して、 KFbxImporter にファイルを読み込んで初期化します。 そして、 KFbxScene を作成して、 KFbxScene に KFbxImporter で インポートします。 そして、 KFbxNode を辿って KFbxMesh を探します。 KFbxMesh が見つかったら、そこから各種情報を取り出します。 今回は三角ポリゴンのみでテクスチャ無し、オブジェクト(レイヤー)が一つだ...
  • MESH VIEW(メッシュビューア)
    MESH VIEW (OPENGL プログラミングメモ) ver1.16 ダウンロードはこちら MeshView ver1.16.zip //////////////////////////////////////////////////////////////////////////// MeshView [OPENGL プログラミングメモ] ver1.16 作者 OPENGLプログラミングメモ ホームページ(OPENGLプログラミングメモ) https //w.atwiki.jp/opengl/ ホームページ2(MeshView) http //www.meshview.jp/ ///////////////////////////////////////////////////////////////////////...
  • .Xを読み込んでみる1(解析編)
    DirectXの .X形式のファイルを読み込んで表示できると便利です。 現在の3Dアプリでは .X と .FBX が主に広く使われているようです。 では、例によってメタセコイアで .X を出力して中を見てみます。 三角ポリゴンを一枚だけ作って保存したものをメモ帳で開いてみます。 xof 0302txt 0064 template Header {   3D82AB43-62DA-11cf-AB39-0020AF71E433  WORD major;  WORD minor;  DWORD flags; } template Vector {   3D82AB5E-62DA-11cf-AB39-0020AF71E433  FLOAT x;  FLOAT y;  FLOAT z; } template Coords2d {   F6F23F44-7686-11cf-8F52-004033...
  • .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...
  • 円柱を表示してみる
    円柱を描画します。 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 }; //ライト...
  • .OBJを読み込んでみる2(読み込み編)
    では、取りあえず簡単な読み込みプログラムを作ってみます。 今回はテクスチャ無しで、マテリアルも読み込んでいませんが .MQO の読み込みプログラムの時とは違って法線情報が ありますので陰影が表現されています。 box.obj # Created by Metasequoia mtllib box.mtl v -100.000000 100.000000 100.000000 v -100.000000 -100.000000 100.000000 v 100.000000 100.000000 100.000000 v 100.000000 -100.000000 100.000000 v 100.000000 100.000000 -100.000000 v 100.000000 -100.000000 -100.000000 v -100.000000 100.000000 -10...
  • ソフトウェアスキニング
    これまでやってきた様に、固定機能を使ってCPUのみで行列計算を行う スキニング処理の事を「ソフトウェアスキニング」と言います。 最近のPCはCPUもパワフルになっていますが、3Dゲーム制作等では さすがにスキニングをCPUのみで行うのは無謀です。   行列計算をシェーダーを使ってGPUに行わせるスキニング処理を 「ハードウェアスキニング」と言います。                  
  • クォータニオンと回転行列の変換
    平行移動、拡大縮小と来たら次は回転です。 しかし、回転行列を単純に線形補間した場合は意図した結果にはなりません。 もちろん、X軸のみとかY軸のみ、Z軸のみの回転情報であった場合は上手くいきますが、 ほとんどのケースでそれらが混載していると思います。 どうすれば良いかと言うと、任意軸回転を線形補間してやると意図する結果になります。 任意軸回転と言えばクォータニオンですね。 2つの回転行列があったとして回転情報をクォータニオンに変換して、それを線形補間し、 補間されたクォータニオンを今度は回転行列に変換してやると2つの回転行列の間を 綺麗に補間できるでしょう。   //#pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #include s...
  • 再びキーフレーム
    長らく道を逸れましたが、ここで再びキーフレームに戻ります。 .Xのアニメーションキーのキータイプ情報 0…回転  w,x,y,zの順にクォータニオンデータ 1…拡大縮小 x,y,zの順に拡大縮小データ 2…平行移動 x,y,zの順に平行移動データ 4…合成行列 回転、拡大縮小、平行移動行列が掛け合わされた4×4行列データ まず、最初に知っておかなくてはならない事があります。 それは、当サイトで使用している Cyberdelia は、合成行列タイプの アニメーションデータは階層構造が正しく生成できないという事です。 詳しくは Cyberdelia に付属のヘルプを参照して下さい。 とは言っても、合成行列でないタイプの方は正しく出力されますので、 それを元に合成行列を作成し、単純なキーフレームアニメーションを表示して みたいと思います。 とりあえず、平行移動行列だけに対応したプログラムを作成...
  • 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のメモリが管理できる ...
  • トップページ
    ここは、OpenGLについて学習し、その過程を記録するページです。 プログラミングメモとしてご利用下さい。 なにかありましたらコメント板で。 glutCreateWindowの位置を直す編集をした際に「 」以降が消えるという@wikiの仕様に気づかず、 正常に動作しないプログラムを長期に渡り掲載しておりました。 現在、修復作業中です。 直接、コードを記載すると今後、似たような仕様変更で同じ不具合に遭遇するかもしれないので プログラムコードはテキストデータとしてダウンロードする形に今後変更するかもしれません。 アクセス数 - 昨日 - 今日 - 現在-人が閲覧中。 OpenGL講座 3Dプログラミング freeglut C++/CLI @wikiプラグイン @wiki便利ツール @wiki構文 @wi...
  • 線形補間
    さて、前回の「再びキーフレーム」では箱が瞬間移動してしまって いました。 補間がされていないためです。 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のアニメーションには『階層メッシュアニメーション』と『スキンメッシュアニメーション』が あります。 『階層メッシュアニメーション』はロボット的なアニメーションで、それぞれのパーツ(スタティックメッシュ)が 移動、回転、拡大縮小するのをスタティックメッシュの親子関係を管理して描画する物です。 『スキンメッシュアニメーション』は生物的なアニメーションでボーン(骨)があるものとして、 スキン(皮膚)が動いているかのような滑らかなメッシュの変形を表現する物です。 『階層メッシュアニメーション』は 固定機能 スタティックメッシュ編 で解説したスタティックメッシュを 複数使って、それを親子関係を作り管理するだけなので比較的簡単です。 親子関係の階層管理は再帰関数を使います。 再帰関数とは関数が自分自身を呼び出す物です。 ではまず、階層構造を作ってシンプルなアニメーションを表示してみたいと思います。...
  • .Xを読み込んでみる3(読み込み編)
    では実際にXファイルを読み込んでみます。 今回は読み込み編という事で3角ポリゴンのみです。http //www.geocities.co.jp/Playtown-Spade/7188/こちらのデータを使わせて頂いています。 事前にメタセコイアで3角ポリゴンに変換してテクスチャを PNG 形式に変換しています。 Xファイルのテンプレートを除去しないと読み込みできません。 PNG.h #include lodepng.h //テクスチャクラス class TEXTURE{ protected  LodePNG_Decoder decoder;//デコーダ  unsigned char* buffer;//バッファ  size_t buffersize, imagesize;//サイズ public  TEXTURE();  TEXTURE(const char* FileName)...
  • .Xを読み込んでみる4(表示編)
    前回の読み込み編ではテンプレート無しで3角ポリゴンの Xファイルしか 読み込めませんでしたが、今回はテンプレートを読み飛ばし、3角と4角ポリゴンの 両方の Xファイルを読み込めるようにしました。 Xファイルは作成するソフトによって癖がありますので全ての3Dアプリが作る Xファイルに 対応する事はできません。とりあえずメタセコイアが作る Xファイルに対応しています。   PNG.h #include lodepng.h //テクスチャクラス class TEXTURE{ protected  LodePNG_Decoder decoder;//デコーダ  unsigned char* buffer;//バッファ  size_t buffersize, imagesize;//サイズ public  TEXTURE();  TEXTURE(const char* FileName);...
  • マテリアルの設定
    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 ...
  • .OBJを読み込んでみる3(表示編)
    .OBJ ファイルの読み込みプログラムが完成しましたので公開します。 取りあえず、インデックス化はせずに頂点配列で表示しています。 テクスチャはマテリアルで重複しないようにモデルクラスで保持しています。 完全に重複を避けるにはアプリケーション単位で保持する必要が あると思います。 PNG.h #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* FileNam...
  • .Xの階層メッシュアニメーションを読み込んでみる2
    それでは、実際に階層構造を作って表示してみる事にします。 今回はアニメーションはせずに、ただ単にモデルを表示するだけです。 2分木構造を再帰関数を使ってデータ処理をする場合、return で戻る先を きちんと把握していないとおかしなデータ構造になってしまいます。 再帰関数というのは一つずつネストを深めて行きます。 なので、return すると1階層戻るのではなく 1 NODE 戻ります。 以下の図で説明すると Frame5 から1階層戻る時は 1回の return で 1階層戻りますが、Frame4 から 1階層戻る時は 1回目の return で Frame3 に戻り、2回目の return でFrame2 に戻り、3回目の return で Frame1 に戻って、やっと1階層戻る事になります。 PNG.h #pragma once #include lodepng.h //...
  • なぜ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が左手座標系を採用しているのは大きな明暗。 数学や...
  • .Xの階層メッシュアニメーションを読み込んでみる4
    .xの階層アニメーションを読み込んで再生するプログラムが完成したので公開します。 クォータニオンの符号の判定には皆さん、苦労されたのではないでしょうか。 ネットで広く公開されているサンプルはほとんどがDirectX用で いちいち転置しなければならなかったり。 左手座標用に作成したアニメーションXファイルはクォータニオンのY軸とZ軸を-1倍しないと OpenGLではおかしな表示になるとか。 回転角度が181度とマイナス179度ではクォータニオンの符号が反転してるけど 同じ回転行列になるとか。 いやはや、手間取りました。 最後に親階層から子階層へ脈々と行列を受け継いで完成です。 『固定機能 階層メッシュアニメーション編』の『階層構造』で作成した sample4.xを表示しています。 尚、Cyberdelia で作成したアニメーションXファイルだけに対応しています。    font.h #pr...
  • スキンメッシュアニメーションの作成
    スキンメッシュアニメーションのXファイルの中身を見てみると言っても、 まずは作成しなければなりません。   スキンメッシュアニメーションを作成するソフトとして、 ToyStudio や エルフレイナ 等がありますがどちらもシェアウェアです。 また、各種市販の3DCGソフトウェアでも作成できますが、なるべくお金の かからない方法で作成したいです。  そこでカンパウェアの RokDeBone2 を使わせて頂く事にします。 *( RokDeBone2 ver5.5.2.7 以降を使用して下さい。)http //ochakkolab.moo.jp/ この RokDeBone2 は、XBOX360の周辺機器である Kinect を用いると モーションキャプチャーの機能を使う事もできます。すごいですね。 *(2012/3/2追記) …と思ったんですが、RokDeBone2 での読み込みプログラムを作成...
  • LibSynth++ 解析編
    では、早速 LibSynth++ の使い方を探ってみたいと思います。 http //www5.atpages.jp/~my04337/ tomoteruの生成物倉庫 の 初代LibSynth++ のページにある *LibSynth++ AlphaTest Rev.18 LibSynth++ – Header,Lib(Visual Studio2008用) から LibSynthPP.cab をダウンロードします。 解凍して Include フォルダにある LibSynth++.h を見てみましょう。   ざっと見た所、 ~90行まで 定数定義 ~296行まで メッセージ制御系 ~484行まで バッファ処理系 ~601行まで 双二次フィルタ系 ~636行まで WaveTable ~709行まで オシレータ ~931行まで midiパーサ系 ~1163行まで オシレータ系 ~165...
  • 簡易シャドウイング
    平面上に影のように見えるオブジェクトを描画します。 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...
  • 行列(マトリックス)とは
    ここで行列(マトリックス)の解説をします。 ここで言う行列というのはお店の前に人がいっぱい並んでいる事ではありません。 数学で使う行列の事です。 行列(マトリックス)とは数字を行と列に並べて括弧でくくったものです。 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); 等も実は内部で行列を使...
  • GLSL:マルチテクスチャ
    マルチテクスチャです。 今回のプログラムは地球の地表テクスチャと雲のテクスチャを合成し、 地表よりも雲を遅れて回転させています。 マウスの左ドラッグで視点を変更できます。 画像はNASAがフリーで配布している物を縮小して使用しています。 earth.png cloud.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_MultiTexCoord0;   gl_TexCoord[1] = gl_TextureMatrix[1] * gl_MultiTexCoord0;  ...
  • オフスクリーンレンダリング
    オフスクリーンレンダリングです。 レースゲームのバックミラーの描画等で使われます。 metasequiaに付属のviolin.mqoを.xに変換して使用しています。violin.xはここからダウンロードして下さい。 右クリックして名前を付けてリンク先を保存でダウンロードできます。 violin.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_MultiTexCoord0;   gl_Position = ftransform(); }   flagment.shad...
  • スポットライト
    スポットライトです。 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...
  • フォグ
    フォグです。 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...
  • 法線の再設定
    さて、前回のプログラムでは法線を再設定していないので ライトを有効にするとおかしな描画になってしまいます。 ここで言う法線とは頂点法線の事なので、前回のプログラムで 求められた頂点変換後の頂点座標がそのまま使えます。 一つ注意しないといけないのは頂点法線は正規化してデータに 納めないといけない事です。   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(...
  • 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...
  • .OBJを読み込んでみる1(解析編)
    .OBJ は Wavefront社の Advanced Visualizer というソフト用のファイルフォーマットです。 3Dプログラミング入門関係のHPや書籍では必ずと言って良いほど最初の方に登場します。 何故か?と言うとファイル形式がとてもシンプルでスタティックメッシュ(アニメーションしないメッシュ)を 表現するための全ての情報を含んでいるので入門用には最適だからです。 では、まず、例によってメタセコイアで .OBJ を作成し、中身を見てみる事にします。 メタセコイアを起動して面コマンドの基本図形を選択します。 そして立方体を作成し、それを .OBJ 形式で保存します。    保存する時の注意ですが法線、UVマッピング、マテリアルにチェックし、改行コードを Windows(CR/LF)にしなければなりません。 さらに左右を反転するにもチェックをしないとOpenGLでは逆に表示されます。...
  • 環境マッピング
    環境マッピングです。 正面の球に部屋を反射させて描画します。 room.xは、ここからダウンロードできます。 右クリックして、名前を付けてリンク先を保存してください。 wall.png vertex.shader varying vec3 P; varying vec3 N; varying vec4 Reflect;  uniform mat4 ViewTranspose;//ビュー変換だけのモデルビュー行列の転置行列 void main(void) {   P = vec3(gl_ModelViewMatrix * gl_Vertex);   N = normalize(gl_NormalMatrix * gl_Normal);   vec3 incident = normalize(P);//入射視線ベクトル   vec3 reflect0 = reflect(incident...
  • @wiki全体から「3D:球と球」で調べる

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