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; }
/** @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; }