• Create Account

Weird tiled effect with calculating Normals, TRIANGLE_STRIPS

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

3 replies to this topic

#1Ziath  Members

Posted 01 June 2013 - 08:38 PM




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, 01 June 2013 - 09:12 PM.

#2Brother Bob  Moderators

Posted 02 June 2013 - 04:02 AM

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

#3Ziath  Members

Posted 02 June 2013 - 08:25 AM

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, 02 June 2013 - 08:43 AM.

#4Brother Bob  Moderators

Posted 02 June 2013 - 09:21 AM

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, 02 June 2013 - 09:24 AM.

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.