本文整理汇总了C++中Matrix34::multiply方法的典型用法代码示例。如果您正苦于以下问题:C++ Matrix34::multiply方法的具体用法?C++ Matrix34::multiply怎么用?C++ Matrix34::multiply使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Matrix34
的用法示例。
在下文中一共展示了Matrix34::multiply方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: update
void Bullet::update( const Vector3& enemyPos ){
//敵の方に向ける。
Vector3 dir;
Vector3 p = *mModel->position();
Vector3 a = *mModel->angle();
dir.setSub( enemyPos, *mModel->position() ); //自分から敵へ
//Y軸角度はatan2( x, z )。
double ty = atan2( dir.x, dir.z );
//180度以上差があれば+-360度して逆回し
if ( ty - a.y > 180.0 ){
ty -= 360.0;
}else if ( a.y - ty > 180.0 ){
ty += 360.0;
}
//X軸角度はY/(X,Z)。
double zxLength = sqrt( dir.x * dir.x + dir.z * dir.z );
double tx = atan2( dir.y, zxLength );
//X軸角度はそもそも範囲が(-90,90)で180度以上離れることはない。そのままで良い。
double hx = mHomingX; //別名
double hy = mHomingY;
//ホーミング範囲内ならそのものに
if ( tx - a.x < hx && a.x - tx < hx ){
a.x = tx;
}else if ( tx < a.x ){
a.x -= hx;
}else{
a.x += hx;
}
if ( ty - a.y < hy && a.y - ty < hy ){
a.y = ty;
}else if ( ty < a.y ){
a.y -= hy;
}else{
a.y += hy;
}
//おもろいのでz回転つけとくか
a.z += 2.0;
//角度更新
mModel->setAngle( a );
//位置はこの方向の回転行列で(0,0,1)を変換して足してやる
Vector3 v( 0.0, 0.0, mSpeed );
Matrix34 m;
m.setRotationY( a.y );
m.rotateX( -a.x );
m.multiply( &v, v );
p += v;
mModel->setPosition( p );
++mCount;
if ( mCount >= mLife ){
mCount = -1;
}
}
示例2: draw
void Batch::draw(
const Matrix44& pvm,
const Matrix34& wm,
const Vector3& lightVector,
const Vector3& lightColor,
const Vector3& ambient,
const Vector3& diffuseColor ) const {
Framework f = Framework::instance();
//テクスチャセット
if ( mTexture ){
mTexture->set();
}else{
f.setTexture( 0 ); //空のテクスチャ
}
//ブレンドモードセット
f.setBlendMode( mBlendMode );
//ブレンドモードによってZバッファ書き込みのフラグをOn,Off
if ( mBlendMode == Framework::BLEND_OPAQUE ){
f.enableDepthWrite( true );
}else{
f.enableDepthWrite( false );
}
//ZテストはいつもOn
f.enableDepthTest( true );
//頂点をワールドに変換
int vertexNumber = mVertexBuffer->size();
Vector3* wv = new Vector3[ vertexNumber ];
for ( int i = 0;i < vertexNumber; ++i ){
wm.multiply( &wv[ i ], *mVertexBuffer->position( i ) );
}
//頂点を最終変換
double* fv = new double[ vertexNumber * 4 ]; //final vertices
for ( int i = 0;i < vertexNumber; ++i ){
pvm.multiply( &fv[ i * 4 ], wv[ i ] );
}
//法線をワールド座標に変換する。本当はワールド行列ではいけない。
Matrix34 wmNormal = wm; //ワールド行列から移動を抜いたもの
wmNormal.m03 = wmNormal.m13 = wmNormal.m23 = 0.0;
//前もって頂点単位で色を決めておく
unsigned* colors = new unsigned[ vertexNumber ];
for ( int i = 0; i < vertexNumber; ++i ){
Vector3 wm; //world normal
wmNormal.multiply( &wm, mNormals[ i ] ); //ワールド座標に変換
wm *= 1.f / wm.length(); //長さを1にして
colors[ i ] = light( lightVector, lightColor, ambient, diffuseColor, wm );
}
int triangleNumber = mIndexBuffer->size() / 3;
for ( int i = 0; i < triangleNumber; ++i ){
unsigned i0 = mIndexBuffer->index( i * 3 + 0 );
unsigned i1 = mIndexBuffer->index( i * 3 + 1 );
unsigned i2 = mIndexBuffer->index( i * 3 + 2 );
f.drawTriangle3DH(
&fv[ i0 * 4 ],
&fv[ i1 * 4 ],
&fv[ i2 * 4 ],
&mVertexBuffer->uv( i0 )->x,
&mVertexBuffer->uv( i1 )->x,
&mVertexBuffer->uv( i2 )->x,
colors[ i0 ],
colors[ i1 ],
colors[ i2 ] );
}
SAFE_DELETE_ARRAY( wv );
SAFE_DELETE_ARRAY( fv );
SAFE_DELETE_ARRAY( colors );
}