JAVA,使法线数组具有顶点数组的长度(来自已解析的 OBJ 文件)

JAVA, make normals array have length of vertices array (from parsed OBJ file)

我正在尝试重现 CSharp 应用程序的 OBJ 文件解析,该应用程序采用 obj 文件并使用其独特的内部结构(基于该 obj 文件)制作另一个文件,将其保存到具有唯一扩展名的文件中 - 它是不是那个 obj 文件的 1:1 副本:它只需要顶点、法线、uvs(如果有的话)和索引来制作它们的数组并用它制作几个不同的东西(这对我的问题根本不重要,但我是无论如何告诉它只是为了展示它的作用)。

我能够通过在我的 JAVA 应用程序中以二进制模式逐字节查看生成的文件(遍历它)并通过纯 try/guess 过程试图理解背后的逻辑来做到这一点我成功地模拟了它 - 我可以告诉你一个漫长的过程。

现在,我已经成功 "emulated" 我的 JAVA 应用程序中的那个应用程序行为现在能够从源 obj 文件生成那个特殊文件,唯一的例外是我不知何故不能了解一下。

在 OBJ 文件中有不同数量的顶点和法线(例如它可以有 266*3 个顶点,但只有 30*3 个法线)但是我试图模拟的 CSharp 应用程序在某种程度上能够制作这些顶点的法线长度,即两个数组具有相同的长度。而且我找不到该计算背后的任何逻辑!

首先,对于小的 OBJ 文件,我认为它只是获取那些法线值并将它们简单地复制到顶点数组的长度,当我有 5*3 个顶点和 3 个法线时,它以某种方式奇迹般地工作,但如果不是"unequal",也就是vertices.length/normals.length != int.

的时候

这两个 (vertices/normals) 之间是否存在某种相关性,使 CSharp 应用程序 "stretching/filling" 的法线数组长度与 vertices.length 的长度一致?

这些是两个 OBJ 文件作为示例(是的:这些正是我在 CSharp 程序中使用的那些 OBJ 文件,因此它们的结构是否以某种方式 "not right" 并不重要 - 它不是我的问题的优点,它对我问的问题没有影响)+我也不是想出让法线到顶点长度的想法的人,尽管它更短(谈论它们各自的数组),顺便说一句,这只是软件使用它生成的特殊文件的要求,所以我理解他为什么这样做——我只是想重现我无法理解的过程,原作者是如何在他的 CSharp 应用程序中制作它的,仅此而已,所以请不要告诉我这是荒谬的......是的,它可能是但它仍然需要顶点数组长度:

第一个(较短的一个 - vertices.length (v)/normals.length (vn) 总是等于某个整数)与我的上述伪技术一起工作(只是复制法线和直到它达到顶点数组的长度)

v 4.400000 -0.000000 0.400000
v 4.400000 0.960000 0.400000
v -0.400000 -0.000000 0.400000
v -0.400000 0.960000 0.400000
vt 0.998166 1.001956
vt 0.998167 0.002486
vt 0.003233 1.001956
vt 0.003233 0.002488
vn 0.0000 -0.0000 1.0000
s 1
f 1/1/1 2/2/1 3/3/1
f 2/2/1 4/4/1 3/3/1

另一方面,第二个(较长的 - vertices.length (v)/normals.length (vn) 总是等于一些浮点数)从未使用过该技术(因为它只需要int,而不是带小数的浮点数),这就是我绞尽脑汁想解决它的原因

