- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试弄清楚如何在 XNA 中绘制图形,其他人提出了这个建议。但在我尝试使用这个之前...
如果我创建并使用此相机,并将 LEFT,TOP 设置为 0 且 WIDTH=256 和 HEIGHT=240,我渲染到屏幕上的任何内容都将使用这些坐标吗?那么一个宽度和高度为1的盒子,如果设置为0,0将会占用0,0到1,1的空间?
最佳答案
您引用的函数是:Matrix.CreateOrthographicOffCenter(left, right, bottom, top, zNearPlane, zFarPlane)
.
这将返回一个投影矩阵,可用于将世界空间中的点转换为投影空间中的点。
投影空间从视口(viewport)左下角的 (-1,-1) 到右上角的 (1,1)。这是 GPU 在光栅化时实际工作的坐标空间。
世界空间是你想要的任何东西。
假设您使用 Matrix.CreateOrthographicOffCenter(0, 256, 240, 0, -10, 10)
创建一个矩阵,然后您使用该矩阵作为 BasicEffect 的投影矩阵来绘制立方体模型。假设立方体模型以原点为中心,尺寸为 1(长、宽、高)。
以及 basicEffect.Projection
,您可以设置 basicEffect.View = Matrix.Identity
(因为我们不需要额外的相机转换)和 basicEffect.World = Matrix.CreateTranslation(0.5f, 0.5f, 0)
转换模型,使其存在于世界空间中的 (0,0) 到 (1,1) 之间。然后使用该 BasicEffect 绘制模型。
立方体的顶面(正交投影意味着没有透视)将绘制在视口(viewport)的左上角。它将占据视口(viewport)宽度的 1/256 和高度的 1/240(另请参见 GraphicsDevice.Viewport
)。
(PS:我不记得这种投影如何影响背面剔除。如果您没有看到任何内容,请尝试将其关闭或切换缠绕顺序。)
<小时/>现在,话虽如此 - 我从您的其他问题(以及您想要制作正交矩阵的事实)中了解到您想要进行 2D Sprite 工作。 BasicEffect 主要是为进行 3D 工作而设计的(尽管如果您制作自己的顶点着色器(不建议用于 Sprite ),您将需要一个投影矩阵)。
您可能想要使用 XNA 的 SpriteBatch - 尤其是因为它针对绘制 Sprite 进行了大量优化。 SpriteBatch.Begin
将采取 Matrix transformMatrix
作为一个论点。这相当于上面的世界和 View 矩阵,而不是投影矩阵。
SpriteBatch 假设您的世界空间与客户端空间相同(左上角是 (0,0),宽度和高度是视口(viewport)的大小)并为您处理投影。 (实际上它比这更高级 - 它会为您应用偏移量,以便 Sprite 像素与屏幕像素对齐。)
如果你想绘制 Sprite ,使世界在视口(viewport)中显示为 256 单位宽和 240 单位高,你可以将这样的矩阵传递给 SpriteBatch.Begin
:
Matrix.CreateScale(viewport.Width / 256f, viewport.Height / 240f, 1f)
值得注意的是,在新的 XNA 4.0 中您可以 use SpriteBatch to draw with custom vertex shaders因此您可以使用任意的世界观项目矩阵。
关于3d - 在 XNA 中使用 CreateOrthographicOffCenter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3018980/
我正在尝试弄清楚如何在 XNA 中绘制图形,其他人提出了这个建议。但在我尝试使用这个之前... 如果我创建并使用此相机,并将 LEFT,TOP 设置为 0 且 WIDTH=256 和 HEIGHT=2
我是一名优秀的程序员,十分优秀!