英文:
Vertex array to a float array
问题
我目前正在开发一个游戏引擎,被要求制作一个方法,该方法接受一个顶点数组并输出一个浮点数组。我们已经为Vector3创建了一个类。Vector3是包装了三个浮点数x、y和z的类。顶点只是一个包装了Vector3f的类。因此,如果有一个顶点数组,我该如何将它转换成浮点数组。以下是我目前的代码:
public static float[] VertexArrayToFloatArray(Vertex[] vertices){
float[] floats = new float[vertices.length * 3]; // 每个顶点需要三个浮点数
int i = 0;
for (Vertex v : vertices){
float x, y, z;
x = v.getPosition().getX();
y = v.getPosition().getY();
z = v.getPosition().getZ();
floats[i] = x;
floats[i + 1] = y;
floats[i + 2] = z;
i += 3; // 每次增加3以处理下一个顶点
}
return floats;
}
一个预期的输出示例是将顶点数组放入以创建一个正方形,例如:
Vertex[] vertices = new Vertex[]{
new Vertex(new Vector3f(0.5f,-0.5f,0)), //右下角
new Vertex(new Vector3f(-0.5f,0.5f,0)), //左上角
new Vertex(new Vector3f(0.5f,0.5f,0)), //右上角
new Vertex(new Vector3f(-0.5f,-0.5f,0)) //左下角
};
你将会得到结果:
{0.5f,-0.5f,0,-0.5f,0.5f,0,0.5f,0.5f,0 ,-0.5f,-0.5f,0}
英文:
I am currently developing a game engine, and was asked to make a method that takes in a vertex array and outputs a float array. We have a class made for Vector3. Vector3 is a wrapper for 3 floats, x,y and z. The vertex is just a wrapper for a Vector3f. So if their is a vertex array how can i turn it into a float array. This is what i have so far
public static float[] VertexArrayToFloatArray(Vertex[] vertices){
float[] floats = new float[vertices.length];
int i = 0;
for (Vertex v : vertices){
float x, y, z;
x = v.getPosition().getX();
y = v.getPosition().getY();
z = v.getPosition().getZ();
floats[i] = x;
floats[i + 1] = y;
floats[i + 2] = z;
}
System.out.println(floats);
return floats;
}
An expected output would be puting in a vertex array to make a square such as
Vertex[] vertices = new Vertex[]{
new Vertex(new Vector3f(0.5f,-0.5f,0)), //Bottom Right
new Vertex(new Vector3f(-0.5f,0.5f,0)), // Top Left
new Vertex(new Vector3f(0.5f,0.5f,0)), //Top Right
new Vertex(new Vector3f(-0.5f,-0.5f,0)) //Bottom Left
}
and you would get
{0.5f,-0.5f,0,-0.5f,0.5f,0,0.5f,0.5f,0 ,-0.5f,-0.5f,0}
as the result
答案1
得分: 1
- 在你的示例中,你正在创建一个数组,其大小与输入中顶点的数量相同,但由于每个顶点有3个浮点数,所以你想要创建一个大小是输入大小三倍的数组。
float[] floats = new float[vertices.length * 3];
- 然后你正确地使用了for循环,但你从未更改过索引
i
。
这意味着你只在索引0、1和2上进行赋值。
相反,你需要在每次循环时将i
增加3(你在i
,i+1
和i+2
上进行赋值)。
类似这样:
for (Vertex v : vertices) {
float x, y, z;
x = v.getPosition().getX();
y = v.getPosition().getY();
z = v.getPosition().getZ();
floats[i] = x;
floats[i + 1] = y;
floats[i + 2] = z;
i += 3;
}
或者你可以使用i++
,它将i
增加1,并在增加之前返回i
的值。
如果我们将这两个建议结合起来,就会得到:
public static float[] VertexArrayToFloatArray(Vertex[] vertices) {
float[] floats = new float[vertices.length * 3];
int i = 0;
for (Vertex v : vertices) {
float x, y, z;
x = v.getPosition().getX();
y = v.getPosition().getY();
z = v.getPosition().getZ();
floats[i] = x;
floats[i++] = y;
floats[i++] = z;
}
System.out.println(floats);
return floats;
}
英文:
1. In your example, you are creating an array with the size of the number of vertices from the input, but since every Vertex has 3 floats you want to create an array with triple the size of the input
float[] floats = new float[vertices.length*3];
2. Then you are correctly doing for loop but you are never changing the index i
.
That means that you are only overwriting index 0,1 and 2.
Instead of that, you need to increment the i
by 3 (You are adding on i
,i+1
, and i+2
) every loop
Something like this:
for (Vertex v : vertices){
float x, y, z;
x = v.getPosition().getX();
y = v.getPosition().getY();
z = v.getPosition().getZ();
floats[i] = x;
floats[i + 1] = y;
floats[i + 2] = z;
i+=3;
}
Or you can use i++
which increase i
by 1 and returns the value of i
BEFORE increasing
If we then combine those 2 advise we get
public static float[] VertexArrayToFloatArray(Vertex[] vertices){
float[] floats = new float[vertices.length*3];
int i = 0;
for (Vertex v : vertices){
float x, y, z;
x = v.getPosition().getX();
y = v.getPosition().getY();
z = v.getPosition().getZ();
floats[i] = x;
floats[i++] = y;
floats[i++] = z;
}
System.out.println(floats);
return floats;
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论