v 4.400000 0.000000 -0.400000
v 4.400000 0.960000 -0.400000
v 4.400000 -0.000000 0.400000
v 4.400000 0.960000 0.400000
v -0.400000 -0.000000 0.400000
v -0.400000 0.960000 0.400000
v -0.400000 0.000000 -0.400000
v -0.400000 0.960000 -0.400000
v -0.400000 0.000000 -0.400000
v -0.400000 0.960000 -0.400000
v 4.400000 0.000000 -0.400000
v 4.400000 0.960000 -0.400000
v 4.400000 0.960000 0.400000
v 4.400000 0.960000 -0.400000
v -0.400000 0.960000 0.400000
v -0.400000 0.960000 -0.400000
v 4.400000 0.000000 -0.400000
v 4.250000 0.000000 -0.250000
v -0.400000 0.000000 -0.400000
v -0.250000 0.000000 -0.250000
v -0.400000 -0.000000 0.400000
v -0.250000 -0.000000 0.250000
v 4.400000 -0.000000 0.400000
v 4.250000 -0.000000 0.250000
v 4.250000 0.850000 -0.250000
v 4.250000 0.000000 -0.250000
v 4.250000 0.850000 0.250000
v 4.250000 -0.000000 0.250000
v 4.250000 0.850000 0.250000
v 4.250000 -0.000000 0.250000
v -0.250000 0.850000 0.250000
v -0.250000 -0.000000 0.250000
v -0.250000 0.850000 0.250000
v -0.250000 -0.000000 0.250000
v -0.250000 0.850000 -0.250000
v -0.250000 0.000000 -0.250000
v -0.250000 0.850000 -0.250000
v -0.250000 0.000000 -0.250000
v 4.250000 0.850000 -0.250000
v 4.250000 0.000000 -0.250000
v 4.250000 0.850000 -0.250000
v 4.250000 0.850000 0.250000
v -0.250000 0.850000 -0.250000
v -0.250000 0.850000 0.250000
v 4.212176 1.138000 -0.122500
v 4.212176 0.960000 -0.122500
v 4.122500 1.138000 -0.212176
v 4.122500 0.960000 -0.212176
v 4.000000 1.138000 -0.245000
v 4.000000 0.960000 -0.245000
v 3.877500 1.138000 -0.212176
v 3.877500 0.960000 -0.212176
v 3.787824 1.138000 -0.122500
v 3.787824 0.960000 -0.122500
v 3.755000 1.138000 -0.000000
v 3.755000 0.960000 -0.000000
v 3.787824 1.138000 0.122500
v 3.787824 0.960000 0.122500
v 3.877500 1.138000 0.212176
v 3.877500 0.960000 0.212176
v 4.000000 1.138000 0.245000
v 4.000000 0.960000 0.245000
v 4.122500 1.138000 0.212176
v 4.122500 0.960000 0.212176
v 4.212176 1.138000 0.122500
v 4.212176 0.960000 0.122500
v 4.245000 1.138000 0.000000
v 4.245000 0.960000 -0.000000
v 4.212176 1.138000 -0.122500
v 4.122500 1.138000 -0.212176
v 4.000000 1.138000 0.000000
v 4.000000 1.138000 -0.245000
v 3.877500 1.138000 -0.212176
v 3.787824 1.138000 -0.122500
v 3.755000 1.138000 -0.000000
v 3.787824 1.138000 0.122500
v 3.877500 1.138000 0.212176
v 4.000000 1.138000 0.245000
v 4.122500 1.138000 0.212176
v 4.212176 1.138000 0.122500
v 4.245000 1.138000 0.000000
v 3.412176 1.138000 -0.122500
v 3.412176 0.960000 -0.122500
v 3.322500 1.138000 -0.212176
v 3.322500 0.960000 -0.212176
v 3.200000 1.138000 -0.245000
v 3.200000 0.960000 -0.245000
v 3.077500 1.138000 -0.212176
v 3.077500 0.960000 -0.212176
v 2.987824 1.138000 -0.122500
v 2.987824 0.960000 -0.122500
v 2.955000 1.138000 -0.000000
v 2.955000 0.960000 -0.000000
v 2.987823 1.138000 0.122500
v 2.987823 0.960000 0.122500
v 3.077500 1.138000 0.212176
v 3.077500 0.960000 0.212176
v 3.200000 1.138000 0.245000
v 3.200000 0.960000 0.245000
v 3.322500 1.138000 0.212176
v 3.322500 0.960000 0.212176
v 3.412176 1.138000 0.122500
v 3.412176 0.960000 0.122500
v 3.445000 1.138000 0.000000
v 3.445000 0.960000 -0.000000
v 3.412176 1.138000 -0.122500
v 3.322500 1.138000 -0.212176
v 3.200000 1.138000 0.000000
v 3.200000 1.138000 -0.245000
v 3.077500 1.138000 -0.212176
v 2.987824 1.138000 -0.122500
v 2.955000 1.138000 -0.000000
v 2.987823 1.138000 0.122500
v 3.077500 1.138000 0.212176
v 3.200000 1.138000 0.245000
v 3.322500 1.138000 0.212176
v 3.412176 1.138000 0.122500
v 3.445000 1.138000 0.000000
v 2.612176 1.138000 -0.122500
v 2.612176 0.960000 -0.122500
v 2.522500 1.138000 -0.212176
v 2.522500 0.960000 -0.212176
v 2.400000 1.138000 -0.245000
v 2.400000 0.960000 -0.245000
v 2.277500 1.138000 -0.212176
v 2.277500 0.960000 -0.212176
v 2.187824 1.138000 -0.122500
v 2.187824 0.960000 -0.122500
v 2.155000 1.138000 -0.000000
v 2.155000 0.960000 -0.000000
v 2.187823 1.138000 0.122500
v 2.187823 0.960000 0.122500
v 2.277500 1.138000 0.212176
v 2.277500 0.960000 0.212176
v 2.400000 1.138000 0.245000
v 2.400000 0.960000 0.245000
v 2.522500 1.138000 0.212176
v 2.522500 0.960000 0.212176
v 2.612176 1.138000 0.122500
v 2.612176 0.960000 0.122500
v 2.645000 1.138000 0.000000
v 2.645000 0.960000 -0.000000
v 2.612176 1.138000 -0.122500
v 2.522500 1.138000 -0.212176
v 2.400000 1.138000 0.000000
v 2.400000 1.138000 -0.245000
v 2.277500 1.138000 -0.212176
v 2.187824 1.138000 -0.122500
v 2.155000 1.138000 -0.000000
v 2.187823 1.138000 0.122500
v 2.277500 1.138000 0.212176
v 2.400000 1.138000 0.245000
v 2.522500 1.138000 0.212176
v 2.612176 1.138000 0.122500
v 2.645000 1.138000 0.000000
v 1.812176 1.138000 -0.122500
v 1.812176 0.960000 -0.122500
v 1.722499 1.138000 -0.212176
v 1.722499 0.960000 -0.212176
v 1.599999 1.138000 -0.245000
v 1.599999 0.960000 -0.245000
v 1.477499 1.138000 -0.212176
v 1.477499 0.960000 -0.212176
v 1.387823 1.138000 -0.122500
v 1.387823 0.960000 -0.122500
v 1.354999 1.138000 -0.000000
v 1.354999 0.960000 -0.000000
v 1.387823 1.138000 0.122500
v 1.387823 0.960000 0.122500
v 1.477499 1.138000 0.212176
v 1.477499 0.960000 0.212176
v 1.599999 1.138000 0.245000
v 1.599999 0.960000 0.245000
v 1.722499 1.138000 0.212176
v 1.722499 0.960000 0.212176
v 1.812176 1.138000 0.122500
v 1.812176 0.960000 0.122500
v 1.844999 1.138000 0.000000
v 1.844999 0.960000 -0.000000
v 1.812176 1.138000 -0.122500
v 1.722499 1.138000 -0.212176
v 1.599999 1.138000 0.000000
v 1.599999 1.138000 -0.245000
v 1.477499 1.138000 -0.212176
v 1.387823 1.138000 -0.122500
v 1.354999 1.138000 -0.000000
v 1.387823 1.138000 0.122500
v 1.477499 1.138000 0.212176
v 1.599999 1.138000 0.245000
v 1.722499 1.138000 0.212176
v 1.812176 1.138000 0.122500
v 1.844999 1.138000 0.000000
v 1.012175 1.138000 -0.122500
v 1.012175 0.960000 -0.122500
v 0.922499 1.138000 -0.212176
v 0.922499 0.960000 -0.212176
v 0.799999 1.138000 -0.245000
v 0.799999 0.960000 -0.245000
v 0.677499 1.138000 -0.212176
v 0.677499 0.960000 -0.212176
v 0.587823 1.138000 -0.122500
v 0.587823 0.960000 -0.122500
v 0.554999 1.138000 -0.000000
v 0.554999 0.960000 -0.000000
v 0.587823 1.138000 0.122500
v 0.587823 0.960000 0.122500
v 0.677499 1.138000 0.212176
v 0.677499 0.960000 0.212176
v 0.799999 1.138000 0.245000
v 0.799999 0.960000 0.245000
v 0.922499 1.138000 0.212176
v 0.922499 0.960000 0.212176
v 1.012175 1.138000 0.122500
v 1.012175 0.960000 0.122500
v 1.044999 1.138000 0.000000
v 1.044999 0.960000 -0.000000
v 1.012175 1.138000 -0.122500
v 0.922499 1.138000 -0.212176
v 0.799999 1.138000 0.000000
v 0.799999 1.138000 -0.245000
v 0.677499 1.138000 -0.212176
v 0.587823 1.138000 -0.122500
v 0.554999 1.138000 -0.000000
v 0.587823 1.138000 0.122500
v 0.677499 1.138000 0.212176
v 0.799999 1.138000 0.245000
v 0.922499 1.138000 0.212176
v 1.012175 1.138000 0.122500
v 1.044999 1.138000 0.000000
v 0.212175 1.138000 -0.122500
v 0.212175 0.960000 -0.122500
v 0.122499 1.138000 -0.212176
v 0.122499 0.960000 -0.212176
v -0.000001 1.138000 -0.245000
v -0.000001 0.960000 -0.245000
v -0.122501 1.138000 -0.212176
v -0.122501 0.960000 -0.212176
v -0.212177 1.138000 -0.122500
v -0.212177 0.960000 -0.122500
v -0.245001 1.138000 -0.000000
v -0.245001 0.960000 -0.000000
v -0.212177 1.138000 0.122500
v -0.212177 0.960000 0.122500
v -0.122501 1.138000 0.212176
v -0.122501 0.960000 0.212176
v -0.000001 1.138000 0.245000
v -0.000001 0.960000 0.245000
v 0.122499 1.138000 0.212176
v 0.122499 0.960000 0.212176
v 0.212175 1.138000 0.122500
v 0.212175 0.960000 0.122500
v 0.244999 1.138000 0.000000
v 0.244999 0.960000 -0.000000
v 0.212175 1.138000 -0.122500
v 0.122499 1.138000 -0.212176
v -0.000001 1.138000 0.000000
v -0.000001 1.138000 -0.245000
v -0.122501 1.138000 -0.212176
v -0.212177 1.138000 -0.122500
v -0.245001 1.138000 -0.000000
v -0.212177 1.138000 0.122500
v -0.122501 1.138000 0.212176
v -0.000001 1.138000 0.245000
v 0.122499 1.138000 0.212176
v 0.212175 1.138000 0.122500
v 0.244999 1.138000 0.000000
vn 1.0000 0.0000 0.0000
vn -1.0000 0.0000 0.0000
vn -0.0000 0.0000 -1.0000
vn 0.0000 1.0000 0.0000
vn -0.0000 -1.0000 -0.0000
vn 0.0000 -0.0000 1.0000
vn 0.9071 -0.0000 -0.4210
vn 0.8181 -0.0000 -0.5751
vn 0.5751 -0.0000 -0.8181
vn 0.4210 -0.0000 -0.9071
vn 0.0890 0.0000 -0.9960
vn -0.0890 0.0000 -0.9960
vn -0.4210 0.0000 -0.9071
vn -0.5751 0.0000 -0.8181
vn -0.8181 0.0000 -0.5751
vn -0.9071 -0.0000 -0.4210
vn -0.9960 0.0000 -0.0890
vn -0.9960 -0.0000 0.0890
vn -0.9071 0.0000 0.4210
vn -0.8181 0.0000 0.5751
vn -0.5751 0.0000 0.8181
vn -0.4210 0.0000 0.9071
vn -0.0890 0.0000 0.9960
vn 0.0890 -0.0000 0.9960
vn 0.4210 -0.0000 0.9071
vn 0.5751 -0.0000 0.8181
vn 0.8181 -0.0000 0.5751
vn 0.9071 -0.0000 0.4210
vn 0.9960 -0.0000 0.0890
vn 0.9960 -0.0000 -0.0890
s 1
f 1//1 2//1 3//1
f 2//1 4//1 3//1
f 5//2 6//2 7//2
f 6//2 8//2 7//2
f 9//3 10//3 11//3
f 10//3 12//3 11//3
f 13//4 14//4 15//4
f 14//4 16//4 15//4
f 17//5 18//5 19//5
f 20//5 19//5 18//5
f 19//5 20//5 21//5
f 22//5 21//5 20//5
f 21//5 22//5 23//5
f 24//5 23//5 22//5
f 17//5 23//5 24//5
f 24//5 18//5 17//5
f 25//2 26//2 27//2
f 26//2 28//2 27//2
f 29//3 30//3 31//3
f 30//3 32//3 31//3
f 33//1 34//1 35//1
f 34//1 36//1 35//1
f 37//6 38//6 39//6
f 38//6 40//6 39//6
f 41//5 42//5 43//5
f 42//5 44//5 43//5
f 45//7 46//8 47//9
f 46//8 48//10 47//9
f 47//9 48//10 49//11
f 48//10 50//12 49//11
f 49//11 50//12 51//13
f 50//12 52//14 51//13
f 51//13 52//14 53//15
f 52//14 54//16 53//15
f 53//15 54//16 55//17
f 54//16 56//18 55//17
f 55//17 56//18 57//19
f 56//18 58//20 57//19
f 57//19 58//20 59//21
f 58//20 60//22 59//21
f 59//21 60//22 61//23
f 60//22 62//24 61//23
f 61//23 62//24 63//25
f 62//24 64//26 63//25
f 63//25 64//26 65//27
f 64//26 66//28 65//27
f 65//27 66//28 67//29
f 66//28 68//30 67//29
f 67//29 68//30 45//7
f 68//30 46//8 45//7
f 69//4 70//4 71//4
f 70//4 72//4 71//4
f 72//4 73//4 71//4
f 73//4 74//4 71//4
f 74//4 75//4 71//4
f 75//4 76//4 71//4
f 76//4 77//4 71//4
f 77//4 78//4 71//4
f 78//4 79//4 71//4
f 79//4 80//4 71//4
f 80//4 81//4 71//4
f 81//4 69//4 71//4
f 82//7 83//8 84//9
f 83//8 85//10 84//9
f 84//9 85//10 86//11
f 85//10 87//12 86//11
f 86//11 87//12 88//13
f 87//12 89//14 88//13
f 88//13 89//14 90//15
f 89//14 91//16 90//15
f 90//15 91//16 92//17
f 91//16 93//18 92//17
f 92//17 93//18 94//19
f 93//18 95//20 94//19
f 94//19 95//20 96//21
f 95//20 97//22 96//21
f 96//21 97//22 98//23
f 97//22 99//24 98//23
f 98//23 99//24 100//25
f 99//24 101//26 100//25
f 100//25 101//26 102//27
f 101//26 103//28 102//27
f 102//27 103//28 104//29
f 103//28 105//30 104//29
f 104//29 105//30 82//7
f 105//30 83//8 82//7
f 106//4 107//4 108//4
f 107//4 109//4 108//4
f 109//4 110//4 108//4
f 110//4 111//4 108//4
f 111//4 112//4 108//4
f 112//4 113//4 108//4
f 113//4 114//4 108//4
f 114//4 115//4 108//4
f 115//4 116//4 108//4
f 116//4 117//4 108//4
f 117//4 118//4 108//4
f 118//4 106//4 108//4
f 119//7 120//8 121//9
f 120//8 122//10 121//9
f 121//9 122//10 123//11
f 122//10 124//12 123//11
f 123//11 124//12 125//13
f 124//12 126//14 125//13
f 125//13 126//14 127//15
f 126//14 128//16 127//15
f 127//15 128//16 129//17
f 128//16 130//18 129//17
f 129//17 130//18 131//19
f 130//18 132//20 131//19
f 131//19 132//20 133//21
f 132//20 134//22 133//21
f 133//21 134//22 135//23
f 134//22 136//24 135//23
f 135//23 136//24 137//25
f 136//24 138//26 137//25
f 137//25 138//26 139//27
f 138//26 140//28 139//27
f 139//27 140//28 141//29
f 140//28 142//30 141//29
f 141//29 142//30 119//7
f 142//30 120//8 119//7
f 143//4 144//4 145//4
f 144//4 146//4 145//4
f 146//4 147//4 145//4
f 147//4 148//4 145//4
f 148//4 149//4 145//4
f 149//4 150//4 145//4
f 150//4 151//4 145//4
f 151//4 152//4 145//4
f 152//4 153//4 145//4
f 153//4 154//4 145//4
f 154//4 155//4 145//4
f 155//4 143//4 145//4
f 156//7 157//8 158//9
f 157//8 159//10 158//9
f 158//9 159//10 160//11
f 159//10 161//12 160//11
f 160//11 161//12 162//13
f 161//12 163//14 162//13
f 162//13 163//14 164//15
f 163//14 165//16 164//15
f 164//15 165//16 166//17
f 165//16 167//18 166//17
f 166//17 167//18 168//19
f 167//18 169//20 168//19
f 168//19 169//20 170//21
f 169//20 171//22 170//21
f 170//21 171//22 172//23
f 171//22 173//24 172//23
f 172//23 173//24 174//25
f 173//24 175//26 174//25
f 174//25 175//26 176//27
f 175//26 177//28 176//27
f 176//27 177//28 178//29
f 177//28 179//30 178//29
f 178//29 179//30 156//7
f 179//30 157//8 156//7
f 180//4 181//4 182//4
f 181//4 183//4 182//4
f 183//4 184//4 182//4
f 184//4 185//4 182//4
f 185//4 186//4 182//4
f 186//4 187//4 182//4
f 187//4 188//4 182//4
f 188//4 189//4 182//4
f 189//4 190//4 182//4
f 190//4 191//4 182//4
f 191//4 192//4 182//4
f 192//4 180//4 182//4
f 193//7 194//8 195//9
f 194//8 196//10 195//9
f 195//9 196//10 197//11
f 196//10 198//12 197//11
f 197//11 198//12 199//13
f 198//12 200//14 199//13
f 199//13 200//14 201//15
f 200//14 202//16 201//15
f 201//15 202//16 203//17
f 202//16 204//18 203//17
f 203//17 204//18 205//19
f 204//18 206//20 205//19
f 205//19 206//20 207//21
f 206//20 208//22 207//21
f 207//21 208//22 209//23
f 208//22 210//24 209//23
f 209//23 210//24 211//25
f 210//24 212//26 211//25
f 211//25 212//26 213//27
f 212//26 214//28 213//27
f 213//27 214//28 215//29
f 214//28 216//30 215//29
f 215//29 216//30 193//7
f 216//30 194//8 193//7
f 217//4 218//4 219//4
f 218//4 220//4 219//4
f 220//4 221//4 219//4
f 221//4 222//4 219//4
f 222//4 223//4 219//4
f 223//4 224//4 219//4
f 224//4 225//4 219//4
f 225//4 226//4 219//4
f 226//4 227//4 219//4
f 227//4 228//4 219//4
f 228//4 229//4 219//4
f 229//4 217//4 219//4
f 230//7 231//8 232//9
f 231//8 233//10 232//9
f 232//9 233//10 234//11
f 233//10 235//12 234//11
f 234//11 235//12 236//13
f 235//12 237//14 236//13
f 236//13 237//14 238//15
f 237//14 239//16 238//15
f 238//15 239//16 240//17
f 239//16 241//18 240//17
f 240//17 241//18 242//19
f 241//18 243//20 242//19
f 242//19 243//20 244//21
f 243//20 245//22 244//21
f 244//21 245//22 246//23
f 245//22 247//24 246//23
f 246//23 247//24 248//25
f 247//24 249//26 248//25
f 248//25 249//26 250//27
f 249//26 251//28 250//27
f 250//27 251//28 252//29
f 251//28 253//30 252//29
f 252//29 253//30 230//7
f 253//30 231//8 230//7
f 254//4 255//4 256//4
f 255//4 257//4 256//4
f 257//4 258//4 256//4
f 258//4 259//4 256//4
f 259//4 260//4 256//4
f 260//4 261//4 256//4
f 261//4 262//4 256//4
f 262//4 263//4 256//4
f 263//4 264//4 256//4
f 264//4 265//4 256//4
f 265//4 266//4 256//4
f 266//4 254//4 256//4

