本文整理汇总了C++中Matrix34::setViewTransform方法的典型用法代码示例。如果您正苦于以下问题:C++ Matrix34::setViewTransform方法的具体用法?C++ Matrix34::setViewTransform怎么用?C++ Matrix34::setViewTransform使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Matrix34
的用法示例。
在下文中一共展示了Matrix34::setViewTransform方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: update
void Framework::update(){
WindowCreator wc = WindowCreator::instance();
if ( gFirst ){
const char* filename = wc.commandLineString();
if ( filename && filename[ 0 ] != '\0' ){
load( filename );
}
gFirst = false;
}else{
//ドラッグアンドドロップを処理する
int dropN = wc.droppedItemNumber();
if ( dropN > 0 ){
const char* filename = wc.droppedItem( 0 ); //0番以外無視
load( filename );
wc.clearDroppedItem(); //これを呼ぶとfilenameもこわれるので最後に。
}
}
//カメラ入力反映
Input::Manager im = Input::Manager::instance();
Input::Mouse mouse = im.mouse();
Input::Keyboard keyboard = im.keyboard();
if ( mouse.isOn( Input::Mouse::BUTTON_MIDDLE ) ){
Graphics::Manager().captureScreen( "capture.tga" );
}
//ビュー行列を作ろう
Vector3 eyePosition = gEyeTarget;
eyePosition.z += gEyeDistance;
Matrix34 rm;
rm.setRotationY( gAngleY );
rm.rotateX( gAngleX );
Vector3 tv( 0.f, 0.f, 1.f );
rm.mul( &tv, tv );
eyePosition.setMadd( gEyeTarget, tv, gEyeDistance );
Matrix34 zrm;
zrm.setRotationZ( gAngleZ );
Vector3 up( 0.f, 1.f, 0.f );
zrm.mul( &up, up );
Matrix34 vm;
vm.setViewTransform( eyePosition, gEyeTarget, up );
if ( gContainer ){
float x = static_cast< float >( mouse.velocityX() );
float y = static_cast< float >( mouse.velocityY() );
if ( mouse.isOn( Input::Mouse::BUTTON_LEFT ) && mouse.isOn( Input::Mouse::BUTTON_RIGHT ) ){ //両ボタンでZ回転
gAngleZ -= 0.2f * x;
gAngleZ -= 0.2f * y;
}else if ( mouse.isOn( Input::Mouse::BUTTON_LEFT ) ){ //左ボタン回転
gAngleX -= 0.2f * y;
if ( gAngleX > 89.9f ){
gAngleX = 89.9f;
}else if ( gAngleX < -89.9f ){
gAngleX = -89.9f;
}
gAngleY -= 0.5f * x;
}else if ( mouse.isOn( Input::Mouse::BUTTON_RIGHT ) ){ //右ボタン、注視点移動
Vector3 xv( vm.m00, vm.m01, vm.m02 );
xv *= x;
Vector3 yv( vm.m10, vm.m11, vm.m12 );
yv *= y;
gEyeTarget.madd( xv, -0.003f * gEyeDistance );
gEyeTarget.madd( yv, 0.003f * gEyeDistance );
}
int w = mouse.wheel();
if ( w < 0 ){
gEyeDistance *= 0.9f;
}else if ( w > 0 ){
gEyeDistance *= 1.1f;
}
}
//透視変換行列
Matrix44 pm;
pm.setPerspectiveTransform(
60.f,
static_cast< float >( width() ),
static_cast< float >( height() ),
gEyeDistance * 0.01f, gEyeDistance * 10.f );
//次にPVを作る
pm *= vm;
if ( keyboard.isOn( 'G' ) ){
gAngleX = gAngleY = gAngleZ = 0.f;
gEyeTarget = 0.f;
}
//ライトでもうごかそか
Graphics::Manager gm = Graphics::Manager::instance();
gm.setProjectionViewMatrix( pm );
gm.setLightingMode( LIGHTING_PER_PIXEL );
gm.enableDepthTest( true );
gm.enableDepthWrite( true );
gm.setLightColor( 0, Vector3( 1.f, 1.f, 1.f ) ); //白
gm.setLightColor( 1, Vector3( 1.f, 0.7f, 0.7f ) ); //赤
gm.setLightColor( 2, Vector3( 0.7f, 1.f, 0.7f ) ); //緑
gm.setLightColor( 3, Vector3( 0.7f, 0.7f, 1.f ) ); //青
gm.setAmbientColor( Vector3( 0.2f, 0.2f, 0.2f ) );
gm.setEyePosition( eyePosition );
float t = gEyeDistance * 0.4f;
//.........这里部分代码省略.........
示例2: update
//.........这里部分代码省略.........
(4)に(3)を代入してやる。
p1 - p0 = a(t1^2- t0^2) + (v-2a*t0)(t1 - t0)
がんばって展開する。
p1 - p0 = a( t1^2 - t0^2 - 2*t0*t1 + 2*t0^2 ) + v(t1-t0)
aで整理する
a( t0^2 - 2*t0*t1 + t1^2 ) = (p1-p0) - v(t1-t0)
ここでaの係数は(t0-t1)^2に因数分解できる。
aについて解けて、
a = ((p1-p0) - v(t1-t0)) / ( t0-t1 )^2 ...(5)
後は(3)を使ってbが出るし、(0)を使ってcも出る。
*/
Vector3 v( 0.0, 0.0, 0.0 ); //第一区間の始点の傾きが0としようか。3つ計算するのでベクタ。
//以下XYZで別々の計算をするが、見やすいようにベクタクラスの計算関数は使わない。要素毎計算で行く。
for ( int i = 0; i < N-1; ++i ){ //点の数がNなんだから区間の数はN-1
//見やすいように定数を作る。
Vector3 p0 = gPoints[ i ];
Vector3 p1 = gPoints[ i + 1 ];
double t0 = gTimes[ i ];
double t02 = t0 * t0;
double t1 = gTimes[ i + 1 ];
double t10 = t1 - t0;
double t102 = t10 * t10;
Vector3 a,b,c; //xyzで計算するから全部ベクタ
//まずaを求める。
a.x = ( ( p1.x - p0.x ) - v.x*t10 ) / t102;
a.y = ( ( p1.y - p0.y ) - v.y*t10 ) / t102;
a.z = ( ( p1.z - p0.z ) - v.z*t10 ) / t102;
//次がb
b.x = v.x - 2.0 * a.x * t0;
b.y = v.y - 2.0 * a.y * t0;
b.z = v.z - 2.0 * a.z * t0;
//最後にc
c.x = p0.x - a.x*t02 - b.x*t0;
c.y = p0.y - a.y*t02 - b.y*t0;
c.z = p0.z - a.z*t02 - b.z*t0;
//式を保存
gEquations[ i ][ 0 ] = a;
gEquations[ i ][ 1 ] = b;
gEquations[ i ][ 2 ] = c;
//終点の傾きを計算
v.x = 2.0 * a.x * t1 + b.x;
v.y = 2.0 * a.y * t1 + b.y;
v.z = 2.0 * a.z * t1 + b.z;
}
}
//ループ処理する。
double period = gTimes[ N - 1 ];
double quot = gT / period;
int quotInt = static_cast< int >( quot );
gT -= static_cast< double >( quotInt ) * period;
//区間を検索
int last = 0;
for ( int i = 0; i < N; ++i ){
if ( gTimes[ i ] > gT ){
break;
}
last = i;
}
//式にぶちこんで値を出す
Vector3 p;
Vector3 a = gEquations[ last ][ 0 ];
Vector3 b = gEquations[ last ][ 1 ];
Vector3 c = gEquations[ last ][ 2 ];
Vector3 p0 = gPoints[ last ];
Vector3 p1 = gPoints[ last + 1 ];
p.x = ( ( a.x * gT ) + b.x ) * gT + c.x;
p.y = ( ( a.y * gT ) + b.y ) * gT + c.y;
p.z = ( ( a.z * gT ) + b.z ) * gT + c.z;
//値が決まった。モデルにセット
gModel->setPosition( p );
Matrix44 pm;
pm.setPerspectiveTransform( 45.0, width(), height(), 1.0, 10000.0 );
Matrix34 vm;
vm.setViewTransform( Vector3( 0.0, 30.0, 30.0 ), Vector3( 0.0, 0.0, 0.0 ) );
pm *= vm;
gModel->draw( pm, Vector3( 0.0, 1.0, 0.0 ), Vector3( 1.0, 1.0, 1.0 ), Vector3( 0.2, 0.2, 0.2 ) );
gT += 1.0;
if ( isEndRequested() ){
SAFE_DELETE( gModel );
SAFE_DELETE( gDatabase );
}
}