XNA: How can I draw only a “pizza slice” of my sprite?
我目前正在开发一个有关XNA(C#)中的基础结构构建和管理的游戏。
我目前试图实现的目标是使游戏在火车Rails之间绘制"弯曲"。我想通过仅绘制圆形纹理的特定部分来做到这一点。
换句话说,我只想绘制此纹理的"比萨饼切片"。需要绘制的圆的切片基于三个点:
- sprite的中心;
- 可变位置" a";
- 可变位置" b";
这三个点共同决定了我在屏幕上绘制了多少圆圈,例如披萨片有多大。
简单地说:如果我有一个圆并将其从中心切到点" a",然后又从中心切到点" b",我怎么能只画出我刚切过的部分出来了吗?
此切片必须实时更改,因此根据这两个位置" a"和" b",切片会变得越来越大。
达到此效果的最佳方法是什么?
这完全可以在着色器中通过相对简单的触发来完成。在您的像素着色器(效果)中尝试以下操作:
1 2 3 | float dX = b.x - a.x; float dY = b.y - a.y; float theta = Math.Atan2(dY, dX); |
请注意theta将以弧度为单位。然后只要检查theta是否在您的限制范围内即可。假设介于0和pi / 2之间。如果是,则对纹理进行采样;如果不是,则返回不带alpha(透明)的float4。那应该给您纹理的右上四分之一,其余的都被遮盖了。如果您想将theta转换为度数,也可以这样做,但是我建议保持弧度,因为这样会使您的数学变得容易得多。
您必须使用
设置限制
1 2 | effect.Parameters['thetamin']=/*minTheta*/; effect.Parameters['thetamax']=/*maxTheta*/; |
呼叫