顺便说一下,数组是 float 和 int,具体来说:

int verticesLength = some-value-here;
int indicesLength = some-value-here;
float[] vertices = new float[verticesLength * 3];
float[] normals = new float[verticesLength * 3];
float[] uvs = new float[verticesLength * 2];
int[] indices = new int[indicesLength * 3];

我也在这里发布了第二个 obj 文件(较长的文件)为我试图模拟的 CSharp 应用程序生成的法线数组所做的输出 - 它很长但是如果你能注意到它是如何改变的法线数组(第 2 行)的长度为顶点数组的长度(不幸的是,这是使用该文件的应用程序需要满足的要求):

1.0 0.0 0.0 -0.0 -1.0 -0.0 1.0 0.0 0.0 0.0 1.0 0.0 1.0 0.0 0.0 -0.0 0.0 -1.0 -0.0 -1.0 -0.0 1.0 0.0 0.0 -0.0 0.0 -1.0 0.0 1.0 0.0 -1.0 0.0 0.0 -0.0 -1.0 -0.0 -0.0 -1.0 -0.0 -0.0 0.0 -1.0 1.0 0.0 0.0 0.0 -0.0 1.0 -1.0 0.0 0.0 0.0 1.0 0.0 -1.0 0.0 0.0 -0.0 0.0 -1.0 -0.0 -1.0 -0.0 -0.0 -1.0 -0.0 1.0 0.0 0.0 -1.0 0.0 0.0 -0.0 0.0 -1.0 0.0 1.0 0.0 -0.0 -1.0 -0.0 -1.0 0.0 0.0 -0.0 -1.0 -0.0 -1.0 0.0 0.0 -0.0 0.0 -1.0 0.0 -0.0 1.0 -1.0 0.0 0.0 -0.0 -1.0 -0.0 -1.0 0.0 0.0 -0.0 0.0 -1.0 0.0 -0.0 1.0 -0.0 -1.0 -0.0 -0.0 0.0 -1.0 1.0 0.0 0.0 0.0 -0.0 1.0 -0.0 -1.0 -0.0 1.0 0.0 0.0 -0.0 -1.0 -0.0 0.9071 -0.0 -0.421 0.8181 -0.0 -0.5751 0.5751 -0.0 -0.8181 0.421 -0.0 -0.9071 0.089 0.0 -0.996 -0.089 0.0 -0.996 -0.421 0.0 -0.9071 -0.5751 0.0 -0.8181 -0.8181 0.0 -0.5751 -0.9071 -0.0 -0.421 -0.996 0.0 -0.089 -0.996 -0.0 0.089 -0.9071 0.0 0.421 -0.8181 0.0 0.5751 -0.5751 0.0 0.8181 -0.421 0.0 0.9071 -0.089 0.0 0.996 0.089 -0.0 0.996 0.421 -0.0 0.9071 0.5751 -0.0 0.8181 0.8181 -0.0 0.5751 0.9071 -0.0 0.421 0.996 -0.0 0.089 0.996 -0.0 -0.089 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.9071 -0.0 -0.421 0.8181 -0.0 -0.5751 0.5751 -0.0 -0.8181 0.421 -0.0 -0.9071 0.089 0.0 -0.996 -0.089 0.0 -0.996 -0.421 0.0 -0.9071 -0.5751 0.0 -0.8181 -0.8181 0.0 -0.5751 -0.9071 -0.0 -0.421 -0.996 0.0 -0.089 -0.996 -0.0 0.089 -0.9071 0.0 0.421 -0.8181 0.0 0.5751 -0.5751 0.0 0.8181 -0.421 0.0 0.9071 -0.089 0.0 0.996 0.089 -0.0 0.996 0.421 -0.0 0.9071 0.5751 -0.0 0.8181 0.8181 -0.0 0.5751 0.9071 -0.0 0.421 0.996 -0.0 0.089 0.996 -0.0 -0.089 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.9071 -0.0 -0.421 0.8181 -0.0 -0.5751 0.5751 -0.0 -0.8181 0.421 -0.0 -0.9071 0.089 0.0 -0.996 -0.089 0.0 -0.996 -0.421 0.0 -0.9071 -0.5751 0.0 -0.8181 -0.8181 0.0 -0.5751 -0.9071 -0.0 -0.421 -0.996 0.0 -0.089 -0.996 -0.0 0.089 -0.9071 0.0 0.421 -0.8181 0.0 0.5751 -0.5751 0.0 0.8181 -0.421 0.0 0.9071 -0.089 0.0 0.996 0.089 -0.0 0.996 0.421 -0.0 0.9071 0.5751 -0.0 0.8181 0.8181 -0.0 0.5751 0.9071 -0.0 0.421 0.996 -0.0 0.089 0.996 -0.0 -0.089 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.9071 -0.0 -0.421 0.8181 -0.0 -0.5751 0.5751 -0.0 -0.8181 0.421 -0.0 -0.9071 0.089 0.0 -0.996 -0.089 0.0 -0.996 -0.421 0.0 -0.9071 -0.5751 0.0 -0.8181 -0.8181 0.0 -0.5751 -0.9071 -0.0 -0.421 -0.996 0.0 -0.089 -0.996 -0.0 0.089 -0.9071 0.0 0.421 -0.8181 0.0 0.5751 -0.5751 0.0 0.8181 -0.421 0.0 0.9071 -0.089 0.0 0.996 0.089 -0.0 0.996 0.421 -0.0 0.9071 0.5751 -0.0 0.8181 0.8181 -0.0 0.5751 0.9071 -0.0 0.421 0.996 -0.0 0.089 0.996 -0.0 -0.089 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.9071 -0.0 -0.421 0.8181 -0.0 -0.5751 0.5751 -0.0 -0.8181 0.421 -0.0 -0.9071 0.089 0.0 -0.996 -0.089 0.0 -0.996 -0.421 0.0 -0.9071 -0.5751 0.0 -0.8181 -0.8181 0.0 -0.5751 -0.9071 -0.0 -0.421 -0.996 0.0 -0.089 -0.996 -0.0 0.089 -0.9071 0.0 0.421 -0.8181 0.0 0.5751 -0.5751 0.0 0.8181 -0.421 0.0 0.9071 -0.089 0.0 0.996 0.089 -0.0 0.996 0.421 -0.0 0.9071 0.5751 -0.0 0.8181 0.8181 -0.0 0.5751 0.9071 -0.0 0.421 0.996 -0.0 0.089 0.996 -0.0 -0.089 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.9071 -0.0 -0.421 0.8181 -0.0 -0.5751 0.5751 -0.0 -0.8181 0.421 -0.0 -0.9071 0.089 0.0 -0.996 -0.089 0.0 -0.996 -0.421 0.0 -0.9071 -0.5751 0.0 -0.8181 -0.8181 0.0 -0.5751 -0.9071 -0.0 -0.421 -0.996 0.0 -0.089 -0.996 -0.0 0.089 -0.9071 0.0 0.421 -0.8181 0.0 0.5751 -0.5751 0.0 0.8181 -0.421 0.0 0.9071 -0.089 0.0 0.996 0.089 -0.0 0.996 0.421 -0.0 0.9071 0.5751 -0.0 0.8181 0.8181 -0.0 0.5751 0.9071 -0.0 0.421 0.996 -0.0 0.089 0.996 -0.0 -0.089 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0

