2013-04-06 70 views
1

我有四個法線,我試圖通過添加x,y和z值進行平均,然後對結果進行歸一化。但是,當我添加不同的軸值時,結果矢量的長度爲零。我感覺這個問題很容易解決,但是我對OpenGL相對比較陌生,並且還不知道向量還是向量。平均法線結果爲零長度向量

分別獲取面和頂點法線的代碼。

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 2013-04-06 18:26:00

+0

Telthien說什麼。那些法線也是什麼樣的幾何? – datenwolf 2013-04-06 18:26:31

+0

@datenwolf它們來自三角形。 – caseif 2013-04-06 19:06:19

回答

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 2013-04-06 19:39:11

+0

@mproncace:給我一點我在幾個月前寫了一個詳細的StackOverflow答案,我現在正在尋找它。 – datenwolf 2013-04-06 19:41:39

+0

@mproncace:我希望你找到這個有用的:http://stackoverflow.com/a/6661242/524368 – datenwolf 2013-04-06 19:43:22