示例#1
0
void Transformation::product(const Transformation& a,const Transformation& b)
{
	if (a.isIdentity())
    {
        *this = b;
        return;
    }

    if (b.isIdentity())
    {
        *this = a;
        return;
    }

    if (a.isUniformScales())
	{
		_rot = a.getRotate()*b.getRotate();

		_trans = ((a.getRotate()	* b.getTranslate()) 
			+ a.getTranslate()) * a.getUniformScale();

		if ( b.isUniformScales())
			setUniformScale(a.getUniformScale()*b.getUniformScale());
		else
			setScale(b.getScale()*a.getUniformScale());

		return;
	}
    // In all remaining cases, the matrix cannot be written as R*S*X+T.
    Matrix3 mA;
	Vector3 aS = a.getScale();
	mA[0][0] = mA[0][0] * aS.x;
	mA[1][1] = mA[1][1] * aS.y;
	mA[2][2] = mA[2][2] * aS.z;

    Matrix3 mB;
	Vector3 bS = b.getScale();
	mB[0][0] = mB[0][0] * bS.x;
	mB[1][1] = mB[1][1] * bS.y;
	mB[2][2] = mB[2][2] * bS.z;
	
    setRotate(mA*mB);
    setTranslate(mA*b.getTranslate()+a.getTranslate());

}
示例#2
0
文件: Stream.cpp 项目: hhsaez/crimild
void Stream::write( const Transformation &t )
{
	write( t.getTranslate() );
	write( t.getRotate() );
	write( t.getScale() );
}