更新: 所以我通过从索引部分 (f) 创建 v/vn 对列表取得了部分成功,我认为它基本上是顶点线 v 与法线线 vn 相关联,然后对列表进行排序,删除重复项,最后在顶点数组的长度中重新创建新的法线数组,所有这些都像这样,但它仍然有点 "off",无论如何:

//indicesPairs is CopyOnWriteArrayList<int[]> filled during obj file parsing
Collections.sort(indicesPairs, (o1, o2) -> {
    for (int i = 0; i < o1.length; i++) {
        if (o1[i] < o2[i]) {
            return -1;
        }
        if (o1[i] > o2[i]) {
            return 1;
        }
    }
    return 0;
});
CopyOnWriteArrayList<Float> normalsNew = new CopyOnWriteArrayList<>();
for (int i = 0; i < indicesPairs.size(); i++) {
    int normalsBlock = indicesPairs.get(i)[1] - 1;
    normalsNew.add(normals.get(normalsBlock * 3));
    normalsNew.add(normals.get(normalsBlock * 3) + 1);
    normalsNew.add(normals.get(normalsBlock * 3) + 2);
}

所以我想我现在需要的是对那些法线进行某种校正,这些法线现在会在应该有阴影的地方产生某种光线等等......但是如何做以及什么样的校正?

