Tôi đang viết một công cụ Windows sử dụng XNA và cho phép người dùng đặt họa tiết trên màn hình.
Tôi đang sử dụng 'máy ảnh' cho SpriteBatch được sử dụng để vẽ họa tiết, ví dụ:
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);
Điều này đang hoạt động tốt - người dùng có thể thả một kết cấu vào khung vẽ và di chuyển, xoay và kích thước nó. Họ cũng có thể di chuyển camera xung quanh để xem nhiều thứ hơn.
Những gì tôi muốn làm bây giờ là cho phép người dùng nhấp xung quanh để xác định các điểm của đa giác. Những điểm này sau đó được gửi đến DrawPolygonFilled
phương thức của tôi :
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 ) ;
}
}
}
Điều này không hiển thị bất cứ điều gì vì không gian máy khách cho BasicEffect
0,0 ở phía trên bên trái và 1-1 ở dưới cùng bên phải. Vì vậy, tôi đã thêm điều này vào 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 ;
Với điều này, đa giác được hiển thị nhưng nó lộn ngược. Ngoài ra, khi vị trí của đa giác thay đổi (người dùng có thể kéo đa giác xung quanh bằng chuột), đa giác sẽ tăng lên khi người dùng di chuyển chuột xuống!
Tôi hơi dày (nhưng cố gắng để trở nên ít dày hơn) khi nói đến ma trận và hình học. Tui bỏ lỡ điều gì vậy? Tôi đã thử thay đổi Down
thành Up
trong CreateLookAt
nhưng nó vẫn không vẽ chính xác và bây giờ khi người dùng chuyển sang trái, thì đa giác sẽ chuyển sang phải!
Đây là ảnh chụp màn hình khi vẽ đa giác ở 0,0:
Các điểm trên đường dẫn màu trắng là nơi người dùng nhấp vào (và được vẽ bằng SpriteBatch) và đa giác màu vàng là những gì được vẽ theo phương pháp của tôi ở trên.
Đây là một ảnh chụp màn hình khác cho thấy những gì xảy ra khi tôi di chuyển đa giác đến 20,20:
Đường dẫn màu trắng được vẽ bắt đầu từ 20,20, nhưng đa giác được lấp đầy bắt đầu từ 20, -20 và được vẽ lộn ngược
Tôi nghĩ rằng đây là một vấn đề ma trận giữa ma trận được sử dụng bởi SpriteBatch
(để vẽ các đường dẫn màu trắng) và ma trận được sử dụng bởi BasicEffect
(để vẽ đa giác đầy).