2013-04-06 3 views
1

x, y 및 z 값을 더한 다음 결과를 정규화하여 평균화하려고하는 4 개의 법선이 있습니다. 그러나 다른 축 값을 추가하면 결과 벡터의 길이는 0입니다. 나는이 문제가 매우 쉽게 해결되었다는 느낌을 갖지만, 나는 OpenGL에 비교적 익숙하지 않으며, 벡터가 아직 안팎으로 들어오는 것을 모르고있다.평균 법선 평균 길이가 0 인 벡터 결과

얼굴 및 정점 법선을 각각 얻는 코드입니다.

public Vector3f getNormal(Vector3f p1, Vector3f p2, Vector3f p3){ 
     Vector3f v = new Vector3f(); 

     Vector3f calU = new Vector3f(p2.x - p1.x, p2.y - p1.y, p2.z - p1.z); 
     Vector3f calV = new Vector3f(p3.x - p1.x, p3.y - p1.y, p3.z - p1.z); 

     v.setX(calU.getY() * calV.getZ() - calU.getZ() * calV.getY()); 
     v.setY(calU.getZ() * calV.getX() - calU.getX() * calV.getZ()); 
     v.setZ(calU.getX() * calV.getY() - calU.getY() * calV.getX()); 

     return (Vector3f)v.normalise(); 
    } 

    public Vector3f getVectorNormal(Vector3f p){ 
     Vector3f t1 = getNormal(p, new Vector3f(p.getX() - 1, p.getY(), p.getZ()), new Vector3f(p.getX(), p.getY(), p.getZ() - 1)); 
     Vector3f t2 = getNormal(p, new Vector3f(p.getX() + 1, p.getY(), p.getZ()), new Vector3f(p.getX(), p.getY(), p.getZ() - 1)); 
     Vector3f t3 = getNormal(p, new Vector3f(p.getX() + 1, p.getY(), p.getZ()), new Vector3f(p.getX(), p.getY(), p.getZ() + 1)); 
     Vector3f t4 = getNormal(p, new Vector3f(p.getX() - 1, p.getY(), p.getZ()), new Vector3f(p.getX(), p.getY(), p.getZ() + 1)); 

     float x = t1.getX() + t2.getX() + t3.getX() + t4.getX(); 
     float y = t1.getY() + t2.getY() + t3.getY() + t4.getY(); 
     float z = t1.getZ() + t2.getZ() + t3.getZ() + t4.getZ(); 

     Vector3f v = new Vector3f(x, y, z); 

     return (Vector3f)v.normalise(); 
    } 
+3

코드가 있습니까? – Zyerah

+0

Telthien이 말한 바. 또한 그 법선은 어떤 형태의 기하 구조입니까? – datenwolf

+0

@datenwolf 그들은 삼각형에서 왔습니다. – caseif

답변

1

이 감각

Vector3f t1 = getNormal(p, new Vector3f(p.getX() - 1, p.getY(), p.getZ()), new Vector3f(p.getX(), p.getY(), p.getZ() - 1)); 
    Vector3f t2 = getNormal(p, new Vector3f(p.getX() + 1, p.getY(), p.getZ()), new Vector3f(p.getX(), p.getY(), p.getZ() - 1)); 
    Vector3f t3 = getNormal(p, new Vector3f(p.getX() + 1, p.getY(), p.getZ()), new Vector3f(p.getX(), p.getY(), p.getZ() + 1)); 
    Vector3f t4 = getNormal(p, new Vector3f(p.getX() - 1, p.getY(), p.getZ()), new Vector3f(p.getX(), p.getY(), p.getZ() + 1)); 

당신은 하나의 지점에서 정상을 추출 할 수 없습니다하지 않습니다. 당신이 거기에 더하거나 뺄 때마다, 이것은 당신이하기로되어있는 것이 아닙니다.

UPDATE

난 당신이 대부분 여기 선형 대수의 기초로 strugling 것 같아요. 이것은 실제로 OpenGL에만 해당하는 것은 아닙니다. 이것은 수학입니다. 나는 주제에 대한 좋은 교과서를 움켜 쥐는 것보다 더 좋은 조언을 줄 수는 없지만, 잘 배워라.

+0

좋아, 각 버텍스의 법선은 어떻게해야합니까? – caseif

+0

@mproncace : 세부 사항 StackOverflow 답변 달 전에 이것을 적어 두었습니다. 지금 당장 그것을 찾고 있습니다. – datenwolf

+0

@mproncace : 당신이 유용하다고 생각하길 바랍니다. http://stackoverflow.com/a/6661242/524368 – datenwolf