Weird tiled effect with calculating Normals, TRIANGLE_STRIPS

Started by
2 comments, last by Brother Bob 10 years, 11 months ago


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 tongue.png

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();
	}
	
Advertisement

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

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

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.

This topic is closed to new replies.

Advertisement