Matrix& Matrix::SetRotate(const Vector& vec, float angle)
{
    if (vec.Y() == 0 && vec.Z() == 0) {
        return SetRotateX(angle * sign(vec.X()));
    } else if (vec.X() == 0 && vec.Z() == 0) {
        return SetRotateY(angle * sign(vec.Y()));
    } else if (vec.X() == 0 && vec.Y() == 0) {
        return SetRotateZ(angle * sign(vec.Z()));
    } else {
        Vector vecUnit = vec.Normalize();

        float x = vecUnit.X();
        float y = vecUnit.Y();
        float z = vecUnit.Z();

        float c = cos(angle);
        float s = sin(angle);

        float x2 = x * x;
        float y2 = y * y;
        float z2 = z * z;
        float xy = x * y * (1 - c);
        float yz = y * z * (1 - c);
        float zx = z * x * (1 - c);

        m_m[0][0] = x2 + c * (1 - x2); m_m[0][1] =        xy - z * s; m_m[0][2] =        zx + y * s; m_m[0][3] = 0;
        m_m[1][0] =        xy + z * s; m_m[1][1] = y2 + c * (1 - y2); m_m[1][2] =        yz - x * s; m_m[1][3] = 0;
        m_m[2][0] =        zx - y * s; m_m[2][1] =        yz + x * s; m_m[2][2] = z2 + c * (1 - z2); m_m[2][3] = 0;
        m_m[3][0] =                 0; m_m[3][1] =                 0; m_m[3][2] =                 0; m_m[3][3] = 1;
    }

    m_type = TransformRotate;

    return *this;
}
예제 #2
0
파일: XOrder.cpp 프로젝트: xahgo/tama
/**
 @brief 대상이 객체가 아닌 그냥 좌표일 경우.
*/
bool XOrderIndicate::CreateSpr( const XE::VEC2& vPos, XWnd *pRoot, const XE::VEC2& sizeTarget )
{
	_tstring strSpr = _T( "ui_arrow.spr" );
	ID idAct = 1;
	if( !m_spProp->m_strSpr.empty() ) {
		strSpr = m_spProp->m_strSpr;
		idAct = m_spProp->m_idAct;
		if( idAct == 0 )
			idAct = 1;
	}
	if( m_spProp->m_typeEnd == xFIN_END_ORDER ) {
		// 단지 가리키기만 하는 화살표
		idAct = 3;
	}
	if( pRoot == nullptr )
		return false;
	XWnd *pExist = pRoot->Findf( "%s.indicate.%d",
							GetpSeq()->GetspProp()->m_strIdentifier.c_str(),
							GetidxOrder() );
	if( pExist == nullptr ) {
		float dAngPlace = m_spProp->m_dAng;
		if( dAngPlace >= 0 )
			dAngPlace += 180.f;
		auto pWndSpr = new XWndSprTrace( strSpr, idAct, vPos, dAngPlace, sizeTarget ); 
		pWndSpr->SetstrIdentifierf( "%s.indicate.%d",
								GetpSeq()->GetspProp()->m_strIdentifier.c_str(),
								GetidxOrder() );
		pWndSpr->SetbActive( false );
		m_aryIdsWnd.push_back( pWndSpr->GetstrIdentifier() );
		if( m_spProp->m_dAng >= 0 )
		pWndSpr->SetRotateZ( m_spProp->m_dAng );
		pRoot->Add( pWndSpr );
		return true;
	}
	return false;
}