如果我制作一个非常简单的游戏,将玩家置于由两个三角形组成的方形墙壁的隧道中(我有),墙壁看起来有点无聊,甚至在某些角度会迷失方向。我正在考虑获取定义方形面板的数据,并通过在随机扰动 Z 值以获得墙壁深度之前进一步细分每个三角形来生成更有趣的纹理。
这两个三角形看起来像:
typedef struct {
float Position[3];
float Color[4];
float TexCoord[2];
float Normal[3];
} Vertex;
const Vertex Vertices[] = {
// Front
{{0, 0, 0}, {1, 0, 0, 1}, {1, 0}, {0, 0, 1}},
{{1, 0, 0}, {1, 0, 0, 1}, {1, 1}, {0, 0, 1}},
{{1, 1, 0}, {1, 0, 0, 1}, {0, 1}, {0, 0, 1}},
{{0, 1, 0}, {1, 0, 0, 1}, {0, 0}, {0, 0, 1}}
};
这个正方形被转换成任何必要的位置来制作墙壁、地板、天花板。
我可以在墙上贴上纹理,但是从侧面(扫射)看墙壁时,它显然是完全平坦的。现代硬件有三角形要燃烧,所以这就是我沿着这些思路思考的原因。
看起来像是递归算法的工作。但是有一个问题,当涉及到角落时,Z 值都必须回到零,否则面板将无法以 3D 平铺,玩家将看到不应出现的角落间隙。简单地将边缘 Z 值排除在随机过程之外可能看起来不太好 - 除非所有 Z 值仅由正值更改,可能会产生粗糙的石块效果?知道哪个面朝前显然很重要,因此这似乎是一种可行的解决方案。
你有没有做过这种程序生成,如果有的话,你是如何在墙壁上实现深度的,你是如何处理面板连接的?