Làm thế nào để ánh xạ bình thường thực sự hoạt động?


10

Tôi đang cố gắng nắm bắt khái niệm về ánh xạ bình thường, nhưng tôi bị bối rối bởi một vài điều. Nói tóm lại, tôi không chắc liệu một bản đồ bình thường có phụ thuộc vào quan điểm hay không (tức là liệu bạn có nhận được một bản đồ bình thường khác của cùng một đối tượng khi bạn xoay quanh nó không). Thứ hai, tôi không hiểu tại sao màu xanh lam là màu chủ yếu trong các bản đồ bình thường.

Cách tôi nghĩ về các quy tắc và mối quan hệ của chúng với các màu RGB, như sau. Hình cầu đơn vị đại diện cho bất kỳ đơn vị bình thường nào có thể - nói cách khác, các thành phần X, Y và Z của một vectơ bình thường đơn vị từ -1 đến 1. Các thành phần của màu RGB đều nằm trong khoảng từ 0 đến 255. Do đó, nó có ý nghĩa để ánh xạ -1 (thành phần bình thường) thành 0 (thành phần màu), 0 đến 127 hoặc 128 và 1 đến 255. Mọi giá trị ở giữa chỉ là nội suy tuyến tính.

Áp dụng ánh xạ này cho các quy tắc thông thường của một đối tượng 3D tùy ý dẫn đến một bức tranh rất sặc sỡ, hoàn toàn không phải là màu xanh. Ví dụ, khi lấy một khối lập phương, tất cả sáu mặt sẽ có màu khác nhau, nhưng đồng nhất. Chẳng hạn, mặt có mặt bình thường (1,0,0) sẽ là (255,128,128), mặt có mặt bình thường (0,0, -1) sẽ là (128,128,0), v.v.

Tuy nhiên, vì một số lý do, các bản đồ bình thường của một khối lập phương tôi tìm thấy hoàn toàn có màu xanh lam, tức là (128,128,255). Nhưng rõ ràng, các quy tắc không phải là tất cả theo hướng z dương, tức là (0,0,1). Cái này hoạt động ra sao?

[Biên tập]

Ok, do đó, cách tiếp cận được mô tả ở trên dường như được gọi là bản đồ bình thường không gian đối tượng hoặc bản đồ bình thường trong không gian thế giới . Một cái khác được gọi là bản đồ không gian tiếp tuyến bình thường . Tôi hiểu làm thế nào một bản đồ bình thường không gian tiếp tuyến như vậy có thể được sử dụng để sửa đổi các quy tắc của hình học, nhưng tôi vẫn không hoàn toàn chắc chắn về cách nó thực sự được tính toán (xem nhận xét của tôi tại câu trả lời của Nicol Bolas).

[Chỉnh sửa 2]

Tôi có lẽ nên đề cập rằng tôi đang làm việc với các bề mặt tham số từng phần. Các bề mặt này bao gồm một tập hợp các miếng vá bề mặt , trong đó mỗi miếng vá được liên kết với không gian tham số riêng của nó (u, v) = [0,1] x [0,1]. Tại bất kỳ điểm nào trên bề mặt, bình thường có thể được tính toán chính xác. Rõ ràng, các vectơ T ( tiếp tuyến ) và B ( tiếp tuyến ) - được yêu cầu để vượt qua không gian tiếp tuyến - không chỉ đơn giản là các đạo hàm riêng của miếng vá bề mặt theo hướng u và v ...


Bạn đã bao giờ thử thực hiện phong hoặc ít nhất là khuếch tán bóng? Bạn có biết các công thức cơ bản như dấu chấm (a, b) = cos (góc (a, b)) cho các vectơ đơn vị a, b không? Vài giờ thực hiện sẽ giúp bạn tiết kiệm nhiều năm vật lộn.
Ivan Kuckir

@Ailurus: xem nhận xét / câu trả lời của tôi về cách tiếp cận vấn đề tương tự đối với các đối tượng địa hình / trường độ cao. Nó có một chút phức tạp hơn cho các đối tượng khác, nhưng các khái niệm không nên khác nhau.
teodron

Trường hợp cụ thể của bản đồ địa hình thông thường: gamedev.stackexchange.com/questions/43894/iêu
teodron

Câu trả lời:


14

Ánh xạ kết cấu là ánh xạ giữa các điểm trên bề mặt 3D và các điểm tương ứng của chúng trên hình ảnh kết cấu. Nếu bạn có ánh xạ kết cấu 1: 1, thì mọi điểm trên bề mặt 3D sẽ ánh xạ tới một điểm cụ thể và duy nhất trong hình ảnh kết cấu (mặc dù điều ngược lại không cần phải đúng. Một số vị trí trong kết cấu sẽ không nhất thiết phải ánh xạ tới các vị trí trên bề mặt).

Với ánh xạ như vậy, bạn có thể đi qua bề mặt 3D và lưu trữ từng bình thường riêng biệt ở vị trí tương ứng trong kết cấu.

