Java 如何在记忆中储存一张脸

Java 如何在记忆中储存一张脸,java,memory,opengl-es,3d,Java,Memory,Opengl Es,3d,我一直在试图解决这个问题,但找不到一种似乎合理的方法,而且似乎没有任何东西能真正解释它。我能找到无数关于如何做建模的东西,以及如何处理人脸的东西,但没有任何关于它们可以存储在记忆中与谁一起工作的东西。我主要关注的是obj,其余的很简单,主要是数组来存储所有的东西,但是面,我能想到的唯一处理它们的方法是存储对象中哪些顶点的细节,或者每次都从文件中读取它们,但这肯定不对吗?对每一张脸都使用一个物体似乎很疯狂,但我想不出任何其他方法! 哪怕只是一本书,或者任何能给我指出正确方向的东西,因为一切似乎都跳

我一直在试图解决这个问题,但找不到一种似乎合理的方法,而且似乎没有任何东西能真正解释它。我能找到无数关于如何做建模的东西,以及如何处理人脸的东西,但没有任何关于它们可以存储在记忆中与谁一起工作的东西。我主要关注的是obj,其余的很简单,主要是数组来存储所有的东西,但是面,我能想到的唯一处理它们的方法是存储对象中哪些顶点的细节,或者每次都从文件中读取它们,但这肯定不对吗?对每一张脸都使用一个物体似乎很疯狂,但我想不出任何其他方法!
哪怕只是一本书,或者任何能给我指出正确方向的东西,因为一切似乎都跳过了这些东西。谢谢。

一张脸通常有三个或三个以上的顶点相连。这意味着您可以将每个面存储为其包含的顶点列表(或顶点索引)

f0: [v0 v1 v2]
f1: [v3 v4 v5] 
...
或者,如果每个面的顶点数量是预先确定的(我打赌这是常见的),则可以将其折叠为单个列表/向量/数组:

[/* face 1 */ v0 v1 v2 /* face 2 */ v3 v4 v5]

一个面通常有三个或三个以上的顶点连接。这意味着您可以将每个面存储为其包含的顶点列表(或顶点索引)

f0: [v0 v1 v2]
f1: [v3 v4 v5] 
...
或者,如果每个面的顶点数量是预先确定的(我打赌这是常见的),则可以将其折叠为单个列表/向量/数组:

[/* face 1 */ v0 v1 v2 /* face 2 */ v3 v4 v5]

您要查找的是顶点数组。它的工作原理是每个对象包含一个顶点数组和一种颜色。顶点的法线存储在此同一数组中(顶点X、顶点Y、顶点Z、法线X、法线Y、法线Z)。当要渲染对象时,可以在对象数组中循环并渲染每个对象,如下所示:

float plane[] = {
    10, 10, 0, 0, 0, 1,
    -10, 10, 0, 0, 0, 1,
    -10, -10, 0, 0, 0, 1,
    10, 10, 0, 0, 0, 1,
    -10, 10, 0, 0, 0, 1,
    10, -10, 0, 0, 0, 1,
};

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);

glVertexPointer(3, GL_FLOAT, sizeof(plane[0])*6, &plane[0]);
glNormalPointer(3, GL_FLOAT, sizeof(plane[0])*6, &plane[3]);

glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
glDrawArrays(GL_TRIANGLES, 0, (sizeof(plane) / sizeof(plane[0]))/6);

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);

这应该画一个红色的平面。唯一的区别是您希望从对象定义将数组提供给它。您还可以包含每个顶点的颜色信息,只需在上述代码中包含一个GLCOLORPOINT和一个glEnableClientState(GL\U color\U数组)。

您要查找的是顶点数组。它的工作原理是每个对象包含一个顶点数组和一种颜色。顶点的法线存储在此同一数组中(顶点X、顶点Y、顶点Z、法线X、法线Y、法线Z)。当要渲染对象时,可以在对象数组中循环并渲染每个对象,如下所示:

float plane[] = {
    10, 10, 0, 0, 0, 1,
    -10, 10, 0, 0, 0, 1,
    -10, -10, 0, 0, 0, 1,
    10, 10, 0, 0, 0, 1,
    -10, 10, 0, 0, 0, 1,
    10, -10, 0, 0, 0, 1,
};

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);

glVertexPointer(3, GL_FLOAT, sizeof(plane[0])*6, &plane[0]);
glNormalPointer(3, GL_FLOAT, sizeof(plane[0])*6, &plane[3]);

glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
glDrawArrays(GL_TRIANGLES, 0, (sizeof(plane) / sizeof(plane[0]))/6);

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);

这应该画一个红色的平面。唯一的区别是您希望从对象定义将数组提供给它。您还可以包含每个顶点的颜色信息,只需在上面的代码中包含一个GLCOLOR指针和一个glEnableClientState(GL\U color\U数组)。

我得到了这个,它有更多额外的东西,它们也都有纹理和与它们相关的东西。除非我遗漏了一些东西,否则这些信息需要存储在每个人脸上?我想这取决于你的需要,但这些信息通常存储在顶点级别(至少在发送到硬件时)。如果可以快速查找属于某个面的顶点,则可以快速找到为某个面制作纹理所需的数据。@AaronM:我想我想说的是,所有信息都与顶点一起存储,或者存储在其他地方,但每个顶点都是独立的,不是每一张脸。我是怎么想的,这导致了同样的问题,只是把它从如何存储一张脸改为如何存储一个顶点。但是你的回答让我被动地意识到了一个愚蠢而明显的方法,所以谢谢你:)@AaronM:呵呵,没问题。你可以为每个顶点创建一个对象,或者如果你想压缩字节,我想你可以将其打包成字节块(可能类似于你将发送给OpenGL的内容)。你还可以维护多个数组,其中索引将表示顶点和数组不同类型的数据,尽管这听起来有点麻烦。我明白了,它有更多的额外材料,它们都有纹理和与之相关的材料。除非我遗漏了一些东西,否则这些信息需要存储在每个人脸上?我想这取决于你的需要,但这些信息通常存储在顶点级别(至少在发送到硬件时)。如果可以快速查找属于某个面的顶点,则可以快速找到为某个面制作纹理所需的数据。@AaronM:我想我想说的是,所有信息都与顶点一起存储,或者存储在其他地方,但每个顶点都是独立的,不是每一张脸。我是怎么想的,这导致了同样的问题,只是把它从如何存储一张脸改为如何存储一个顶点。但是你的回答让我被动地意识到了一个愚蠢而明显的方法,所以谢谢你:)@AaronM:呵呵,没问题。你可以为每个顶点创建一个对象,或者如果你想压缩字节,我想你可以将其打包成字节块(可能类似于你将发送给OpenGL的内容)。你还可以维护多个数组,其中索引将表示顶点,数组表示不同类型的数据,虽然这听起来有点麻烦,但问题不在于如何从文件中渲染某些内容,而是我一直在试图保存一张脸上的信息,而事实证明我不需要这样做。不过,谢谢:)问题不在于如何从文件中渲染某些内容,我一直在尝试保存一张脸上的信息,而事实证明我不需要这样做。不过谢谢你:)