最后我自己解决了:经过大量测试,我发现我的问题的更新部分(最后)的部分解决方案实际上原则上是正确的,唯一的问题是我在选择正确的时候犯了错误数组的索引。

所以使顶点长度法线的最终解决方案是这样的(据了解需要在 OBJ 文件中定义一些法线并且 indices/faces "f" 需要两个顶点 "v" 和 f v//vn 形式的正常 "vn" 值,或者如果对象有 uvs 则 f v/vt/vn ...如果 f 只有一个值,例如 f some-integer-here 然后OBJ 文件应该已经定义了顶点的确切长度的法线,因此不需要执行此过程,因为它已经具有预期的长度(我的问题的这种情况的预期含义) - 如果没有,那么它很可能是 OBJ 文件本身有问题):

// "normals" is CopyOnWriteArrayList<Float> filled with actual normals defined in OBJ file
// "indicesPairs" is CopyOnWriteArrayList<int[]> filled during OBJ file parsing
// it takes "f v/vt/vn" or "f v//vn" and makes array of 1st & 3rd value "new int[]{v, vn}"
// both values are lowered by 1 as index starts at 0, not 1
// also any duplicate is removed so it has the right expected length: "vertices.length/3"
Collections.sort(indicesPairs, (o1, o2) -> {
    for (int i = 0; i < o1.length; i++) {
        if (o1[i] < o2[i]) {
            return -1;
        }
        if (o1[i] > o2[i]) {
            return 1;
        }
    }
    return 0;
});

for (int i = 0; i < indicesPairs.size(); i++) {

    int normalsBlock = indicesPairs.get(i)[1];

    float n1 = normals.get(normalsBlock * 3);
    float n2 = normals.get((normalsBlock * 3) + 1);
    float n3 = normals.get((normalsBlock * 3) + 2);

    normalsNew.add(n1);
    normalsNew.add(n2);
    normalsNew.add(n3);
}