Được rồi, chúng ta hãy làm điều đó. Chúng ta sẽ đi qua một bề mặt 3D và tạo các quy tắc không gian đối tượng các vị trí được ánh xạ và sau đó dán chúng vào kết cấu. Vì vậy, khi chúng ta muốn kết xuất, chúng ta chỉ cần lấy không gian đối tượng bình thường từ kết cấu và chúng ta đã hoàn thành. Đúng?

Vâng, điều đó sẽ làm việc. Nhưng nó cũng có nghĩa là các quy tắc của kết cấu chỉ có thể được sử dụng với đối tượng cụ thể đó. Và nó cũng có nghĩa là các quy tắc của kết cấu chỉ có thể được sử dụng với đối tượng đó và với ánh xạ kết cấu cụ thể đó . Vì vậy, nếu bạn muốn xoay bản đồ kết cấu theo một cách nào đó hoặc thay đổi nó bằng một số biến đổi UV, bạn sẽ không gặp may.

Vì vậy, nói chung, những gì mọi người sử dụng là bản đồ bình thường trong đó các quy tắc nằm trong "không gian tiếp tuyến". Không gian tiếp tuyến là không gian tương ứng với điểm được ánh xạ trên bề mặt 3D, trong đó điểm bình thường không thay đổi theo hướng + Z và trục X và Y dọc theo trục U và V so với bề mặt.

Tangent-space về cơ bản thường xuyên hóa các quy tắc. Trong không gian tiếp tuyến, bình thường (0, 0, 1) luôn có nghĩa là "không thay đổi"; đó là bình thường bạn nhận được từ nội suy đỉnh bình thường. Điều này dẫn đến một số điều hữu ích bạn có thể làm , một trong những điều quan trọng nhất là lưu trữ chúng trong ít dữ liệu hơn.

Vì Z sẽ luôn dương, do đó bạn có thể tính toán nó trong shader của mình từ các thành phần X và Y. Vì bạn chỉ cần 2 giá trị, do đó bạn có thể sử dụng (theo danh pháp định dạng hình ảnh OpenGL ) GL_RG8, định dạng 2 byte cho mỗi pixel chứ không phải là GL_RGBA84 byte cho mỗi pixel ( GL_RGB8vẫn sẽ là 4 byte cho mỗi pixel , vì GPU sẽ đệm mỗi pixel thành 4 byte). Thậm chí tốt hơn, bạn có thể nén hai giá trị đó , dẫn đến định dạng 1 byte cho mỗi pixel. Vì vậy, bạn đã giảm kích thước kết cấu của mình xuống 75% bản đồ thông thường trong không gian đối tượng.

Trước khi bạn có thể nói về bất kỳ loại bản đồ bình thường nào, trước tiên bạn cần biết những gì nó lưu trữ. Đây có phải là bản đồ bình thường không gian đối tượng, bản đồ bình thường không gian tiếp tuyến hay thứ gì khác không?


Được rồi, vậy loại bản đồ đầu tiên bạn mô tả là bản đồ bình thường không gian đối tượng , phải không? Đây là một màu sắc hơn, bởi vì nó lưu trữ các thành phần X, Y và Z thực sự của các quy tắc. Loại thứ hai, bản đồ bình thường không gian tiếp tuyến , dường như lưu trữ một cái gì đó giống như nhiễu loạn cho các quy tắc hơn là bản thân các quy tắc. Tôi sẽ đọc về khái niệm không gian tiếp tuyến và kiểm tra lại sau.
Ailurus

