有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用OpenGL 2.0 for Android绘制UV球体并为其设置纹理

我正在为安卓创建一个虚拟现实应用程序,我想在openGL中为我的目的生成一个球体。在第一步中,我找到了这个线程(Draw Sphere - order of vertices),在第一个答案中,有一个关于如何脱机渲染球体的好教程。在同一个答案中,有一个球体(http://pastebin.com/4esQdVPP)的示例代码,我在我的应用程序中使用了该代码,然后我成功地将2D纹理映射到球体上

然而,这个示例球体的分辨率很差,我想生成一个更好的球体,所以我继续按照一些blender教程生成球体,然后导出球体。obj文件,只需获取点坐标和索引,并将其解析为java代码

这样做的问题是,当添加纹理时,它在球体的极点看起来是破碎的,而在球体的其余部分看起来很好(请看下面的图片)。 Picture of south pole North Pole Front view

我不知道我做错了什么,因为映射纹理的算法应该是相同的,所以我猜问题可能在于生成的点的索引。这是我用来映射纹理的算法:https://en.wikipedia.org/wiki/UV_mapping#Finding_UV_on_a_sphere

这是最重要的。使用blender自动生成的obj文件:http://pastebin.com/uP3ndM2d

从这里,我们提取索引和坐标: 这是点索引:http://pastebin.com/rt1QjcaX

这是点坐标:http://pastebin.com/h1hGwNfx

你能给我一些建议吗?我做错什么了吗


共 (2) 个答案

  1. # 1 楼答案

    好了,问题现在解决了。纹理工作不正常,因为生成的点索引从1开始,而不是从0开始。通过在所有索引中减去1,问题就解决了……:)

  2. # 2 楼答案

    首先,需要小心地确定极点处(甚至附近)的纹理坐标。使用为极点的s坐标建议的UV算法不会为您提供所需的细分(例如,北极上的所有点都将使用s=0.5+arctan2(1,0)/(2*pi))。在下面的图像中,顶行的M+1顶点都代表北极的同一个顶点,每个顶点将具有相同的t-值,但纹理坐标必须具有不同的s-值:

    enter image description here

    其次,使用这种类型的细分将在极点附近产生混叠问题,因为相邻片段之间的小距离会在s值之间产生较大差异。您应该使用mipmap过滤器尽可能减少混叠。以下图像显示了地球的墨卡托投影和球体上的垂直红色条纹(条纹是一个很好的测试案例):

    enter image description hereenter image description hereenter image description here

    更好的球面细分是细分二十面体,这将产生几乎等边的三角形。下面是一个法线贴图球体的示例,可以避免这些别名问题:

    enter image description hereenter image description here