bambooflow Note
http://w.atwiki.jp/bambooflow/
bambooflow Note
ja
2011-08-26T22:54:23+09:00
1314366863
-
OpenGL/2.x/Stroing_Vertex_Attributes
https://w.atwiki.jp/bambooflow/pages/328.html
*Storing Vertex Attributes
各メッシュデータには、
-頂点座標(v)
-法線(n)
-テクスチャ座標(tc)
を準備し、サーバにストアする必要がある。
サーバにストアするとき、データの格納方法は2通りある。
-各データを配列で格納
-構造体で格納
**各データを配列で格納
|v|v|v|v|v|v|
|n|n|n|n|n|n|
|tc|tc|tc|tc|tc|tc|
#highlight(c){{
glFloat v[] = { ... };
glFloat n[] = { ... };
glFloat tc[] = { ... };
glVertexAttribPointer(vIndex, 3, GL_FLOAT, GL_FALSE, 0, v);
glVertexAttribPointer(nIndex, 3, GL_FLOAT, GL_FALSE, 0, n);
glVertexAttribPointer(tcIndex, 2, GL_FLOAT, GL_FALSE, 0, tc);
glEnableVertexAttribArray(vIndex);
glEnableVertexAttribArray(nIndex);
glEnableVertexAttribArray(tcIndex);
}}
**構造体で格納
struct VertexData {
GLfloat tc[2];
GLfloat n[3];
GLfloat v[3];
};
|tc|n|v|tc|n|v|tc|n|v|
#highlight(c){{
VertexData verts[];
glVertexAttribPointer(vIndex, 3, GL_FLOAT, GL_FALSE, sizeof(VertexData), verts[0].v);
glVertexAttribPointer(vIndex, 3, GL_FLOAT, GL_FALSE, sizeof(VertexData), verts[0].n);
glVertexAttribPointer(vIndex, 2, GL_FLOAT, GL_FALSE, sizeof(VertexData), verts[0].tc);
glEnableVertexAttribArray(vIndex);
glEnableVertexAttribArray(nIndex);
glEnableVertexAttribArray(tcIndex);
}}
ストア時は、パラメータにオフセットを与える。
2011-08-26T22:54:23+09:00
1314366863
-
ODE/インストール(Windows+Qt+MinGW)
https://w.atwiki.jp/bambooflow/pages/327.html
*ODEインストール:Windows+Qt+MinGW
//Windowsのオープンソース版QtはMinGWしかコンパイラがありません。
QtSDKに入っているMinGWでのコンパイル方法をメモします。
> cd ode-0.11.1/build
> premake4 gmake
> cd gmake
このフォルダに生成されたMakefileを編集します。
編集する場所は6行目あたりです。
ライブラリ生成を、Release+小数点精度(倍精度)+静的ライブラリ(lib)とするならば、
ifndef config
# config=debugsingledll
config=releasedoublelib
endif
とします。
他、以下から選択できます。
-debugsingledll
-releasesingledll
-debugsinglelib
-releasesinglelib
-debugdoubledll
-releasedoubledll
-debugdoublelib
-releasedoublelib
コンパイルにはいります。
ode-0.11.1/build/gmake以下で、
> set path=%path%;c:\QtSDK\mingw\bin
> mingw32-make CC=gcc CXX=g++
コンパイルが成功すると
ode-0.11.1/lib/ReleaseDoubleLib/libode_double.a
にライブラリが生成されます。
**.proの設定
以下を追加する必要があります。
DEFINES += dDOUBLE
win32:INCLUDEPATH += \
C:/develop/ode-0.11.1/include
win32:LIBS += \
C:/develop/ode-0.11.1/lib/ReleaseDoubleLib/libode_double.a
2011-08-22T00:29:09+09:00
1313940549
-
Qt/Qt4/OpenGL/バージョンの確認
https://w.atwiki.jp/bambooflow/pages/317.html
*QtでOpenGL:バージョンの確認
#contents
**QGLForamtを使う
Qt上で動作するOpenGLのバージョンを確認するには、
QGLFormat::openGLVersionFlags
を使います。
-[[QGLFormat>>http://doc.qt.nokia.com/latest/qglformat.html]]
#highlight(c){{
#include <QtGui/QApplication>
#include <QtGui/QMessageBox>
#include <QtOpenGL/QGLFormat>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
if ((QGLFormat::openGLVersionFlags() & QGLFormat::OpenGL_Version_1_5) == 0) {
QMessageBox::critical(0, "OpenGL features missing",
"OpenGL version 1.5 or higher is required.\n"
"The program will now exit.");
return -1;
}
// nothing.
return a.exec();
}
}}
**glGetStringで確認
OpenGLの機能であるglGetStringを使います。
#highlight(c){{
#include <QDebug>
void GLWidget::initializeGL()
{
qDebug() << "OpenGL Ver. : " << (const char*)(glGetString(GL_VERSION));
qDebug() << "Shader Ver. : " << (const char*)(glGetString(GL_SHADING_LANGUAGE_VERSION));
qDebug() << "Vendor : " << (const char*)(glGetString(GL_VENDOR));
qDebug() << "GPU : " << (const char*)(glGetString(GL_RENDERER));
}
}}
例)
OpenGL Ver. : 3.3.0
Shader Ver. : 3.30 NVIDIA via Cg compiler
Vendor : NVIDIA Corporation
GPU : GeForce GTX 260/PCI/SSE2
initializeGLで記述しているのは、コンストラクタで使おうとすると何も返ってこないからです。
2011-08-20T18:31:10+09:00
1313832670
-
ODE
https://w.atwiki.jp/bambooflow/pages/29.html
*Open Dynamics Engine
ここではODEについて調べた情報を載せます。
趣味で楽しむ程度です。
&b(){間違った表現や誤った使い方しているかもしれないので注意して読んでください。}
**ODEとは
Open Dynamics Engine (ODE) はフリーの剛体力学をシミュレートするためのCライブラリです。
精度の方はよくないみたいなんですが高速にシミュレーションできるので、ゲーム作りや研究でロボット動作のシミュレーション等を扱うには十分に役立つツールだと思います。
流体力学とかはないので、飛行機を飛ばしたり船を走らせたりのシミュレーションは難しいかもしれません。
&ref(box_stack.png,,width=176,height=144) &ref(buggy.png,,width=176,height=144)
**ODEについて
-準備
--[[インストール0.7>./インストール]] - Linux
--[[インストール0.9>./インストール0.9]] - Linux
--[[インストール0.11>./インストール0.11]] - Linux
--[[インストール>./インストールVC++2008EE]] - VC++2008EE &color(red){&new(2009/11/20)}
--[[インストール>./インストール(Windows+Qt+MinGW)]] - Windows+Qt+MinGW
--[[cmakeでコンパイル>./cmake]] &color(red){&new(2011/1/14)}
-ODEの説明
--[[ODEの概要>./ODEの概要]]
--[[ジオメトリクラス>./ジオメトリ]] &color(red){&new(2009/12/06)}
--[[ODEユーザーズガイド>ODE/manual]] (ODE v0.5のユーザーズガイド部分翻訳)
//--[[トラブル解決>./トラブル解決]]
-基本
--[[はじめの一歩>./はじめの一歩]]
--[[自由落下(CUI)>./自由落下(CUI)]] &color(red){&new(2009/11/18)}
--[[地面との衝突>./地面との衝突]]
--[[物体の固定>./物体の固定]]
--[[物体の固定2>./物体の固定2]] - FixedJoint
--[[質量の設定>./質量の設定]] &color(red){&new(2011/1/15)}
--[[重心の移動>./重心の移動]]
--[[ボールジョイントを使った振り子>./振り子]] &color(red){ &new(2009/12/06)}
--[[ヒンジとトルク>./ヒンジとトルク]] &color(red){&new(2009/12/07)}
--[[スプリングヒンジ>./スプリングヒンジ]] &color(red){&new(2009/12/19)}
--[[スライダーでスプリングダンパー>./スライダーでスプリングダンパー]] &color(red){&new(2009/12/20)}
--[[レイによる距離測定>./レイによる距離測定]] &color(red){&new(2009/12/13)}
-ステップアップ
--[[転がり摩擦>./転がり摩擦]]
--[[ジャイロonテーブル>./ジャイロonテーブル]] &color(red){&new(2009/12/07)}
--[[コマを回す>./コマを回す]]
--[[ポリゴン表示>./ポリゴン]] &color(red){&new(2009/12/02)}
--[[ハイトフィールド>./ハイトフィールド]] &color(red){&new(2009/12/03)}
--[[ライントレーサ>./ライントレーサ]] &color(red){&new(2009/12/14)}
--[[ドミノ倒し>./ドミノ倒し]] &color(red){&new(2011/01/15)}
-実験
--[[歯車モデル>./歯車]] &color(red){&new(2009/12/09)}
--[[gnuplotでリアルタイム描画実験>./gnuplotでリアルタイム描画]] &color(red){&new(2009/12/07)}
--[[アナログ上皿はかり>./アナログ上皿はかり]] &color(red){&new(2009/12/24)}
--[[glutでODE>./glut]] &color(red){&new(2009/11/23)}
//-[[自分用(doxygen)>http://bambooflow.ashigaru.jp/ode/html/index.html]]
//-[[Doxygenマニュアル(v0.10)>http://www7.atpages.jp/bambooflow/doxygen/ode/ode_0_10]]
//-[[Doxygenマニュアル(v0.11)>http://www7.atpages.jp/bambooflow/doxygen/ode/ode_0_11]]
-[[Doxygenマニュアル(v0.11)>http://www7.atpages.jp/bambooflow/doxygen/ode/ode_0_11s]]
-[[Doxygenマニュアル(v0.11.1)>http://www7.atpages.jp/bambooflow/doxygen/ode/ode_0_11_1s]]
検索機能付けました。
**動作環境
以下のような環境で動作する。基本はLinuxの環境。
-Linux
--Vine、Fedora等
--Ubuntu
-Windows
--Visual C++ 2008 Express Edition
--MinGW
--CygWin(v0.9ではGUIがうまく動かなかったりする、v0.10はうまく動いた)
--[[VMWare>linux/VMWare]] (OSをLinuxに変えるのはちょっとという人でディスク容量に余裕がある人の選択)
Windowsへのインストール方法はこのページでは紹介してません。
別のWebサイトを参照してください。
**ダウンロード
現在、ヴァージョン0.11.1まで出てます。
[[ここ>http://sourceforge.net/project/showfiles.php?group_id=24884]]からダウンロードできます。
**ODE外部リンク
***ODE本家
-[[manual(wiki)>>http://opende.sourceforge.net/wiki/index.php/Manual]]
-[[Reference(doxygen)>>http://opende.sourceforge.net/docs/index.html]]
-http://groups.google.com/group/ode-users
-[[IrrODE>>http://www.bulletbyte.de/products.php?sub=irr]]
-[[OgreODE>>http://www.ogre3d.org/wiki/index.php/OgreODE]]
**関連
//以下、文字列"ODE"の検索結果。
//#bf(ODE)
//以下、文字列"Open Dynamics Engine"の検索結果。
//#bf(Open Dynamics Engine)
2011-08-18T23:51:34+09:00
1313679094
-
OpenGL/1.x/ステンシルバッファ
https://w.atwiki.jp/bambooflow/pages/325.html
*ステンシルバッファ
ステンシルバッファについてメモします。
#contents
**概要
ステンシル テストを使うと、
ピクセル単位で描画する/描画しない
ができます。
各ピクセルごとのステンシル値を見て描画するかどうか決定します。
**ステンシルバッファの使い方
-バッファ初期化
glClearStencil(0); // clear to zero
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
-ステンシル テストの有効/無効
glEnable(GL_STENCIL_TEST);
glDisable(GL_STENCIL_TEST);
-テスト方法を設定
void glStencilFunc(
GLenum func, // 比較方法
GLint ref, // 比較する基準値
GLuint mask // マスク値
);
-テスト結果後の動作を設定
void glStencilOp(
GLenum sfail, // ステンシルテストが失敗したときの処理
GLenum dpfail, // デプステストで失敗したときの処理
GLenum dppass // ステンシルテストおよびデプステストがパスしたときの処理
);
***ステンシルバッファに1を書き込む
glStencilFunc( GL_ALWAYS, 1, ~0);
glStencilOp(GL_KEEP,GL_KEEP,GL_REPLACE);
これ以降の描画は、通常描画とともにステンシルバッファに1が書かれます。
つまりステンシル値"1"のタグが付いたピクセルを描画します。
ただし、カラーバッファとデプスバッファにもそのまま描画されてしまいます。
ステンシルバッファのみに書くようにするには、カラーバッファとデプスバッファへの書き込みを無効にします。
glColorMask(GL_FLASE,GL_FALSE,GL_FALSE,GL_FALSE);
glDepthMask(GL_FALSE);
glStencilFunc(GL_EQUAL, 1, ~0);
glStencilOp(GL_KEEP, GL_KEEP, GL_INCR);
ステンシルが"1"のところだけ描画。
描画が行われたらそのピクセルのステンシル値をインクリメント。
glStencilFunc( GL_EQUAL, 0, ~0);
ステンシルが"0"のところだけ描画
2011-08-18T22:35:56+09:00
1313674556
-
OpenGL/1.x/平面投影行列による影生成
https://w.atwiki.jp/bambooflow/pages/326.html
*平面投影行列による影生成(Shadow Matrix)
#contents
**概要
平面投影行列による影生成は、簡易的な影を取得する方法として知られています。
ハードウェア依存が少なく、低スペックな環境でも動きます。
影付けのリアル性を追求しなければ、それっぽく見えると思います。
平面投影行列は、3Dポリゴンを2Dポリゴン(影)に変換する行列です。
3Dポリゴン x 平面投影行列 => 2Dポリゴン
影付けの手順は次のとおりです。
// 地面の描画
drawGround();
// オブジェクト描画
DrawObject();
// オブジェクトの影を描画
glPushMatrix();
glMultiMatrix(shadowMat); // shadowMatは投影行列
drawObject();
glPopMatrix();
当たり前かもしれませんが、投影行列の影付けもオブジェクト描画と同様に描画処理を行います。
**投影行列関数
まずは、投影行列を求める関数を準備します。
DirectXには、D3DXMatrixShadow関数が用意されているようですが、OpenGLにはありません。
なので、変換行列する関数はユーザが準備する必要があります。
投影行列を求めるには、次の2つのパラメータが必要になります。
-光源位置(x,y,z,w)
-平面方程式:ax+by+cz+d=0 (a,b,c,d)
以下に、一般的な投影行列を生成する関数を示します。
#highlight(c){{
voidl perspectiveShadowMatrix(
double m[16], // out: 投影行列
const double light_pos[4], // in : 光源位置
const double plane[4] // in : 平面方程式
)
{
float dot;
dot = plane[0] * light_pos[0]
+ plane[1] * light_pos[1]
+ plane[2] * light_pos[2]
+ plane[3] * light_pos[3];
m[0] = - light_pos[0] * plane[0] + dot;
m[4] = - light_pos[0] * plane[1];
m[4] = - light_pos[0] * plane[2];
m[12] = - light_pos[0] * plane[3];
m[1] = - light_pos[1] * plane[0];
m[5] = - light_pos[1] * plane[1] + dot;
m[9] = - light_pos[1] * plane[2];
m[13] = - light_pos[1] * plane[3];
m[2] = - light_pos[2] * plane[0];
m[6] = - light_pos[2] * plane[1];
m[10] = - light_pos[2] * plane[2] + dot;
m[14] = - light_pos[2] * plane[3];
m[3] = - light_pos[3] * plane[0];
m[7] = - light_pos[3] * plane[1];
m[11] = - light_pos[3] * plane[2];
m[15] = - light_pos[3] * plane[3] + dot;
}
}}
y=0とする平面の場合、平面方程式plane(a,b,c,d)は
plane = (0, 1, 0, 0)
とします。
言い換えると平面方程式の(a,b,c)は平面の法線になります。
不確かですが、dは原点からの平面の距離と捉えることができそうです。
平面方程式は3点の座標から導き出せます。
3点(p1, p2, p3)が接する平面方程式は次のとおりです。
#highlight(c){{
void calculatePlane(float plane[4], float p1[3],float p2[3],float p3[3]){
plane[0] = ((p2[1]-p1[1])*(p3[2]-p1[2]))-((p2[2]-p1[2])*(p3[1]-p1[1]));
plane[1] = ((p2[2]-p1[2])*(p3[0]-p1[0]))-((p2[0]-p1[0])*(p3[2]-p1[2]));
plane[2] = ((p2[0]-p1[0])*(p3[1]-p1[1]))-((p2[1]-p1[1])*(p3[0]-p1[0]));
plane[3] = -(plane[0]*p1[0] + plane[1]*p1[1] + plane[2]*p1[2]);
}
}}
2011-08-18T21:40:45+09:00
1313671245
-
OpenGL/1.x/影行列
https://w.atwiki.jp/bambooflow/pages/204.html
*影行列
#contents
OpenGLにて影を表示する方法はいくつかあるようですが、シンプルな方法としては、影行列(Shadow Matrix)を用いて表示する方法があると思います。
この方法は、現実世界のようにライトを当てて明暗を作るのではなくて、擬似的にグラウンドに影らしきものを表示させるます。
ようは、ライトが当たっている物体を表示させるのとは別に、影ができるであろう位置に影っぽい形の影らしい色のグラウンド平面に変形させた物体を表示させることで、あたかも影があるように見せる方法のほうです。
#ref(shadow_matrix_01.png)
#ref(shadow_matrix_01.cpp)
-記述(影をつける)
#codehighlight(){{
void display()
{
// ・・・
// box
{
float pos[3] = {0.0, 0.0, 2.0};
float sizes[3] = {1.0, 2.0, 0.5 };
glPushMatrix();
glTranslatef(pos[0], pos[1], pos[2]);
glEnable(GL_LIGHTING);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, red);
drawBox( sizes );
glPopMatrix();
#if 1 // shadow
setShadowDrawingMode();
setShadowTransform(pos[0], pos[1], pos[2]);
drawBox( sizes );
glPopMatrix();
#endif
}
// sphere
{
glPushMatrix();
glEnable(GL_LIGHTING);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, green);
glTranslatef(1.0, 3.0, 1.0);
glCallList(theSphere);
glPopMatrix();
#if 1 // shadow
setShadowDrawingMode();
setShadowTransform(1.0,3.0,1.0);
glCallList(theSphere);
glPopMatrix();
#endif
}
// ・・・
}
}}
drawSphere関数で球体を表示させるような場合、影を表示させるときはもう一度drawSphere関数を呼ぶことになります。(処理的に倍)
影に見えるように計算して表示させているので、ソフトウェア・シャドウィングの部類になると思います。
**影表示用関数
次の関数が重要になります。
#codehighlight(){{
void setShadowDrawingMode()
{
const float shadow_intensity = 0.65;
glDisable (GL_LIGHTING);
glDisable (GL_TEXTURE_2D);
glColor3f (
ground_color[0]*shadow_intensity,
ground_color[1]*shadow_intensity,
ground_color[2]*shadow_intensity );
}
void setShadowTransform(float x, float y, float z)
{
GLfloat matrix[16];
for (int i=0; i<16; i++) matrix[i] = 0;
matrix[0]=1;
matrix[5]=1;
matrix[8]=(x-light_pos[0])/(light_pos[2]);
matrix[9]=(y-light_pos[1])/(light_pos[2]);
matrix[15]=1;
glPushMatrix();
glMultMatrixf (matrix);
glTranslatef(x, y, z);
}
}}
setShadowDrawingModeでは、影の色の設定をしています。
地面の色に対して1未満の係数をかけることで、少し暗い(影っぽい)色を作っています。
setShadowTransformでは、グラウンドに対して影に見えるようにマトリックス変換をかけています。
なぜこのような計算式になるかはよくわかりませんが、とにかくこの行列で変換することができます。
**まとめ
今回の場合は、グラウンドはz=0固定で、ライトの位置と物体の位置を基に影を表示させています。
したがって、物体と物体が接近しても物体の上に影が落とすことはできません。
グラウンド以外にも影をつけるのは、ちょっと複雑になりそうです。
あと、グラウンドはテクスチャを張っていない状態なので、テクスチャを張ると色の設定のところが若干変える必要があるようです。
なんにしても、影があることでだいぶ地面との接近がわかりやすくなったと思います。
**参考
-&nolink(http://www.shader.jp/xoops/html/masafumi/directx9/3dtips/d3d14.htm)
-&nolink(http://wiki.livedoor.jp/mikk_ni3_92/d/%BC%C2%C1%A9%CA%D405::%B1ƹ%D4%CE%F3)
-&nolink(http://www.ia.hiof.no/~borres/cgraph/explain/shadow/p-shadow.html)
2011-08-18T19:58:47+09:00
1313665127
-
OpenGL/1.x
https://w.atwiki.jp/bambooflow/pages/275.html
*OpenGL1.x
OpenGL1.x系の処理を記載する。
//-[[光源の設定>./光源の設定]]
-[[立方体の描画>./立方体の描画]]
-[[テクスチャマッピング>./テクスチャマッピング]]
//
-[[Quaternionによる回転>./Quaternionによる回転]]
-[[地面>./ground]]
-[[ポリゴン上の線描画>./ポリゴン上の線描画]]
-[[カメラの設定>./カメラの設定]]
-[[球体の表示>./Sphere]]
-[[ポリゴン面の表と裏>./ポリゴン面の表と裏]]
-[[影行列>./影行列]]
-[[行と列>./行と列]]
-[[ステンシルバッファ>./ステンシルバッファ]]
-[[メモ>./メモ]]
2011-08-18T11:41:06+09:00
1313635266
-
Qt/Qt4/OpenGL/クラス
https://w.atwiki.jp/bambooflow/pages/316.html
*QtでOpenGL:クラス
QtでOpenGLを扱うためのクラスを記載ます。
#contents
***[[QGLWidget>>http://doc.qt.nokia.com/latest/qglwidget.htm]]
QGLWidgetは、OpenGLのキャンパスの役割をなします。
#highlight(c++){{
#include <QtOpenGL>
class GLWidget : public QGLWidget
{
Q_OBJECT
public:
GLWidget(QWidget *parent = 0);
~GLWidget();
protected:
virtual void initializeGL();
virtual void resizeGL( int w, int h );
virtual void paintGL();
};
}}
***[[QGLShaderProgram>>http://doc.qt.nokia.com/latest/qglshaderprogram.html]]
プログラマブルシェーダを利用する場合に必要になります。
このクラスを用いるとシェーダをオブジェクトとして扱うことになります。
#include <QtOpenGL/QGLShaderProgram>
-使い方
#highlight(c++){{
QGLShaderProgram *program;
program = new QGLShaderProgram();
// Compiling vertex shader
if (!program->addShaderFromSourceFile(QGLShader::Vertex, ":/vshader.glsl"))
close();
// Compiling fragment shader
if (!program->addShaderFromSourceFile(QGLShader::Fragment, ":/fshader.glsl"))
close();
// Linking shader pipeline
if (!program->link())
close();
// Binding shader pipeline for use
if (!program->bind())
close();
}}
***[[QGLFunctions>>http://doc.qt.nokia.com/4.8-snapshot/qglfunctions.html]](Qt4.8)
OpenGL/ES 2.0 APIが揃っています。
VBOなんかはこれを使う必要があるかもしれません。
#include <QtOpenGL/QGLFunctions>
-glActiveTexture
-glGenBuffers
-glGenFramebuffers
-glGenRenderbuffers
-glBindBuffer
-glBindFramebuffer
-glBindRenderbuffer
-glBufferData
-glBufferSubData
-glVertexAttrib
-glUniform
-glVertexAttribPointer
など(ここに記載したのは一部です)
ダイレクトに継承して使う方法を記載します。
#highlight(c++){{
class MyGLWidget : public QGLWidget, protected QGLFunctions
{
Q_OBJECT
public:
MyGLWidget(QWidget *parent = 0) : QGLWidget(parent) {}
protected:
void initializeGL();
void paintGL();
};
void MyGLWidget::initializeGL()
{
initializeGLFunctions();
}
}}
**便利クラス
***[[QVector2D>>http://doc.qt.nokia.com/latest/qvector2d.html]]
#include <QVector2D>
***[[QVector3D>>http://doc.qt.nokia.com/latest/qvector3d.html]]
#include <QVector3D>
***[[QMatrix4x4>>http://doc.qt.nokia.com/latest/qmatrix4x4.html]]
4x4マトリックスを扱うクラス。
-setToIdentity
-scale
-rotate
-translate
-ortho
-frustum
-perspective
-lookAt
といったGLSLに役立つ大抵の機能が備わっています。
#include <QMatrix4x4>
-使い方
#highlight(c){{
void GLWidget::resizeGL(int w, int h)
{
glViewport(0, 0, w, h);
//プロジェクション・マトリックス設定
glMatrixMode (GL_PROJECTION);
glLoadIdentity();
QMatrix4x4 m;
m.perspective(30, (qreal)w / (qreal)h, 1.0f, 100.0f);
glMultMatrixd(m.data());
//gluPerspective(30.0, (double)w / (double)h, 1.0, 100.0); // ※
}
}}
#highlight(c){{
//モデル・ビュー・マトリックス設定
glMatrixMode (GL_MODELVIEW);
glLoadIdentity();
//カメラ設定
QMatrix4x4 m;
m.lookAt(QVector3D(3.0, 4.0, 5.0),
QVector3D(0.0, 0.0, 0.0),
QVector3D(0.0, 1.0, 0.0) );
glMultMatrixd(m.data());
//gluLookAt(3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); // ※
}}
&bold(){※注意} : glu*はQtのバージョンによって使えなくなる可能性があります
#highlight(c++){{
QQuaternion rotation;
QMatrix4x4 projection;
projection.setToIdentity();
projection.perspective(fov, w/h, zNear, zFar);
QMatrix4x4 matrix;
matrix.translate(0.0, 0.0, -5.0);
matrix.rotate(rotation);
// Set modelview-projection matrix
program->setUniformValue("mvp_matrix", projection * matrix);
}}
***[[QQuaternion>>http://doc.qt.nokia.com/latest/qquaternion.html]]
Quaternionを扱うクラス
#include <QQuaternion>
-使い方
#highlight(c++){{
QVector3D rotationAxis;
qreal angularSpeed;
QQuaternion rotation;
rotation = QQuaternion::fromAxisAndAngle(rotationAxis, angularSpeed) * rotation;
}}
***[[QImage>>http://doc.qt.nokia.com/latest/qimage.html]]
画像データを扱うクラス。
#include <QImage>
-使い方
#highlight(c){{
GLuint texture = bindTexture(QImage(":/image.jpg"));
}}
#highlight(c){{
GLuint texture);
QImage img("image.jpg");
QImage gl_img = QGLWidget::convertToGLFormat(img);
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA,
gl_img.width(),
gl_img.height(),
0, GL_RGBA, GL_UNSIGNED_BYTE,
gl_img.bits() );
}}
**めも
GLSL環境は、Qt v4.6あたりからよくなってきています。
v4.8あたりから使い物になってくるかもしれません。(たぶん)
**参考
-http://doc.qt.nokia.com/4.8-snapshot/opengl-cube.html
2011-08-17T17:46:26+09:00
1313570786
-
Qt/Qt4/OpenGL
https://w.atwiki.jp/bambooflow/pages/318.html
*QtでOpenGL
ここでは、QtでOpenGLを描画する方法を記載します。
QtのOpenGLに対するサポート状況がよくなってきたので、まとめていきます。
まだコンテンツの順番はバラバラです。
ご容赦ください。
-[[CreatorでOpenGL>Qt/Qt4/Creator/OpenGLのはじめ]]
-[[CreatorでOpenGL(v4.7対応)>Qt/Qt4/Creator/OpenGLのはじめ(v4.7対応)]]
#ls2
2011-08-17T17:41:51+09:00
1313570511