Ok, vì vậy không gian tiếp tuyến của một điểm trên bề mặt chỉ đơn giản là không gian của tất cả các vectơ tiếp tuyến của điểm đó. Tuy nhiên, trong trường hợp đó tôi không thấy làm thế nào bình thường khi nhìn từ không gian tiếp tuyến có thể là gì khác hơn (0,0,1)? Nói cách khác, tôi luôn mong muốn bản đồ bình thường có màu xanh đồng nhất (128.128.255). Tuy nhiên, ví dụ hiển thị trên trang wikipedia ( en.wikipedia.org/wiki/N normal_mapping#How_it_works ) có chứa các màu khác. Tôi không hiểu làm thế nào bản đồ này có thể được sử dụng để thay đổi các quy tắc, nhưng không phải là cách nó thực sự được tính toán.
Ailurus

@Ailurus: " Ok, vì vậy không gian tiếp tuyến của một điểm trên bề mặt chỉ đơn giản là không gian của tất cả các vectơ tiếp tuyến của điểm đó. " Không, không phải vậy. Đó là không gian được xác định bởi thông thường (không thay đổi) và hướng của tọa độ kết cấu tại điểm đó trên bề mặt. Nó thường xuyên lưu trữ bình thường trong kết cấu là tương đối với ánh xạ kết cấu và bình thường hiện tại trước khi sửa đổi.
Nicol Bolas

Có lẽ phần khó nhất về bản đồ bình thường là bản đồ (bao gồm cả cách tính các vectơ tiếp tuyến). Không phải là sự tính toán của các vectơ tiếp tuyến thực chất liên kết với ánh xạ UV / bao bọc của kết cấu khuếch tán VÀ với hình học của vật thể hoàn toàn sao? Nói cách khác: bạn có hai bản đồ bình thường khác nhau cho một đối tượng, nhưng chỉ có một trường tiếp tuyến (và bình thường) được tính toán. Bạn có thể thấy rằng bạn không thể sử dụng trường tiếp tuyến một cách nhất quán với hai kết cấu bình thường khác nhau (mặc dù về mặt hình học bạn có thể tìm thấy ánh xạ uv phù hợp, đây không phải là một nhiệm vụ tầm thường).
teodron

@NicolBolas Ah, tôi đã nhầm lẫn vì một số nguồn cho rằng các vectơ T, B và N tạo thành một cơ sở trực giao, trong khi những người khác đề cập rằng điều này không nhất thiết đúng.
Ailurus

3

Các bản đồ thông thường được ánh xạ bằng cách sử dụng cái gọi là không gian tiếp tuyến, về cơ bản là không gian cục bộ dựa trên không gian kết cấu của mô hình. Điều này sẽ trả lời cả hai câu hỏi của bạn.

Nó không phụ thuộc vào quan điểm vì không gian này không liên quan gì đến máy ảnh. Trong bản đồ bình thường, Z là hướng lên. Nếu bạn nhìn vào các quy tắc của một mô hình, hầu hết các vectơ bình thường sẽ được chỉ ra trực tiếp từ lưới. Bề mặt của lưới là không gian kết cấu mà tôi đang nói đến, vì vậy trong hệ tọa độ cục bộ đó, hướng lên là hướng "hướng ra ngoài".


Cảm ơn đã làm rõ điều này! Tuy nhiên, tôi không sử dụng lưới đa giác làm bề mặt, mà là bề mặt tham số mịn màng . Do đó, tất cả các quy tắc sẽ được lưu dưới dạng chỉ theo hướng (0,0,1), phải không?
Ailurus

1

Cuộn xuống trong trang này

Nhìn vào bản vẽ B / W bên tay phải trong bộ dữ liệu - đây là (hoặc ít nhất là được sử dụng) được gọi là bản vẽ hình con nhím, hiển thị một bề mặt với mỗi hình bình thường được vẽ

Vì vậy, để hiểu một bản đồ bình thường truyền thống, hãy nghĩ về một con nhím buồn bã với tất cả các gai của chúng mọc ra - mỗi gai đó là bình thường đối với bề mặt của con nhím bên dưới nó -

Đối với câu hỏi về hình cầu của bạn, nếu bạn sống hoàn toàn trong không gian tham số, như với các công cụ dò tia, thì tập hợp vô hạn cho hình cầu sẽ tạo ra một hình cầu lớn hơn - trong không gian được sắp xếp, tức là thế giới máy tính buộc chúng ta nếu chúng tôi muốn thời gian thực, sau đó bạn có một xấp xỉ hình cầu nhọn.

Bây giờ, ví dụ này tập trung vào một bản đồ thông thường ĐỐI TƯỢNG - nó xác định các quy tắc liên quan đến đối tượng và đây là bất biến dưới bất kỳ phép quay, dịch hoặc tỷ lệ nào - của đối tượng hoặc máy ảnh hoặc bất cứ điều gì khác - như đã đề cập trước đó, đây là chỉ có một loại bản đồ bình thường nhưng nó là phổ biến nhất


0

Tôi nghĩ rằng bạn có thể có một số quan niệm sai lầm về bản đồ bình thường là gì. Về cơ bản, đó là một cách mô phỏng vẻ ngoài của một cái gì đó gập ghềnh trong khi thực tế hình học hoàn toàn bằng phẳng.

Màu sắc của bản đồ bình thường được giải thích bởi một shader công nghệ và được xử lý dựa trên cường độ và hướng ánh sáng, cũng như chế độ xem camera của bạn. Điều này có nghĩa là bạn có thể có một sàn gạch chẳng hạn, hoàn toàn bằng phẳng, với kết cấu phẳng, nhưng vì nó có một bản đồ bình thường với hình dạng gạch giống nhau, khi bạn nhìn xung quanh nó, ánh sáng sẽ xuất hiện ở phía bên của những viên gạch làm cho nó trông giống 3D hơn nó.

Tất nhiên đây chỉ là ảo ảnh, nhưng nó rẻ hơn nhiều so với hình học phức tạp. Và không, màu sắc của bản đồ bình thường không thay đổi. Họ thực sự chỉ đại diện cho các giá trị để so sánh với trong shader. Tôi chắc rằng ai đó ở đây sẽ có thể điền vào bạn chi tiết hơn nhiều.


Tôi biết, nhưng dù sao cũng cảm ơn câu trả lời của bạn :)
Ailurus
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.