2010-11-06 76 views
2

半向量的公式为(Hv)=(Lv + Vv)/ | Lv + Vv |,其中Lv是光向量,Vv是视向量。向量归一化

我在Python代码中正确使用它吗?

Vvx = 0-xi # view vector (calculating it from surface points) 
Vvy = 0-yi 
Vvz = 0-zi 
Vv = math.sqrt((Vvx * Vvx) + (Vvy * Vvy) + (Vvz * Vvz)) # normalizing 
Vvx = Vvx/Vv 
Vvy = Vvy/Vv 
Vvz = Vvz/Vv 
Lv = (1,1,1) # light vector 
Hn = math.sqrt(((1 + Vvx) * (1 + Vvx)) + ((1 + Vvy) * (1 + Vvy)) + 
       ((1 + Vvz) * (1 + Vvz))) 
Hv = ((1 + Vvx)/Hn, (1 + Vvy)/Hn, (1 + Vvz)/Hn) # half-way vector 
+1

您已经测试了吗? – 2010-11-06 20:06:01

回答

18

这是错误的。你写的是两个向量的简单向量加法,其结果是一个归一化的单位向量。

以下是我会做:

import math 

def magnitude(v): 
    return math.sqrt(sum(v[i]*v[i] for i in range(len(v)))) 

def add(u, v): 
    return [ u[i]+v[i] for i in range(len(u)) ] 

def sub(u, v): 
    return [ u[i]-v[i] for i in range(len(u)) ] 

def dot(u, v): 
    return sum(u[i]*v[i] for i in range(len(u))) 

def normalize(v): 
    vmag = magnitude(v) 
    return [ v[i]/vmag for i in range(len(v)) ] 

if __name__ == '__main__': 
    l = [1, 1, 1] 
    v = [0, 0, 0] 

    h = normalize(add(l, v)) 
    print h 
+0

你能告诉我怎么做吗? – user458858 2010-11-06 20:34:03

+0

VVX = 0-XI#视图矢量 Vvy = 0义 VVZ = 0滋 – user458858 2010-11-06 22:10:32

+0

如何在使用您的功能 – user458858 2010-11-06 22:11:05