XNAを使用して、ユーザーが画面にテクスチャを配置できるWindowsツールを作成しています。
テクスチャの描画に使用されるSpriteBatchに「カメラ」を使用しています。例:
Matrix matrixForSpriteBatch = Matrix.CreateTranslation(
-_cameraPosition.X, -_cameraPosition.Y, 0.0f) *
Matrix.CreateRotationZ(_rotation) *
Matrix.CreateScale(_scale) *
Matrix.CreateTranslation(
GraphicsDevice.Viewport.Width / 2,
GraphicsDevice.Viewport.Height / 2, 0.0f);
これは正常に機能しています。ユーザーはキャンバスにテクスチャをドロップし、移動、回転、サイズ変更できます。また、カメラを動かしてより多くのものを見ることができます。
次に、ユーザーがクリックしてポリゴンのポイントを定義できるようにします。次に、これらのポイントが私のDrawPolygonFilled
メソッドに送信されます。
public void DrawPolygonFilled( SpriteBatch spriteBatch,
Vector2[ ] worldPoints,
Color color )
{
Matrix matrixForVertices =
Matrix.CreateTranslation( _cameraPosition.X, -_cameraPosition.Y, 0.0f ) *
Matrix.CreateRotationZ( -rotation ) *
Matrix.CreateScale( camera.Scale ) ;
Vector2[] transformedPoints = worldPoints.Transform( matrixForVertices ) ;
var vertices = new VertexPositionColor[ transformedPoints.Length ] ;
for (int i = 0; i < transformedPoints.Length; i++)
{
vertices[ i ] = new VertexPositionColor( new Vector3( transformedPoints[ i ], 0 ), color ) ;
}
Vector2[ ] outputVertices ;
short[ ] outputIndicies ;
Vertices.Triangulate( transformedPoints, Vertices.WindingOrder.Clockwise, out outputVertices, out outputIndicies ) ;
if (outputIndicies.Length > 0)
{
foreach( EffectPass pass in _basicEffect.CurrentTechnique.Passes )
{
pass.Apply( ) ;
spriteBatch.GraphicsDevice.DrawUserIndexedPrimitives<VertexPositionColor>(
Microsoft.Xna.Framework.Graphics.PrimitiveType.TriangleList,
vertices,
0,
vertices.Length,
outputIndicies,
0,
outputIndicies.Length /3 ) ;
}
}
}
クライアントスペースBasicEffect
は左上が0,0、右下が1-1であるため、これは何も表示していません。だから私はこれをに追加しましたBasicEffect
:
_basicEffect = new BasicEffect( GraphicsDevice )
{
VertexColorEnabled = true
} ;
_viewMatrix = Matrix.CreateLookAt(
new Vector3( 0, 0, GraphicsDevice.Viewport.Width ),
Vector3.Zero,
Vector3.Up
) ;
_projectionMatrix = Matrix.CreateOrthographic(
GraphicsDevice.Viewport.Width,
GraphicsDevice.Viewport.Height,
.1f,
GraphicsDevice.Viewport.Width ) ;
_basicEffect.Projection = _projectionMatrix ;
_basicEffect.View = _viewMatrix ;
これにより、ポリゴンは表示されますが、上下が逆になります。また、ポリゴンの位置が変わると(ユーザーはマウスでポリゴンをドラッグできます)、ユーザーがマウスを下に動かすとポリゴンが上がります!
マトリックスとジオメトリに関しては、少し厚みがあります(ただし、厚みを薄くしようとしています)。何か不足していますか?に変更Down
してみUp
ましたCreateLookAt
が、まだ正しく描画されず、ユーザーがマウスを左に動かすと、ポリゴンが右に移動します。
以下は、0,0にポリゴンを描画するときのスクリーンショットです。
白いパス上のポイントは、ユーザーがクリックした場所(およびSpriteBatchで描画された場所)であり、黄色のポリゴンは上記の私の方法で描画されたものです。
次に、ポリゴンを20,20に移動したときに何が起こるかを示す別のスクリーンショットを示します。
白いパスは20、20から始まりますが、塗りつぶされたポリゴンは20、20から始まり、逆さまに描かれます。
これはSpriteBatch
(白いパスを描くために)が使用する行列とBasicEffect
(塗りつぶされた多角形を描くために)が使用する行列の間の行列の問題だと思います。