【问题标题】:MonoGame VertexPositionColor draws in incorrect placeMonoGame VertexPositionColor 在不正确的位置绘制
【发布时间】:2020-11-01 06:31:34
【问题描述】:

我正在尝试为 monogame 创建一个渲染库,目前正在绘制 2D 多边形。但是,这些职位没有任何意义。不知何故,在 (0, 0, 0)、(100. 0, 0)、(0, 100, 0) 和 (100, 100, 0) 处绘制它们不会到达左上角坐标 (0, 0) )。我该如何解决这个问题?

我的代码:

 BasicEffect basicEffect = new BasicEffect(GraphicsDevice);  
 VertexPositionColor[] vert = new VertexPositionColor[4];  
 vert[0].Position = new Vector3(0, 0, 0);  
 vert[1].Position = new Vector3(100, 0, 0);  
 vert[2].Position = new Vector3(0, 100, 0);  
 vert[3].Position = new Vector3(100, 100, 0); 
 short[] ind = new short[6];  
 ind[0] = 0;  
 ind[1] = 2;  
 ind[2] = 1;  
 ind[3] = 1;  
 ind[4] = 2;  
 ind[5] = 3;  
 foreach (EffectPass effectPass in basicEffect.CurrentTechnique.Passes)   
 {  
     effectPass.Apply();  
     GraphicsDevice.DrawUserIndexedPrimitives<VertexPositionColor>(  
     PrimitiveType.TriangleList, vert, 0, vert.Length, ind, 0, ind.Length / 3);

}

结果:https://imgur.com/GkyqmlY

【问题讨论】:

    标签: c# xna monogame


    【解决方案1】:

    MonoGame 对 2D 和 3D 坐标系使用不同的原点。在 2D 中,(0, 0) 是左上角,Y 向屏幕底部增加。在 3D 中,(0,0,0) 是屏幕的中心,坐标网格的工作方式与数学中的工作方式非常相似 - 想想数学中的 4 个象限,如果你“压平”z -轴。

    您正在第一象限中绘图。如果您希望绘图基于左上角,您需要将顶点平移 -1/2 视口宽度和 +1/ 2 你的视口高度。

    【讨论】:

    • 谢谢!单位长度是否仍然相同? (例如:3D 中的 x 坐标加 1 是否等同于 2D 中的 x 坐标加 1?)
    • 不完全是。通常,您会使用具有 3D 功能的 相机,这可以显着改变您的形状的表示方式。我可以在 2D 中绘制一个 2x2 pixels 正方形,并让它占据整个屏幕......因此,添加 1 将更改 1 unit,但生成的绘图可能完全没有变化 1 像素
    • 好的,谢谢。您是否知道在 2D 坐标处绘制这些顶点或将坐标转换为 2D 坐标的任何方法?顺便说一句,我非常感谢您的帮助。
    • 查看github.com/craftworkgames/MonoGame.Extended - 很多很酷的附加功能,包括 2D 相机和SpriteBatch 扩展(如SpriteBatch.DrawCircle() 等)。它是开源的,MIT 许可证,因此您可以使用它,适应您的需求等。
    • 谢谢,我去看看。祝你白天/晚上/晚上/早上/下午过得愉快!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 2017-07-01
    • 2023-03-26
    相关资源
    最近更新 更多