向量归一化

3 投票
1 回答
22102 浏览
提问于 2025-04-16 06:41

半向量的公式是 (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 个回答

22

这个名字起得不太对。你写的其实是两个向量的简单相加,最后得到的是一个标准化的单位向量。

我会这样做:

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

撰写回答