# Weird tiled effect with calculating Normals, TRIANGLE_STRIPS

This topic is 2018 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

## Recommended Posts




Hello all. I've made a height map program and i'm trying to calculate normals for each vertex. I've tried searching for a solution all morning but i can not figure out the error in my code. I am getting a weird tiled effect as you can see in the picture below.. I'm using triangle strips to render a 400 by 400 vertice plane. I have set all y values to 0 for this post. If anyone could help, and point out whats wrong, that would be awesome

http://imgur.com/ICeksXX

public void calculateNormals() {

for (int n = 0; n < 400*200; n++) {
float x1 = vBuffer.get(n + 0);
float y1 = vBuffer.get(n + 1);
float z1 = vBuffer.get(n + 2);

float x2 = vBuffer.get(n + 3);
float y2 = vBuffer.get(n + 4);
float z2 = vBuffer.get(n + 5);

float x3 = vBuffer.get(n + 6);
float y3 = vBuffer.get(n + 7);
float z3 = vBuffer.get(n + 8);

float Ux = (x2 - x1);
float Uy = (y2 - y1);
float Uz = (z2 - z1);

float Vx = (x3 - x1);
float Vy = (y3 - y1);
float Vz = (z3 - z1);

float Nx = Uy*Vz - Uz*Vy;
float Ny = Uz*Vx - Ux*Vz;
float Nz = Ux*Vy - Uy*Vx;

float normLength = (float)Math.sqrt(Math.pow(Nx,2) + Math.pow(Ny,2) + Math.pow(Nz,2));
if(normLength == 0){
Nx = 0;
Ny = 0;
Nz = 0;
}else{
Nx /= normLength;
Ny /= normLength;
Nz /= normLength;
}

if ((n %2)==0){

nBuffer.put(Nx).put(Ny).put(Nz);

}
else{

nBuffer.put(-Nx).put(-Ny).put(-Nz);

}

}

this.nBuffer.flip();
}


Edited by Ziath

##### Share on other sites

Shouldn't it be vBuffer.get(3*n+0), and so on?

##### Share on other sites

Shouldn't it be vBuffer.get(3*n+0), and so on?

I don't think so, each point needs to calculate its near points: p3-p1 p2-p1, right? so each time it runs, the normal calculation shifts up by one point.

Never mind. I need my coffee. haha. but why is it that it needs to be multiplied by 3?

                                                       // first set // second // third.. and so on
float x1 = vBuffer.get(n + 0); // 0 // 1 // 2
float y1 = vBuffer.get(n + 1); // 1 // 2 // 3
float z1 = vBuffer.get(n + 2); // 2 // 3 // 4

float x2 = vBuffer.get(n + 3); // 3 // 4 // 5
float y2 = vBuffer.get(n + 4); // 4 // 5 // 6
float z2 = vBuffer.get(n + 5); // 5 // 6 // 7

float x3 = vBuffer.get(n + 6); // 6 // 7 // 8
float y3 = vBuffer.get(n + 7); // 7 // 8 // 9
float z3 = vBuffer.get(n + 8); // 8 // 9 // 10

Edited by Ziath

##### Share on other sites

Your buffer does not index vertices, but individual components of the vertices. That is evident from the fact that you need to fetch each component by itself with consecutive indices. For that reason, the vertex n is not located at index n, but at index 3*n, 3*n+1 and 3*n+2.

edit: Look at it this way. If you add one to the indices in the code you posted, you will not end up with the vertices shifted one step. You will end up with the value of y1 in x1, x1 on y1, x2 in z1, and so on. To shift complete vertices, you need to shift x2 into x1, y2 into y1, and so on, and that is achieved by adding three to your indices, not by adding one.

Edited by Brother Bob

1. 1
2. 2
3. 3
Rutin
15
4. 4
khawk
13
5. 5
frob
12

• 9
• 9
• 11
• 11
• 23
• ### Forum Statistics

• Total Topics
633665
• Total Posts
3013247
×