Java 在模型上重复纹理
我正在做一个小游戏,你在迷宫里。迷宫以Java 在模型上重复纹理,java,opengl,3d,libgdx,Java,Opengl,3d,Libgdx,我正在做一个小游戏,你在迷宫里。迷宫以2D数组组织,描述x和z位置和块类型。因此它是基于平铺的。假设每个区块1 m³。现在我的角色是2m高,迷宫应该是4m高。因此,如果瓷砖上有墙,我会在每个砖上加4个砖。当然,在100*100meter/tile迷宫中,这会对性能产生巨大影响,即使使用视锥台和背面剔除。由于这是我的第一个3D游戏,我想保持它的简单,我不想使用先进的淘汰技术(八叉树或其他:P)。因此,我尝试创建1*4*1块,而不是1*1*1,并将它们作为墙添加到我的世界中。它工作得很好,性能再次完
2D数组组织
,描述x和z位置
和块类型
。因此它是基于平铺的
。假设每个区块1 m³
。现在我的角色是2m高,迷宫应该是4m高。因此,如果瓷砖上有墙,我会在每个砖上加4个砖。当然,在100*100
meter/tile迷宫中,这会对性能产生巨大影响,即使使用视锥台和背面剔除
。由于这是我的第一个3D游戏,我想保持它的简单,我不想使用先进的淘汰技术(八叉树或其他:P)。因此,我尝试创建1*4*1
块,而不是1*1*1
,并将它们作为墙添加到我的世界中。它工作得很好,性能再次完美(60 FPS),但是纹理(64*64px)
被拉长了,看起来真的很难看
因此,我的问题是:
是否可以每米重复一次纹理,而不是
拉伸它李>
或者我需要修改纹理使其具有4次吗
那么高李>
还是有更好的解决方案
EDIT:我发现Texture
s具有TextureWrap
模式。我将其设置为TextureWrap。重复,但我无法在纹理上设置UV
s。如果要从纹理创建精灵
,可以轻松将其设置为4,以重复纹理
4次。但是我不能在我的模型中添加精灵
,只能添加纹理
。是否有方法重复这些纹理
s?纹理应用于模型的方式取决于模型中每个顶点的UV值
如果你考虑立方体的一个平面,它是由4个顶点组成的矩形。如果顶点具有以下UV值:
(0,0)、(1,0)、(1,1)、(0,1)
,则整个纹理将在整个平面上渲染一次(如您现在所做的)
您需要的是将一些UV值更改为4而不是1-您应该使用类似(0,0)、(1,0)、(1,4)、(0,4)
-这样您的纹理将重复4次
不幸的是,我不知道如何在Libgdx中更改UV,也许其他人会在这里提供帮助
编辑评论中的问题:
您知道渲染的每个顶点都有自己的3D位置向量,由x、y、z
组件组成。这表示三维空间中的位置
如果你想添加纹理,你需要告诉你的顶点它在哪个纹理点。您可以定义一些表示纹理中某个点的2D向量(也可以使用3D纹理,但现在让我们继续使用2D示例)
纹理向量组件也可以命名为x,y
,但为了避免可能与位置数据混淆,有人决定将它们命名为u,v
(在数学中,这样做很常见,即使存储相同类型的数据,也会使某些方程式更易于阅读和理解)。这些向量简称为纹理坐标
或UVs
现在想象你的纹理在你面前,它的一个角在(0,0)
,另一个角在(1,1)
。取某个三角形的3个顶点,每个顶点取其UV,并在纹理上标记该点。然后,当连接所有3个点时,将得到与渲染相同的三角形
但是,如果您的一个UV组件大于1
或小于0
,该怎么办?为了简单起见,我们可以说GPU将采用相同的纹理,并在原始纹理之后复制它(它并不完全以这种方式工作,但结果是相同的)。这回答了您关于4
编号的问题-如果我们使用像(1,4)
这样的纹理坐标,这意味着我们将从原点移动4*纹理高度,因此您的纹理将重复4次
我认为,现在你应该找到一种方法,将UV添加到你的顶点,并尝试一下。尝试设置0、0.1、1、10等。。。作为你的纹理坐标,看看它给了你什么。通过这种方式,你应该对紫外线的工作原理有一些基本的了解。因为@kolenda的答案是正确的,但我没有找到任何方法来应用它们,我必须找到另一种方法。我现在使用的是ModelBuilder.createRect()
,我为每面墙在彼此上方创建了4个矩形。通过使用矩形,我可以只画可见的矩形,只需忽略被另一面墙占据的矩形。因此,如果一堵墙在另一堵墙的左边,我不会画它的左边,而画其他墙的右边。
问题是,当时有很多矩形,即使启用了平截头体剔除功能,如果我朝一个有很多矩形的方向看,FPS也会下降到20。
@xoppa告诉我,ModelBuilder
仅用于调试,我应该使用其他技术,但我不确定是哪种技术。因此,如果有人知道这一点,请将其作为Answare发布在这里,因为它回答了这个问题(而不是在模型上重复纹理,这样做…),它还解决了一些其他问题。
但目前这是我的解决方案,它对我来说已经足够好了,也许它可以帮助其他人。
但正如我所说,我喜欢看到其他更好的解决方案,因为我仍在学习一些3D编程的基础知识。如果有人在使用ModelBuilder.createRect方法时在更改UV时遇到问题,那么这可能会有所帮助:
...
Model rect = modelBuilder.createRect ...
Matrix3 mat = new Matrix3();
mat.scl(2);
rect.meshes.get(0).transformUV(mat);
instance = new ModelInstance(rect);
...
这样,您将获得2x2纹理重复。
(我浪费了一些时间寻找这个解决方案。我用它在大的地面上重复草地纹理)Thansk很多!我今晚就试试。也许我会发现如何改变它们。你能告诉我为什么把最后两个顶点的第二个参数改为4吗?为什么这会告诉纹理t