2015-10-15 5 views
1

Я надеялся отобразить «X» в (50,0,0) с помощью DirectXTK и после статьи о биллинге. однако, похоже, у меня это не так. Может ли кто-нибудь помочь мне.DirectXTK spriteFont в 3D-пространстве

XMVECTOR textPosition = XMVectorSet(50, 0, 0, 0); 
      unique_ptr<BasicEffect> basicEffect(new BasicEffect(m_pd3dDevice)); 
      unique_ptr<CommonStates> commonStates(new CommonStates(m_pd3dDevice)); 
      /*basicEffect->SetWorld(XMMatrixScaling(1,-1, 1) * XMMatrixTranslationFromVector(textPosition));*/ 
/*   basicEffect->SetWorld(XMMatrixTranslationFromVector(textPosition)); 
      basicEffect->SetView(m_View);*/ 
      basicEffect->SetProjection(m_Projection); 
      basicEffect->SetTextureEnabled(true); 
      basicEffect->SetVertexColorEnabled(true); 
      basicEffect->Apply(m_pImmediateContext); 
      wstring message = L"X"; 
      XMFLOAT2 textOrigin; 
      XMStoreFloat2(&textOrigin, m_font->MeasureString(message.c_str())); 
      const float textSize = 1.0f; 
      m_spriteBatch->Begin(SpriteSortMode_Deferred, nullptr, nullptr, commonStates->DepthRead(), commonStates->CullNone()); 
      m_font->DrawString(m_spriteBatch.get(), message.c_str(), XMFLOAT2(0, 0), Colors::White, 0, textOrigin, XMFLOAT2(textSize, textSize), SpriteEffects_None, 0.0f); 

      m_spriteBatch->End(); 

это представляется перспективным

XMVECTOR textPosition = XMVectorSet(50, 0, 0, 0); 
wstring message = L"X"; 
textPosition = XMVector3Transform(textPosition, m_View); 
textPosition = XMVector3Transform(textPosition, m_Projection); 
XMFLOAT3 pos; 
XMStoreFloat3(&pos, textPosition); 
pos.x /= pos.z; 
pos.y /= pos.z; 
pos.x = (pos.x + 1.0) * GetViewPort().Width/2.0; 
pos.y = (-pos.y + 1.0) * GetViewPort().Height/2.0; 


m_spriteBatch->Begin(); 
m_font->DrawString(m_spriteBatch.get(), message.c_str(), XMFLOAT2(pos.x, pos.y), Colors::White, 0.0f, XMFLOAT2(0, 0), XMFLOAT2(0.5f, 0.5), SpriteEffects_None);  
m_spriteBatch->End(); 

ответ

0

Going следующим я думаю.

XMVECTOR mp = XMVector4Transform(textPosition, m_World); 
XMVECTOR pt = XMVector3Project(mp, 0, 0, GetViewPort().Width, GetViewPort().Height, 0, 1, m_Projection, m_View, m_World); 
XMFLOAT3 pos; 
XMStoreFloat3(&pos, pt); 


m_spriteBatch->Begin(); 
m_font->DrawString(m_spriteBatch.get(), message.c_str(), XMFLOAT2(pos.x, pos.y), Colors::LightGreen, 0.0f, XMFLOAT2(0, 0), XMFLOAT2(0.6f, 0.6)); 
m_spriteBatch->End(); 
+0

с DirectX Tool Kit в '' SpriteBatch'' вы можете «отключить» окончательное масштабирование окна просмотра с помощью '' SetRotation (DXGI_MODE_ROTATION_UNSPECIFIED), '' Вы можете обеспечить полное преобразование в качестве необязательного параметра transformationMatrix на '' Begin''. –