np.ndarray 由 np.ndarray 索引


def compute_normal(vertices, faces):
    norm = np.zeros(vertices.shape,dtype=vertices.dtype)
    tris = 頂點[面]
    ##跳過其餘代碼##

其中 vertices 是形狀 (A,3) 的 np.ndarrayfacesnp.ndarray 的形狀為 (B,3),而 tris 的形狀為 (B,3,3)。 (順便說一句,B>A)

tris = vertices[faces] 實際上在做什麼?

也許這個例子對你有幫助:

將 numpy 導入為 np
np.random.seed(123)

vertices = np.random.rand(3, 3) # 形狀 -> (3, 3)
faces = np.random.randint(3, size=(4, 3)) # shape -> (4, 3)

打印(頂點)
# [[0.69646919 0.28613933 0.22685145]
# [0.55131477 0.71946897 0.42310646]
# [0.9807642 0.68482974 0.4809319]]

打印(面孔)
# [[1 0 2]
# [0 1 2]
# [1 0 0]
# [0 0 1]]

print(vertices[faces]) # 形狀 -> (4, 3, 3)
# [[[0.55131477 0.71946897 0.42310646] # faces==1 -> 取第二行頂點
# [0.69646919 0.28613933 0.22685145] # faces==0 -> 取第一行頂點
# [0.9807642 0.68482974 0.4809319 ]] # faces==2 -> 取第三行頂點

# [[0.69646919 0.28613933 0.22685145] # faces==0 -> 取第一行頂點
# [0.55131477 0.71946897 0.42310646] # faces==1 -> 取第二行頂點
# [0.9807642 0.68482974 0.4809319 ]] # faces==2 -> 取第三行頂點

# [[0.55131477 0.71946897 0.42310646] # faces==1 -> 取第二行頂點
# [0.69646919 0.28613933 0.22685145] # faces==0 -> 取第一行頂點
# [0.69646919 0.28613933 0.22685145]] # faces==0 -> 取第一行頂點

# [[0.69646919 0.28613933 0.22685145] # faces==0 -> 取第一行頂點
# [0.69646919 0.28613933 0.22685145] # faces==0 -> 取第一行頂點
# [0.55131477 0.71946897 0.42310646]]] # faces==1 -> 取第二行頂點